]> git.mxchange.org Git - simgear.git/commitdiff
Changed SGRawValue::DefaultValue to an inline function.
authorTim Moore <moore@blackbox.bricoworks.com>
Fri, 17 Jul 2009 09:40:36 +0000 (11:40 +0200)
committerTim Moore <moore@blackbox.bricoworks.com>
Fri, 17 Jul 2009 09:40:36 +0000 (11:40 +0200)
This avoids MSVC bugs in declaring templated specializations of static members.

simgear/props/props.cxx
simgear/props/props.hxx

index 9191d4fb16fc23c3f802b5b65126aed8c62eb20f..78a0c06ff1b0179a43b75a48d8012d44749dc646 100644 (file)
@@ -70,19 +70,7 @@ public:
 #define TEST_READ(dflt) if (!getAttribute(READ)) return dflt
 #define TEST_WRITE if (!getAttribute(WRITE)) return false
 \f
-////////////////////////////////////////////////////////////////////////
-// Default values for every type.
-////////////////////////////////////////////////////////////////////////
 
-template<> const bool SGRawValue<bool>::DefaultValue = false;
-template<> const int SGRawValue<int>::DefaultValue = 0;
-template<> const long SGRawValue<long>::DefaultValue = 0L;
-template<> const float SGRawValue<float>::DefaultValue = 0.0;
-template<> const double SGRawValue<double>::DefaultValue = 0.0L;
-template<> const char * const SGRawValue<const char *>::DefaultValue = "";
-template<> const SGVec3d SGRawValue<SGVec3d>::DefaultValue = SGVec3d();
-template<> const SGVec4d SGRawValue<SGVec4d>::DefaultValue = SGVec4d();
-\f
 ////////////////////////////////////////////////////////////////////////
 // Local path normalization code.
 ////////////////////////////////////////////////////////////////////////
@@ -507,19 +495,19 @@ SGPropertyNode::clearValue ()
     } else if (_type != NONE) {
         switch (_type) {
         case BOOL:
-            _local_val.bool_val = SGRawValue<bool>::DefaultValue;
+            _local_val.bool_val = SGRawValue<bool>::DefaultValue();
             break;
         case INT:
-            _local_val.int_val = SGRawValue<int>::DefaultValue;
+            _local_val.int_val = SGRawValue<int>::DefaultValue();
             break;
         case LONG:
-            _local_val.long_val = SGRawValue<long>::DefaultValue;
+            _local_val.long_val = SGRawValue<long>::DefaultValue();
             break;
         case FLOAT:
-            _local_val.float_val = SGRawValue<float>::DefaultValue;
+            _local_val.float_val = SGRawValue<float>::DefaultValue();
             break;
         case DOUBLE:
-            _local_val.double_val = SGRawValue<double>::DefaultValue;
+            _local_val.double_val = SGRawValue<double>::DefaultValue();
             break;
         case STRING:
         case UNSPECIFIED:
@@ -1042,7 +1030,7 @@ SGPropertyNode::getBoolValue () const
   if (getAttribute(TRACE_READ))
     trace_read();
   if (!getAttribute(READ))
-    return SGRawValue<bool>::DefaultValue;
+    return SGRawValue<bool>::DefaultValue();
   switch (_type) {
   case ALIAS:
     return _value.alias->getBoolValue();
@@ -1061,7 +1049,7 @@ SGPropertyNode::getBoolValue () const
     return (compare_strings(get_string(), "true") || getDoubleValue() != 0.0L);
   case NONE:
   default:
-    return SGRawValue<bool>::DefaultValue;
+    return SGRawValue<bool>::DefaultValue();
   }
 }
 
@@ -1075,7 +1063,7 @@ SGPropertyNode::getIntValue () const
   if (getAttribute(TRACE_READ))
     trace_read();
   if (!getAttribute(READ))
-    return SGRawValue<int>::DefaultValue;
+    return SGRawValue<int>::DefaultValue();
   switch (_type) {
   case ALIAS:
     return _value.alias->getIntValue();
@@ -1094,7 +1082,7 @@ SGPropertyNode::getIntValue () const
     return atoi(get_string());
   case NONE:
   default:
-    return SGRawValue<int>::DefaultValue;
+    return SGRawValue<int>::DefaultValue();
   }
 }
 
@@ -1108,7 +1096,7 @@ SGPropertyNode::getLongValue () const
   if (getAttribute(TRACE_READ))
     trace_read();
   if (!getAttribute(READ))
-    return SGRawValue<long>::DefaultValue;
+    return SGRawValue<long>::DefaultValue();
   switch (_type) {
   case ALIAS:
     return _value.alias->getLongValue();
@@ -1127,7 +1115,7 @@ SGPropertyNode::getLongValue () const
     return strtol(get_string(), 0, 0);
   case NONE:
   default:
-    return SGRawValue<long>::DefaultValue;
+    return SGRawValue<long>::DefaultValue();
   }
 }
 
@@ -1141,7 +1129,7 @@ SGPropertyNode::getFloatValue () const
   if (getAttribute(TRACE_READ))
     trace_read();
   if (!getAttribute(READ))
