[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