Minor improvements to ArrayInit

Remove implicit conversion operator.  Also found some apc
code that relied on copy elision for correctness.
Esse commit está contido em:
Jordan DeLong
2013-05-07 18:08:14 -07:00
commit de Sara Golemon
commit abd3808eb3
2 arquivos alterados com 20 adições e 7 exclusões
+14 -4
Ver Arquivo
@@ -69,15 +69,27 @@ class ArrayInit {
public:
enum VectorInit { vectorInit };
enum MapInit { mapInit };
explicit ArrayInit(ssize_t n);
ArrayInit(ssize_t n, VectorInit) {
m_data = CreateVector(n);
}
ArrayInit(ssize_t n, MapInit) {
m_data = CreateMap(n);
}
ArrayInit(ArrayInit&& other) : m_data(other.m_data) {
other.m_data = nullptr;
}
ArrayInit(const ArrayInit&) = delete;
ArrayInit& operator=(const ArrayInit&) = delete;
static ArrayData *CreateVector(ssize_t n);
static ArrayData *CreateMap(ssize_t n);
~ArrayInit() {
// In case an exception interrupts the initialization.
if (m_data) m_data->release();
@@ -269,11 +281,9 @@ public:
m_data = nullptr;
return ret;
}
operator ArrayData *() { return create(); }
static ArrayData *CreateParams(int count, ...);
// this consructor should never be called directly, it is only called from
// generated code.
ArrayInit (ArrayData *data) : m_data(data) {}
private:
ArrayData *m_data;
};
+6 -3
Ver Arquivo
@@ -277,9 +277,12 @@ ArrayData* SharedVariant::loadElems(const SharedMap &sharedMap,
assert(is(KindOfArray));
uint count = arrSize();
bool isVector = getIsVector();
ArrayInit ai = mapInit ? ArrayInit(count, ArrayInit::mapInit) :
isVector ? ArrayInit(count, ArrayInit::vectorInit) :
ArrayInit(count);
auto ai =
mapInit ? ArrayInit(count, ArrayInit::mapInit) :
isVector ? ArrayInit(count, ArrayInit::vectorInit) :
ArrayInit(count);
if (isVector) {
for (uint i = 0; i < count; i++) {
ai.set(sharedMap.getValueRef(i));