[commit] r1228 - trunk/GME/Core
GMESRC Repository Notifications
gme-commit at list.isis.vanderbilt.edu
Wed Mar 30 14:26:48 CDT 2011
Author: ksmyth
Date: Wed Mar 30 14:26:48 2011
New Revision: 1228
Log:
Refactor BinAttrUnion to use move constructors.
Modified:
trunk/GME/Core/CoreBinFile.h
Modified: trunk/GME/Core/CoreBinFile.h
==============================================================================
--- trunk/GME/Core/CoreBinFile.h Wed Mar 30 14:24:32 2011 (r1227)
+++ trunk/GME/Core/CoreBinFile.h Wed Mar 30 14:26:48 2011 (r1228)
@@ -59,6 +59,7 @@
};
class CCoreBinFile;
+class BinAttrUnion;
// --------------------------- BinAttr
class __declspec(novtable) BinAttrBase
@@ -77,9 +78,11 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const = 0;
virtual void Write(CCoreBinFile *binfile) const = 0;
virtual void Read(CCoreBinFile *binfile) = 0;
+ // virtual move constructor
+ virtual void move(BinAttrUnion&& dest) = 0;
};
-class BinAttrUnion : public BinAttrBase
+class __declspec(novtable) BinAttrUnion : public BinAttrBase
{
public:
BinAttrUnion() { }
@@ -91,16 +94,19 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const { DebugBreak(); }
virtual void Write(CCoreBinFile *binfile) const { DebugBreak(); }
virtual void Read(CCoreBinFile *binfile) { DebugBreak(); }
+ virtual void move(BinAttrUnion&& dest) { DebugBreak(); }
+ // that is a subtype of BinAttrUnion
+ // that must not be BinAttrUnion because of __declspec(novtable)
BinAttrUnion(BinAttrUnion&& that) {
- // This copies the virtual function table (i.e. runtime type) too!
- memcpy(this, &that, sizeof(BinAttrUnion));
- // Copy an empty BinAttrUnion over that so resources are not released twice
- new ((void*)(&that)) BinAttrUnion();
+ // volatile to read the vtable of that
+ BinAttrUnion* volatile that_ = &that;
+ that_->move(std::move(*this));
}
+
BinAttrUnion& operator=(BinAttrUnion&& that) {
- memcpy(this, &that, sizeof(BinAttrUnion));
- new ((void*)(&that)) BinAttrUnion();
+ BinAttrUnion* volatile that_ = &that;
+ that_->move(std::move(*this));
return *this;
}
BinAttrUnion(const BinAttrUnion& that) {
@@ -344,6 +350,11 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const { CopyTo(a, p); }
virtual void Write(CCoreBinFile *binfile) const { binfile->write(a); }
virtual void Read(CCoreBinFile *binfile) { binfile->read(a); }
+
+ BinAttr(BinAttr<VALTYPE_LONG>&& that) : BinAttrBase(that.attrid), a(that.a) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_LONG>(std::move(*this));
+ }
};
// --------------------------- BinAttr<VALTYPE_REAL>
@@ -363,6 +374,10 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const { CopyTo(a, p); }
virtual void Write(CCoreBinFile *binfile) const { binfile->write(a); }
virtual void Read(CCoreBinFile *binfile) { binfile->read(a); }
+ BinAttr(BinAttr<VALTYPE_REAL>&& that) : BinAttrBase(that.attrid), a(that.a) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_REAL>(std::move(*this));
+ }
};
// --------------------------- BinAttr<VALTYPE_STRING>
@@ -371,6 +386,8 @@
class BinAttr<VALTYPE_STRING> : public BinAttrBase
{
public:
+ BinAttr() { }
+
CComBstrObj a;
virtual valtype_type GetValType() const NOTHROW { return VALTYPE_STRING; }
@@ -380,6 +397,10 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const { CopyTo(a, p); }
virtual void Write(CCoreBinFile *binfile) const { binfile->write(a); }
virtual void Read(CCoreBinFile *binfile) { binfile->read(a); }
+ BinAttr(BinAttr<VALTYPE_STRING>&& that) : BinAttrBase(that.attrid), a(std::move(that.a)) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_STRING>(std::move(*this));
+ }
};
// --------------------------- BinAttr<VALTYPE_BINARY>
@@ -388,6 +409,8 @@
class BinAttr<VALTYPE_BINARY> : public BinAttrBase
{
public:
+ BinAttr() { }
+
bindata a;
virtual valtype_type GetValType() const NOTHROW { return VALTYPE_BINARY; }
@@ -397,6 +420,10 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const { CopyTo(a, p); }
virtual void Write(CCoreBinFile *binfile) const { binfile->write(a); }
virtual void Read(CCoreBinFile *binfile) { binfile->read(a); }
+ BinAttr(BinAttr<VALTYPE_BINARY>&& that) : BinAttrBase(that.attrid), a(std::move(that.a)) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_BINARY>(std::move(*this));
+ }
};
// --------------------------- BinAttr<VALTYPE_LOCK>
@@ -414,6 +441,10 @@
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const { CopyTo(a, p); }
virtual void Write(CCoreBinFile *binfile) const { }
virtual void Read(CCoreBinFile *binfile) { a = 0; }
+ BinAttr(BinAttr<VALTYPE_LOCK>&& that) : BinAttrBase(that.attrid), a(that.a) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_LOCK>(std::move(*this));
+ }
};
// --------------------------- BinAttr<VALTYPE_COLLECTION>
@@ -421,11 +452,9 @@
class BinAttr<VALTYPE_COLLECTION> : public BinAttrBase
{
public:
- // a must not be moved, as BinAttr<VALTYPE_POINTER> indexes into it. Allocate a separately so we can still move BinAttrs
- std::auto_ptr<std::vector<objects_iterator>> a;
+ std::vector<objects_iterator> a;
- BinAttr() : a(new std::vector<objects_iterator>) { }
- virtual ~BinAttr() { }
+ BinAttr() { }
virtual valtype_type GetValType() const NOTHROW { return VALTYPE_COLLECTION; }
virtual void Set(CCoreBinFile *binfile, VARIANT p) { ASSERT(false); }
virtual void Get(CCoreBinFile *binfile, VARIANT *p) const
@@ -434,8 +463,8 @@
std::vector<metaobjidpair_type> idpairs;
- std::vector<objects_iterator>::const_iterator i = a->begin();
- std::vector<objects_iterator>::const_iterator e = a->end();
+ std::vector<objects_iterator>::const_iterator i = a.begin();
+ std::vector<objects_iterator>::const_iterator e = a.end();
while( i != e )
{
idpairs.push_back( (*i)->first );
@@ -447,6 +476,12 @@
}
virtual void Write(CCoreBinFile *binfile) const { }
virtual void Read(CCoreBinFile *binfile) { }
+ // N3126 §23.2.1/9: Every iterator referring to an element in one container before the swap shall refer to the same element in the other container after the swap.
+ // supposing this applies to std::move, BinAttr<VALTYPE_POINTER> iterator should remain valid
+ BinAttr(BinAttr<VALTYPE_COLLECTION>&& that) : BinAttrBase(that.attrid), a(std::move(that.a)) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_COLLECTION>(std::move(*this));
+ }
};
// --------------------------- BinAttr<VALTYPE_POINTER>
@@ -479,7 +514,7 @@
ASSERT( base != NULL );
ASSERT( base->GetValType() == VALTYPE_COLLECTION );
- std::vector<objects_iterator> &objs = *((BinAttr<VALTYPE_COLLECTION>*)base)->a;
+ std::vector<objects_iterator> &objs = ((BinAttr<VALTYPE_COLLECTION>*)base)->a;
#ifdef DEBUG_CONTAINERS
std::vector<objects_iterator>::iterator i = find(objs.begin(), objs.end(), a);
@@ -497,7 +532,7 @@
ASSERT( base != NULL );
ASSERT( base->GetValType() == VALTYPE_COLLECTION );
- std::vector<objects_iterator> &objs = *((BinAttr<VALTYPE_COLLECTION>*)base)->a;
+ std::vector<objects_iterator> &objs = ((BinAttr<VALTYPE_COLLECTION>*)base)->a;
ASSERT( binfile->opened_object->second.Find(attrid) == this );
@@ -577,6 +612,10 @@
b.idpair.objid = objid;
}
}
+ BinAttr(BinAttr<VALTYPE_POINTER>&& that) : BinAttrBase(that.attrid), a(std::move(that.a)), isEmpty(that.isEmpty) { }
+ virtual void move(BinAttrUnion&& dest) {
+ new (&dest) BinAttr<VALTYPE_POINTER>(std::move(*this));
+ }
};
More information about the gme-commit
mailing list