ConfigVariableFilename::get_value() should return a concrete, not a reference

This commit is contained in:
David Rose 2012-02-06 23:18:49 +00:00
parent 53c9fd5086
commit 876956defb
2 changed files with 40 additions and 22 deletions

View File

@ -61,8 +61,8 @@ operator = (const Filename &value) {
// Description: Returns the variable's value as a Filename. // Description: Returns the variable's value as a Filename.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE ConfigVariableFilename:: INLINE ConfigVariableFilename::
operator const Filename & () const { operator const Filename &() const {
return get_value(); return get_ref_value();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -72,7 +72,7 @@ operator const Filename & () const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE const char *ConfigVariableFilename:: INLINE const char *ConfigVariableFilename::
c_str() const { c_str() const {
return get_value().c_str(); return get_ref_value().c_str();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -82,7 +82,7 @@ c_str() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE bool ConfigVariableFilename:: INLINE bool ConfigVariableFilename::
empty() const { empty() const {
return get_value().empty(); return get_ref_value().empty();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -92,7 +92,7 @@ empty() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE size_t ConfigVariableFilename:: INLINE size_t ConfigVariableFilename::
length() const { length() const {
return get_value().length(); return get_ref_value().length();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -102,7 +102,7 @@ length() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE char ConfigVariableFilename:: INLINE char ConfigVariableFilename::
operator [] (int n) const { operator [] (int n) const {
return get_value()[n]; return get_ref_value()[n];
} }
@ -116,7 +116,7 @@ operator [] (int n) const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE string ConfigVariableFilename:: INLINE string ConfigVariableFilename::
get_fullpath() const { get_fullpath() const {
return get_value().get_fullpath(); return get_ref_value().get_fullpath();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -128,7 +128,7 @@ get_fullpath() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE string ConfigVariableFilename:: INLINE string ConfigVariableFilename::
get_dirname() const { get_dirname() const {
return get_value().get_dirname(); return get_ref_value().get_dirname();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -140,7 +140,7 @@ get_dirname() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE string ConfigVariableFilename:: INLINE string ConfigVariableFilename::
get_basename() const { get_basename() const {
return get_value().get_basename(); return get_ref_value().get_basename();
} }
@ -152,7 +152,7 @@ get_basename() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE string ConfigVariableFilename:: INLINE string ConfigVariableFilename::
get_fullpath_wo_extension() const { get_fullpath_wo_extension() const {
return get_value().get_fullpath_wo_extension(); return get_ref_value().get_fullpath_wo_extension();
} }
@ -164,7 +164,7 @@ get_fullpath_wo_extension() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE string ConfigVariableFilename:: INLINE string ConfigVariableFilename::
get_basename_wo_extension() const { get_basename_wo_extension() const {
return get_value().get_basename_wo_extension(); return get_ref_value().get_basename_wo_extension();
} }
@ -177,7 +177,7 @@ get_basename_wo_extension() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE string ConfigVariableFilename:: INLINE string ConfigVariableFilename::
get_extension() const { get_extension() const {
return get_value().get_extension(); return get_ref_value().get_extension();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -187,7 +187,7 @@ get_extension() const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE bool ConfigVariableFilename:: INLINE bool ConfigVariableFilename::
operator == (const Filename &other) const { operator == (const Filename &other) const {
return get_value() == other; return get_ref_value() == other;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -197,7 +197,7 @@ operator == (const Filename &other) const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE bool ConfigVariableFilename:: INLINE bool ConfigVariableFilename::
operator != (const Filename &other) const { operator != (const Filename &other) const {
return get_value() != other; return get_ref_value() != other;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -207,7 +207,7 @@ operator != (const Filename &other) const {
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE bool ConfigVariableFilename:: INLINE bool ConfigVariableFilename::
operator < (const Filename &other) const { operator < (const Filename &other) const {
return get_value() < other; return get_ref_value() < other;
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -225,13 +225,13 @@ set_value(const Filename &value) {
// Access: Published // Access: Published
// Description: Returns the variable's value. // Description: Returns the variable's value.
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE const Filename &ConfigVariableFilename:: INLINE Filename ConfigVariableFilename::
get_value() const { get_value() const {
TAU_PROFILE("const Filename &ConfigVariableFilename::get_value() const", " ", TAU_USER); // This returns a concrete rather than a reference by design, to
if (!is_cache_valid(_local_modified)) { // avoid problems with scope. When we call this method from Python,
((ConfigVariableFilename *)this)->reload_cache(); // we'd like to be able to keep the Filename value around longer
} // than the lifetime of the config variable itself.
return _cache; return get_ref_value();
} }
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
@ -268,3 +268,20 @@ INLINE void ConfigVariableFilename::
set_word(int n, const Filename &value) { set_word(int n, const Filename &value) {
set_string_word(n, value); set_string_word(n, value);
} }
////////////////////////////////////////////////////////////////////
// Function: ConfigVariableFilename::get_ref_value
// Access: Private
// Description: Returns the variable's value, as a reference into the
// config variable itself. This is the internal method
// that implements get_value(), which returns a
// concrete.
////////////////////////////////////////////////////////////////////
INLINE const Filename &ConfigVariableFilename::
get_ref_value() const {
TAU_PROFILE("const Filename &ConfigVariableFilename::get_ref_value() const", " ", TAU_USER);
if (!is_cache_valid(_local_modified)) {
((ConfigVariableFilename *)this)->reload_cache();
}
return _cache;
}

View File

@ -56,7 +56,7 @@ PUBLISHED:
INLINE bool operator < (const Filename &other) const; INLINE bool operator < (const Filename &other) const;
INLINE void set_value(const Filename &value); INLINE void set_value(const Filename &value);
INLINE const Filename &get_value() const; INLINE Filename get_value() const;
INLINE Filename get_default_value() const; INLINE Filename get_default_value() const;
INLINE Filename get_word(int n) const; INLINE Filename get_word(int n) const;
@ -64,6 +64,7 @@ PUBLISHED:
private: private:
void reload_cache(); void reload_cache();
INLINE const Filename &get_ref_value() const;
private: private:
AtomicAdjust::Integer _local_modified; AtomicAdjust::Integer _local_modified;