-    return SGRawValue<float>::DefaultValue;
+    return SGRawValue<float>::DefaultValue();
   switch (_type) {
   case ALIAS:
     return _value.alias->getFloatValue();
@@ -1160,7 +1148,7 @@ SGPropertyNode::getFloatValue () const
     return atof(get_string());
   case NONE:
   default:
-    return SGRawValue<float>::DefaultValue;
+    return SGRawValue<float>::DefaultValue();
   }
 }
 
@@ -1174,7 +1162,7 @@ SGPropertyNode::getDoubleValue () const
   if (getAttribute(TRACE_READ))
     trace_read();
   if (!getAttribute(READ))
-    return SGRawValue<double>::DefaultValue;
+    return SGRawValue<double>::DefaultValue();
 
   switch (_type) {
   case ALIAS:
@@ -1194,7 +1182,7 @@ SGPropertyNode::getDoubleValue () const
     return strtod(get_string(), 0);
   case NONE:
   default:
-    return SGRawValue<double>::DefaultValue;
+    return SGRawValue<double>::DefaultValue();
   }
 }
 
@@ -1208,7 +1196,7 @@ SGPropertyNode::getStringValue () const
   if (getAttribute(TRACE_READ))
     trace_read();
   if (!getAttribute(READ))
-    return SGRawValue<const char *>::DefaultValue;
+    return SGRawValue<const char *>::DefaultValue();
   return make_string();
 }
 
index dc7a5878c4c1cf4ecea46b9ac6f7a740efded892..b5bf8a2d882f2203b43a513b47ae0715a0498934 100644 (file)
@@ -312,7 +312,10 @@ public:
    * may need different kinds of default values (such as epoch for a
    * date type).  The default value is used when creating new values.
    */
-  static const T DefaultValue; // Default for this kind of raw value.
+  static T DefaultValue()
+  {
+    return T();
+  }
 
 
   /**
@@ -368,14 +371,15 @@ public:
 // Default values for every type.
 ////////////////////////////////////////////////////////////////////////
 
-template<> const bool SGRawValue<bool>::DefaultValue;
-template<> const int SGRawValue<int>::DefaultValue;
-template<> const long SGRawValue<long>::DefaultValue;
-template<> const float SGRawValue<float>::DefaultValue;
-template<> const double SGRawValue<double>::DefaultValue;
-template<> const char * const SGRawValue<const char *>::DefaultValue;
-template<> const SGVec3d SGRawValue<SGVec3d>::DefaultValue;
-template<> const SGVec4d SGRawValue<SGVec4d>::DefaultValue;
+template<> inline bool SGRawValue<bool>::DefaultValue()
+{
+  return false;
+}
+
+template<> inline const char * SGRawValue<const char *>::DefaultValue()
+{
+  return "";
+}
 
 /**
  * A raw value bound to a pointer.
@@ -486,7 +490,7 @@ public:
    */
   virtual T getValue () const {
     if (_getter) return (*_getter)();
-    else return SGRawValue<T>::DefaultValue;
+    else return SGRawValue<T>::DefaultValue();
   }
 
   /**
@@ -535,7 +539,7 @@ public:
   virtual ~SGRawValueFunctionsIndexed () {}
   virtual T getValue () const {
     if (_getter) return (*_getter)(_index);
-    else return SGRawValue<T>::DefaultValue;
+    else return SGRawValue<T>::DefaultValue();
   }
   virtual bool setValue (T value) {
     if (_setter) { (*_setter)(_index, value); return true; }
@@ -568,7 +572,7 @@ public:
   virtual ~SGRawValueMethods () {}
   virtual T getValue () const {
     if (_getter) { return (_obj.*_getter)(); }
-    else { return SGRawValue<T>::DefaultValue; }
+    else { return SGRawValue<T>::DefaultValue(); }
   }
   virtual bool setValue (T value) {
     if (_setter) { (_obj.*_setter)(value); return true; }
@@ -602,7 +606,7 @@ public:
   virtual ~SGRawValueMethodsIndexed () {}
   virtual T getValue () const {
     if (_getter) { return (_obj.*_getter)(_index); }
-    else { return SGRawValue<T>::DefaultValue; }
+    else { return SGRawValue<T>::DefaultValue(); }
   }
   virtual bool setValue (T value) {
     if (_setter) { (_obj.*_setter)(_index, value); return true; }
@@ -1816,7 +1820,7 @@ bool SGPropertyNode::tie(const SGRawValue<T> &rawValue, bool useDefault)
         return false;
 
     useDefault = useDefault && hasValue();
-    T old_val = SGRawValue<T>::DefaultValue;
+    T old_val = SGRawValue<T>::DefaultValue();
     if (useDefault)
         old_val = getValue<T>(this);
     clearValue();
@@ -1847,7 +1851,7 @@ T SGPropertyNode::getValue(typename boost::disable_if_c<simgear::props
     if (getAttribute(TRACE_READ))
         trace_read();
     if (!getAttribute(READ))
-        return SGRawValue<T>::DefaultValue;
+      return SGRawValue<T>::DefaultValue();
     switch (_type) {
     case EXTENDED:
         if (_value.val->getType() == PropertyTraits<T>::type_tag)
@@ -1858,7 +1862,7 @@ T SGPropertyNode::getValue(typename boost::disable_if_c<simgear::props
         return simgear::parseString<T>(make_string());
         break;
     }
-    return SGRawValue<T>::DefaultValue;
+    return SGRawValue<T>::DefaultValue();
 }
 
 template<typename T>