[commit] r1199 - trunk/GME/Core
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Wed Mar 2 10:01:01 CST 2011
Author: ksmyth
Date: Wed Mar 2 10:01:01 2011
New Revision: 1199
Log:
Use vector::emplace_back to avoid a copy
Modified:
trunk/GME/Core/CoreBinFile.cpp
trunk/GME/Core/CoreBinFile.h
Modified: trunk/GME/Core/CoreBinFile.cpp
==============================================================================
--- trunk/GME/Core/CoreBinFile.cpp Fri Feb 25 17:01:41 2011 (r1198)
+++ trunk/GME/Core/CoreBinFile.cpp Wed Mar 2 10:01:01 2011 (r1199)
@@ -116,13 +116,17 @@
getMeAGuid( &l1.lVal, &l2.lVal, &l3.lVal, &l4.lVal);
// create BinAttrs of LONG type
- BinAttrUnion binattr1space;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattr1space = binattrs.back();
BinAttrBase* binattr1 = BinAttrBase::Create(binattr1space, VALTYPE_LONG);
- BinAttrUnion binattr2space;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattr2space = binattrs.back();
BinAttrBase* binattr2 = BinAttrBase::Create(binattr2space, VALTYPE_LONG);
- BinAttrUnion binattr3space;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattr3space = binattrs.back();
BinAttrBase* binattr3 = BinAttrBase::Create(binattr3space, VALTYPE_LONG);
- BinAttrUnion binattr4space;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattr4space = binattrs.back();
BinAttrBase* binattr4 = BinAttrBase::Create(binattr4space, VALTYPE_LONG);
@@ -138,13 +142,6 @@
binattr3->Set( p_bf, l3);
binattr4->Set( p_bf, l4);
- // insert the objects into the container
- // these objects will be destructed later
- // by BinObject::DestroyAttributes
- binattrs.push_back(std::move(binattr1space));
- binattrs.push_back(std::move(binattr1space));
- binattrs.push_back(std::move(binattr1space));
- binattrs.push_back(std::move(binattr1space));
}
// this method will create a status attribute for mga objects
@@ -152,7 +149,8 @@
void BinObject::CreateStatusAttribute( CCoreBinFile* p_bf)
{
// create BinAttr of LONG type
- BinAttrUnion binattrspace;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattrspace = binattrs.back();
BinAttrBase* binattr = BinAttrBase::Create(binattrspace, VALTYPE_LONG);
// fill the only public field
@@ -160,11 +158,6 @@
// set the value
binattr->Set( p_bf, CComVariant( 0L));
-
- // insert the objects into the container
- // these objects will be destructed later
- // by BinObject::DestroyAttributes
- binattrs.push_back(std::move(binattrspace));
}
void BinObject::CreateAttributes(ICoreMetaObject *metaobject)
@@ -192,15 +185,14 @@
attrid_type attrid = ATTRID_NONE;
COMTHROW( (*i)->get_AttrID(&attrid) );
- BinAttrUnion binattrspace;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattrspace = binattrs.back();
BinAttrBase *binattr = BinAttrBase::Create(binattrspace, valtype);
BinAttrBase::Create(binattrspace, valtype);
ASSERT( attrid != ATTRID_NONE );
binattr->attrid = attrid;
- binattrs.push_back(std::move(binattrspace));
-
++i;
}
}
@@ -279,7 +271,8 @@
if( valtype == VALTYPE_NONE )
break;
- BinAttrUnion binattrspace;
+ binattrs.emplace_back(ATTRID_NONE);
+ BinAttrUnion& binattrspace = binattrs.back();
BinAttrBase *binattr = BinAttrBase::Create(binattrspace, valtype);
ASSERT( binattr != NULL );
@@ -291,9 +284,6 @@
// Possible pitfall: binattr == &binattrspace. It is possible the compiler will figure this out, and call BinAttrUnion::Read() (which we don't want)
binattr->Read(binfile);
-
- // TODO: this move could be avoided
- binattrs.push_back(std::move(binattrspace));
}
ASSERT(binattrs.size() == num_attrs);
};
Modified: trunk/GME/Core/CoreBinFile.h
==============================================================================
--- trunk/GME/Core/CoreBinFile.h Fri Feb 25 17:01:41 2011 (r1198)
+++ trunk/GME/Core/CoreBinFile.h Wed Mar 2 10:01:01 2011 (r1199)
@@ -61,11 +61,11 @@
class CCoreBinFile;
// --------------------------- BinAttr
-
-class BinAttrBase
+class __declspec(novtable) BinAttrBase
{
public:
BinAttrBase() : attrid(ATTRID_NONE) { }
+ BinAttrBase(attrid_type attrid) : attrid(attrid) { }
virtual ~BinAttrBase() { }
attrid_type attrid;
@@ -83,6 +83,7 @@
{
public:
BinAttrUnion() { }
+ explicit BinAttrUnion(attrid_type attrid) : BinAttrBase(attrid) { }
virtual ~BinAttrUnion() { }
virtual valtype_type GetValType() const NOTHROW { DebugBreak(); return 0; }
@@ -105,9 +106,6 @@
BinAttrUnion(const BinAttrUnion& that) {
// FIXME
}
- BinAttrUnion& operator=(const BinAttrUnion&& that) {
- // FIXME
- }
// BinAttrUnion is guaranteed to have enough space to contain any BinAttr<*>
// (Ideally we'd do union { char [sizeof(BinAttrBase) - sizeof(BinAttr<*>) }, but that requires method definitions for BinAttr<*>::* to be separated from the declaration)
#ifdef _DEBUG
More information about the gme-commit
mailing list