Merge pull request #479 from LaurensVoerman/submit_vc14WarnC4800_v2

move Get/SetScalarvalue out of ValueObject and provide specialization…
This commit is contained in:
OpenSceneGraph git repository 2018-02-19 10:14:36 +00:00 committed by GitHub
commit 56baa7bf04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -58,6 +58,11 @@ class Plane;
class Matrixf;
class Matrixd;
template<typename T>
class GetScalarValue;
template<typename T>
class SetScalarValue;
class ValueObject : public Object
{
public:
@ -134,28 +139,6 @@ class ValueObject : public Object
};
template<typename T>
class GetScalarValue : public ValueObject::GetValueVisitor
{
public:
GetScalarValue() : set(false), value(0) {}
bool set;
T value;
virtual void apply(bool in_value) { value = in_value ? 1 : 0; set = true; }
virtual void apply(char in_value) { value = in_value; set = true; }
virtual void apply(unsigned char in_value) { value = in_value; set = true; }
virtual void apply(short in_value) { value = in_value; set = true; }
virtual void apply(unsigned short in_value) { value = in_value; set = true; }
virtual void apply(int in_value) { value = in_value; set = true; }
virtual void apply(unsigned int in_value) { value = in_value; set = true; }
virtual void apply(float in_value) { value = in_value; set = true; }
virtual void apply(double in_value) { value = in_value; set = true; }
};
class SetValueVisitor
{
public:
@ -213,6 +196,59 @@ class ValueObject : public Object
virtual void apply(osg::BoundingSphered& /*in_value*/) {}
};
virtual bool get(GetValueVisitor& /*gvv*/) const { return false; }
virtual bool set(SetValueVisitor& /*gvv*/) { return false; }
template<typename T>
bool getScalarValue(T& value) { GetScalarValue<T> gsv; if (get(gsv) && gsv.set) { value = gsv.value; return true; } else return false; }
template<typename T>
bool setScalarValue(T value) { SetScalarValue<T> ssv(value); return set(ssv) && ssv.set; }
protected:
virtual ~ValueObject() {}
};
template<typename T>
class GetScalarValue : public ValueObject::GetValueVisitor
{
public:
GetScalarValue() : set(false), value(0) {}
bool set;
T value;
virtual void apply(bool in_value) { value = in_value ? 1 : 0; set = true; }
virtual void apply(char in_value) { value = in_value; set = true; }
virtual void apply(unsigned char in_value) { value = in_value; set = true; }
virtual void apply(short in_value) { value = in_value; set = true; }
virtual void apply(unsigned short in_value) { value = in_value; set = true; }
virtual void apply(int in_value) { value = in_value; set = true; }
virtual void apply(unsigned int in_value) { value = in_value; set = true; }
virtual void apply(float in_value) { value = in_value; set = true; }
virtual void apply(double in_value) { value = in_value; set = true; }
};
template<>
class GetScalarValue <bool> : public ValueObject::GetValueVisitor
{
public:
GetScalarValue() : set(false), value(0) {}
bool set;
bool value;
virtual void apply(bool in_value) { value = in_value; set = true; }
virtual void apply(char in_value) { value = in_value != 0; set = true; }
virtual void apply(unsigned char in_value) { value = in_value != 0; set = true; }
virtual void apply(short in_value) { value = in_value != 0; set = true; }
virtual void apply(unsigned short in_value) { value = in_value != 0; set = true; }
virtual void apply(int in_value) { value = in_value != 0; set = true; }
virtual void apply(unsigned int in_value) { value = in_value != 0; set = true; }
virtual void apply(float in_value) { value = in_value != 0.0f; set = true; }
virtual void apply(double in_value) { value = in_value != 0.0; set = true; }
};
template<typename T>
class SetScalarValue : public ValueObject::SetValueVisitor
@ -235,19 +271,6 @@ class ValueObject : public Object
virtual void apply(double& in_value) { in_value=value; set = true;}
};
virtual bool get(GetValueVisitor& /*gvv*/) const { return false; }
virtual bool set(SetValueVisitor& /*gvv*/) { return false; }
template<typename T>
bool getScalarValue(T& value) { GetScalarValue<T> gsv; if (get(gsv) && gsv.set) { value = gsv.value; return true; } else return false; }
template<typename T>
bool setScalarValue(T value) { SetScalarValue<T> ssv(value); return set(ssv) && ssv.set; }
protected:
virtual ~ValueObject() {}
};
template< typename T >
struct ValueObjectClassNameTrait
{