From Chuck Seberino, "Here is a small optimization in osgDB/Serializer that only uses a single accessor call when retrieving serializable values during writing. This is a sizable win for some of my code since the getter() methods are non-trivial. I also removed some explicit namespace qualifiers to be consistent with the rest of the codebase."
This commit is contained in:
parent
0eded3efbe
commit
34fa992ff5
@ -229,15 +229,16 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
|
const P value = (object.*_getter)();
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << (object.*_getter)();
|
os << value;
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str());
|
os << PROPERTY((ParentType::_name).c_str());
|
||||||
if ( _useHex ) os << std::hex;
|
if ( _useHex ) os << std::hex;
|
||||||
os << (object.*_getter)();
|
os << value;
|
||||||
if ( _useHex ) os << std::dec;
|
if ( _useHex ) os << std::dec;
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
}
|
}
|
||||||
@ -286,13 +287,14 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
|
const CP value = (object.*_getter)();
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << (object.*_getter)();
|
os << value;
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str()) << (object.*_getter)() << std::endl;
|
os << PROPERTY((ParentType::_name).c_str()) << value << std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -335,13 +337,14 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
|
const osg::Matrix& value = (object.*_getter)();
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << (object.*_getter)();
|
os << value;
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str()) << (object.*_getter)() << std::endl;
|
os << PROPERTY((ParentType::_name).c_str()) << value << std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -398,13 +401,14 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
|
const P value = (object.*_getter)();
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << static_cast<GLenum>((object.*_getter)());
|
os << static_cast<GLenum>(value);
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str()) << GLENUM((object.*_getter)()) << std::endl;
|
os << PROPERTY((ParentType::_name).c_str()) << GLENUM(value) << std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -448,14 +452,15 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
|
const std::string& value = (object.*_getter)();
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << (object.*_getter)();
|
os << value;
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str());
|
os << PROPERTY((ParentType::_name).c_str());
|
||||||
os.writeWrappedString( (object.*_getter)() );
|
os.writeWrappedString( value );
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -510,19 +515,20 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
bool hasObject = ((object.*_getter)()!=NULL);
|
const P* value = (object.*_getter)();
|
||||||
|
bool hasObject = (value!=NULL);
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << hasObject;
|
os << hasObject;
|
||||||
os.writeObject( (object.*_getter)() );
|
os.writeObject( value );
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str()) << hasObject;
|
os << PROPERTY((ParentType::_name).c_str()) << hasObject;
|
||||||
if ( hasObject )
|
if ( hasObject )
|
||||||
{
|
{
|
||||||
os << BEGIN_BRACKET << std::endl;
|
os << BEGIN_BRACKET << std::endl;
|
||||||
os.writeObject( (object.*_getter)() );
|
os.writeObject( value );
|
||||||
os << END_BRACKET;
|
os << END_BRACKET;
|
||||||
}
|
}
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
@ -579,19 +585,20 @@ public:
|
|||||||
virtual bool write( OutputStream& os, const osg::Object& obj )
|
virtual bool write( OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
bool hasObject = ((object.*_getter)()!=NULL);
|
const P* value = (object.*_getter)();
|
||||||
|
bool hasObject = (value!=NULL);
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << hasObject;
|
os << hasObject;
|
||||||
os.writeImage( (object.*_getter)() );
|
os.writeImage( value );
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str()) << hasObject;
|
os << PROPERTY((ParentType::_name).c_str()) << hasObject;
|
||||||
if ( hasObject )
|
if ( hasObject )
|
||||||
{
|
{
|
||||||
os << BEGIN_BRACKET << std::endl;
|
os << BEGIN_BRACKET << std::endl;
|
||||||
os.writeImage( (object.*_getter)() );
|
os.writeImage( value );
|
||||||
os << END_BRACKET;
|
os << END_BRACKET;
|
||||||
}
|
}
|
||||||
os << std::endl;
|
os << std::endl;
|
||||||
@ -617,13 +624,13 @@ public:
|
|||||||
{ ParentType::_defaultValue = def; }
|
{ ParentType::_defaultValue = def; }
|
||||||
|
|
||||||
void add( const char* str, P value )
|
void add( const char* str, P value )
|
||||||
{ _lookup.add(str, static_cast<osgDB::IntLookup::Value>(value)); }
|
{ _lookup.add(str, static_cast<IntLookup::Value>(value)); }
|
||||||
|
|
||||||
P getValue( const char* str )
|
P getValue( const char* str )
|
||||||
{ return static_cast<P>(_lookup.getValue(str)); }
|
{ return static_cast<P>(_lookup.getValue(str)); }
|
||||||
|
|
||||||
const std::string& getString( P value )
|
const std::string& getString( P value )
|
||||||
{ return _lookup.getString(static_cast<osgDB::IntLookup::Value>(value)); }
|
{ return _lookup.getString(static_cast<IntLookup::Value>(value)); }
|
||||||
|
|
||||||
virtual bool read( InputStream& is, osg::Object& obj )
|
virtual bool read( InputStream& is, osg::Object& obj )
|
||||||
{
|
{
|
||||||
@ -646,13 +653,14 @@ public:
|
|||||||
virtual bool write( osgDB::OutputStream& os, const osg::Object& obj )
|
virtual bool write( osgDB::OutputStream& os, const osg::Object& obj )
|
||||||
{
|
{
|
||||||
const C& object = OBJECT_CAST<const C&>(obj);
|
const C& object = OBJECT_CAST<const C&>(obj);
|
||||||
|
const P value = (object.*_getter)();
|
||||||
if ( os.isBinary() )
|
if ( os.isBinary() )
|
||||||
{
|
{
|
||||||
os << (osgDB::IntLookup::Value)(object.*_getter)();
|
os << (IntLookup::Value)value;
|
||||||
}
|
}
|
||||||
else if ( ParentType::_defaultValue!=(object.*_getter)() )
|
else if ( ParentType::_defaultValue!=value )
|
||||||
{
|
{
|
||||||
os << PROPERTY((ParentType::_name).c_str()) << getString((object.*_getter)()) << std::endl;
|
os << PROPERTY((ParentType::_name).c_str()) << getString(value) << std::endl;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -672,7 +680,7 @@ public:
|
|||||||
typedef TemplateSerializer<P> ParentType;
|
typedef TemplateSerializer<P> ParentType;
|
||||||
typedef typename P::value_type ValueType;
|
typedef typename P::value_type ValueType;
|
||||||
typedef typename P::const_iterator ConstIterator;
|
typedef typename P::const_iterator ConstIterator;
|
||||||
typedef const P& (C::*Getter)() const;
|
typedef const P& (C::*Getter)() const;
|
||||||
typedef void (C::*Setter)( const P& );
|
typedef void (C::*Setter)( const P& );
|
||||||
|
|
||||||
ListSerializer( const char* name, Getter gf, Setter sf )
|
ListSerializer( const char* name, Getter gf, Setter sf )
|
||||||
@ -894,7 +902,6 @@ public:
|
|||||||
#define END_ENUM_SERIALIZER() \
|
#define END_ENUM_SERIALIZER() \
|
||||||
wrapper->addSerializer(serializer.get()); }
|
wrapper->addSerializer(serializer.get()); }
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user