27#ifndef ODARRAY_H_INCLUDED
28#define ODARRAY_H_INCLUDED
43#include <initializer_list>
48 static const bool value =
false;
51template <
class First,
class Second>
54 static const bool value = std::is_trivially_copyable<First>::value && std::is_trivially_copyable<Second>::value;
88 #if defined (_MSC_VER) && defined(_DEBUG)
92 memcpy(pDestination, pSource, numElements *
sizeof(T));
112 #if defined (_MSC_VER) && defined(_DEBUG)
116 memmove(pDestination, pSource, numElements *
sizeof(T));
135 #if defined (_MSC_VER) && defined(_DEBUG)
139 memmove(pDestination, pSource, numElements *
sizeof(T));
168 #if defined (_MSC_VER) && defined(_DEBUG)
171#if defined(__GNUC__) && (__GNUC__ > 4)
173#pragma GCC diagnostic push
174#pragma GCC diagnostic ignored "-Warray-bounds"
175#pragma GCC diagnostic ignored "-Wstringop-overflow"
178 memcpy(pElement, std::addressof(
value),
sizeof(
value));
180#if defined(__GNUC__) && (__GNUC__ > 4)
181#pragma GCC diagnostic pop
197 #if defined (_MSC_VER) && defined(_DEBUG)
201 memmove(pElement, std::addressof(
value),
sizeof(
value));
210 template <
class... Args>
215 ::new (pDestination) T(std::forward<Args>(args)...);
231 #if defined (_MSC_VER) && defined(_DEBUG)
237 memcpy(pDestination + numElements, std::addressof(
value),
sizeof(
value));
380 memset(pElement, 0,
sizeof(T));
398 #if defined (_MSC_VER) && defined(_DEBUG)
402 memset(pDestination, 0, numElements *
sizeof(T));
442 *pDestination = *pSource;
464 if (pDestination <= pSource || pDestination >= pSource + numElements)
472 pDestination[numElements] = pSource[numElements];
492 if (pDestination <= pSource || pDestination >= pSource + numElements)
496 *pDestination = std::move(*pSource);
505 pDestination[numElements] = std::move(pSource[numElements]);
535 ::new (pElement) T(
value);
548 ::new (pElement) T(std::move(
value));
557 template <
class... Args>
562 ::new (pDestination) T(std::forward<Args>(args)...);
720 #if defined (_MSC_VER) && defined(_DEBUG)
724 memcpy(pDestination, pSource, numElements *
sizeof(T));
744 #if defined (_MSC_VER) && defined(_DEBUG)
748 memmove(pDestination, pSource, numElements *
sizeof(T));
767 #if defined (_MSC_VER) && defined(_DEBUG)
771 memmove(pDestination, pSource, numElements *
sizeof(T));
843 using ConstForPtrT =
typename std::conditional<std::is_pointer<T>::value,
844 typename std::add_const<typename std::remove_pointer<T>::type>
::type*, T>
::type;
848 const T* data()
const {
return reinterpret_cast<const T*
>(
this+1); }
849 T* data() {
return reinterpret_cast<T*
>(
this + 1); }
851 static Buffer* allocate(
size_type nLength2Allocate,
int nGrowBy)
853 OdUInt64 nBytes2Allocate = (
OdUInt64)
sizeof(Buffer) + nLength2Allocate *
sizeof(T);
854 ODA_ASSERT(nBytes2Allocate > nLength2Allocate);
855 size_t nBytes2AllocateSize_t = (size_t)nBytes2Allocate;
856 if(nBytes2Allocate > nLength2Allocate && (
OdUInt64)nBytes2AllocateSize_t == nBytes2Allocate)
858 Buffer* pBuffer = (Buffer*)
::odrxAlloc(nBytes2AllocateSize_t);
861 pBuffer->m_nRefCounter = 1;
862 pBuffer->m_nGrowBy = nGrowBy;
863 pBuffer->m_nAllocated = nLength2Allocate;
864 pBuffer->m_nLength = 0;
870 static Buffer* _default()
886#pragma warning(disable : 4127)
891 bool _may_use_realloc;
894 inline reallocator(
bool may_use_realloc =
false ) : _may_use_realloc(may_use_realloc), m_pBuffer(NULL) {}
897 if(!pArray->referenced())
901 if ( !_may_use_realloc )
904 m_pBuffer->release();
905 if (!std::is_copy_constructible<T>::value)
906 throw OdError(eNotApplicable);
907 m_pBuffer = pArray->buffer();
910 pArray->copy_buffer(nNewLen, _may_use_realloc);
915 pArray->copy_buffer(nNewLen);
918 inline ~reallocator()
921 m_pBuffer->release();
927 friend class reallocator;
932 void copy_before_write(
size_type len,
bool may_use_realloc =
false )
937 copy_buffer( len, may_use_realloc );
939 void copy_if_referenced() {
if(referenced()) { copy_buffer(
physicalLength()); } }
941#if !defined(SWIG) || defined(SWIGBUILD)
943 template<
typename U = T,
944 typename std::enable_if<std::is_same<U, T>::value && std::is_copy_constructible<U>::value,
bool>
::type =
true>
945 inline void copyConstructRangeChecked(T* dest, T*
source,
size_type len)
947 A::copyConstructRange(dest,
source, len);
949 template<
typename U = T,
950 typename std::enable_if<std::is_same<U, T>::value && !std::is_copy_constructible<U>::value,
bool>
::type =
true>
951 inline void copyConstructRangeChecked(T* dest, T*
source,
size_type len)
954 throw OdError(eNotApplicable);
957 void copy_buffer(
size_type len,
bool may_use_realloc =
false,
bool force_size =
false,
bool releaseOldBufAfterCopy =
true)
959 Buffer* pOldBuffer =
buffer();
960 int nGrowBy = pOldBuffer->m_nGrowBy;
967 len2 = ((len2 - 1) / nGrowBy) * nGrowBy;
971 len2 = pOldBuffer->m_nLength;
972 len2 = len2 + -nGrowBy * len2 / 100;
979 if (may_use_realloc && A::useRealloc() && !
empty())
981 Buffer* pNewBuffer =
reinterpret_cast<Buffer*
>(
::odrxRealloc(
982 pOldBuffer, len2 *
sizeof(T) +
sizeof(Buffer), pOldBuffer->m_nAllocated *
sizeof(T) +
sizeof(Buffer)));
984 throw OdError(eOutOfMemory);
985 pNewBuffer->m_nAllocated = len2;
986 pNewBuffer->m_nLength =
odmin(pNewBuffer->m_nLength, len);
987 m_pData = pNewBuffer->data();
991 Buffer* pNewBuffer = Buffer::allocate(len2, nGrowBy);
993 throw OdError(eOutOfMemory);
994 len =
odmin(pOldBuffer->m_nLength, len);
996 A::moveConstructRange(pNewBuffer->data(), pOldBuffer->data(), len);
998 copyConstructRangeChecked(pNewBuffer->data(), pOldBuffer->data(), len);
999 pNewBuffer->m_nLength = len;
1000 m_pData = pNewBuffer->data();
1001 if (releaseOldBufAfterCopy)
1002 pOldBuffer->release();
1010 throw OdError_InvalidIndex();
1013 static inline void rise_error(
OdResult e)
1028 copy_if_referenced();
1052 copy_if_referenced();
1074 return std::reverse_iterator<iterator>(
end());
1079 std::reverse_iterator<const_iterator>
rbegin()
const
1081 return std::reverse_iterator<const_iterator>(
end());
1087 std::reverse_iterator<iterator>
rend()
1089 return std::reverse_iterator<iterator>(
begin());
1094 std::reverse_iterator<const_iterator>
rend()
const
1096 return std::reverse_iterator<const_iterator>(
begin());
1113#ifdef ODA_DIAGNOSTICS
1114 if (
first >= begin_const() &&
first < end_const() && before < afterLast)
1115 throw OdError(L
"Inserted iterator range will become invalid while inserting.");
1121 if(afterLast >
first)
1125 r.reallocate(
this, len + num2copy);
1126 A::defaultConstructFill(m_pData + len, num2copy);
1127 buffer()->m_nLength = len + num2copy;
1128 T* pDestination = m_pData +
index;
1131 A::moveAssignRange(pDestination + num2copy, pDestination, len -
index);
1138 rise_error(eInvalidInput);
1156#ifdef ODA_DIAGNOSTICS
1157 if (
first >= begin_const() &&
first < end_const() && before < afterLast)
1158 throw OdError(L
"Inserted iterator range will become invalid while inserting.");
1164 if (afterLast >
first)
1168 r.reallocate(
this, len + num2copy);
1169 A::defaultConstructFill(m_pData + len, num2copy);
1170 buffer()->m_nLength = len + num2copy;
1171 T* pDestination = m_pData +
index;
1174 A::moveAssignRange(pDestination + num2copy, pDestination, len -
index);
1181 rise_error(eInvalidInput);
1236 if ( !referenced() )
1256 return buffer()->m_nLength;
1277 return buffer()->m_nAllocated;
1310#ifdef ODA_DIAGNOSTICS
1318 if (
first < end_const() &&
first >= begin_const())
1320 throw OdError(L
"Assignment of a subrange from self is not allowed.");
1323 if (afterLast <
first)
1325 rise_error(eInvalidInput);
1327 if (afterLast >
first)
1330 copy_buffer(num2copy,
true);
1331 buffer()->m_nLength = num2copy;
1349#ifdef ODA_DIAGNOSTICS
1357 if (
first < end_const() &&
first >= begin_const())
1359 throw OdError(L
"Assignment of a subrange from self is not allowed.");
1362 if (afterLast <
first)
1364 rise_error(eInvalidInput);
1366 if (afterLast >
first)
1369 copy_buffer(num2move,
true);
1370 buffer()->m_nLength = num2move;
1386 if(
first != afterLast)
1390 return begin_non_const()+i;
1402 return begin_non_const()+i;
1409 if (m_pData == Buffer::_default()->
data())
1411 copy_if_referenced();
1413 A::destroyRange(m_pData, len);
1414 buffer()->m_nLength -= len;
1426 bool ref = referenced();
1432 copy_buffer(len + 1, !
ref);
1433 A::moveConstruct(m_pData + len, std::move(valueCopy));
1438 copy_buffer(len + 1, !
ref);
1439 A::copyConstruct(m_pData + len,
value);
1453 bool ref = referenced();
1458 T valueMoved(std::move(
value));
1459 copy_buffer(len + 1, !
ref);
1460 A::moveConstruct(m_pData + len, std::move(valueMoved));
1465 copy_buffer(len + 1, !
ref);
1466 A::moveConstruct(m_pData + len, std::move(
value));
1484 if (numElements == 0)
1491 reallocator r(
true);
1492 r.reallocate(
this, len + numElements);
1493 A::defaultConstructFill(m_pData + len, numElements);
1494 buffer()->m_nLength = len + numElements;
1499 A::moveAssignRange(pData + numElements, pData, len -
index);
1501 while (numElements-- > 1)
1503 pData[numElements] = tmpval;
1505 pData[0] = std::move(tmpval);
1506 return begin_non_const()+
index;
1517 const T&
value = T())
1521 return (begin_non_const() +
index);
1536 return (begin_non_const() +
index);
1561 return buffer()->m_nLength;
1593 return buffer()->m_nAllocated;
1604 return buffer()->m_nGrowBy;
1634 copy_if_referenced();
1645 return m_pData[
index];
1654 copy_if_referenced();
1655 return m_pData[
index];
1666 assertValid(arrayIndex);
1667 copy_if_referenced();
1668 return *(
data() + arrayIndex);
1679 assertValid(arrayIndex);
1680 return *(
data() + arrayIndex);
1694 assertValid(arrayIndex);
1695 copy_if_referenced();
1696 m_pData[arrayIndex] =
value;
1709 assertValid(arrayIndex);
1710 return *(
data() + arrayIndex);
1788 rise_error(eInvalidIndex);
1791 T tmp(std::move(
value));
1792 reallocator r(
true);
1793 r.reallocate(
this, oldLen + 1);
1794 A::moveConstruct(m_pData + oldLen, std::move(tmp));
1796 if (
index != oldLen) {
1797 tmp = std::move(m_pData[oldLen]);
1798 A::moveAssignRange(m_pData +
index + 1, m_pData +
index, oldLen -
index);
1799 m_pData[
index] = std::move(tmp);
1849 reallocator r(
true);
1850 r.reallocate(
this, oldLen + nCount);
1851 A::copyConstructFill(m_pData + oldLen, nCount, tmp);
1852 (
buffer()->m_nLength) += nCount;
1864 template<
typename... Args>
1869 const size_type numElements =
sizeof...(Args);
1870 if (numElements == 0)
1874 reallocator r(!areArgsFromThisArray(args...));
1875 r.reallocate(
this,
length() + numElements);
1877 variadicAssignHelper(
length(), args...);
1890 return begin_non_const() + i;
1925 copy_if_referenced();
1959 static_assert(std::is_copy_constructible<T>::value,
"Can not copy array with non-copyable argument");
1965 source.m_pData = Buffer::_default()->data();
1966 source.buffer()->addref();
1975 m_pData = Buffer::allocate(
static_cast<size_type>(l.size()), 8)->data();
1976 assign(l.begin(), l.end());
1980#if !defined(_MSC_VER) || (_MSC_VER > 1800)
1986 template <
typename Iter,
typename std::enable_if<
1987 std::is_base_of<std::forward_iterator_tag, typename std::iterator_traits<Iter>::iterator_category>
::value,
bool>
::type =
true>
1990 m_pData = Buffer::allocate(
static_cast<size_type>(std::distance(
begin,
end)), 8)->data();
2000 template <
typename Iter,
typename std::enable_if<
2001 std::is_base_of<std::input_iterator_tag, typename std::iterator_traits<Iter>::iterator_category>
::value
2002 && !std::is_base_of<std::forward_iterator_tag, typename std::iterator_traits<Iter>::iterator_category>
::value,
bool>
::type =
true>
2005 m_pData = Buffer::_default()->data();
2007 for (Iter i =
begin; i !=
end; ++i)
2017 template <
class Iter,
class =
typename std::enable_if<
2018 std::is_base_of<std::input_iterator_tag, typename std::iterator_traits<typename Iter>::iterator_category>
::value,
void>
::type>
2024 template<
class Iter>
void construct(Iter
begin, Iter
end, std::input_iterator_tag)
2026 m_pData = Buffer::_default()->data();
2028 for (Iter i =
begin; i !=
end; ++i)
2031 template<
class Iter>
void construct(Iter
begin, Iter
end, std::forward_iterator_tag)
2033 m_pData = Buffer::allocate(
static_cast<size_type>(std::distance(
begin,
end)), 8)->data();
2049 res.
assign(sourceArray, sourceArray + sourceLength);
2064 static_assert(std::is_copy_constructible<T>::value,
"Can not copy array with non-copyable argument");
2065 source.buffer()->addref();
2067 m_pData =
source.m_pData;
2076 std::swap( m_pData,
source.m_pData );
2078 source.m_pData = Buffer::_default()->data();
2079 source.buffer()->addref();
2090 if(
at(i) != array[i])
2115 copy_if_referenced();
2168 rise_error(eInvalidIndex);
2172 reallocator r(
true);
2173 r.reallocate(
this, oldLen + 1);
2174 A::moveConstruct(m_pData + oldLen, std::move(tmp));
2176 if (
index != oldLen) {
2177 tmp = std::move(m_pData[oldLen]);
2178 A::moveAssignRange(m_pData +
index + 1, m_pData +
index, oldLen -
index);
2179 m_pData[
index] = std::move(tmp);
2208 template<
class... Args>
2211 reallocator r(!areArgsFromThisArray(std::forward<Args>(args)...));
2213 r.reallocate(
this, len + 1);
2214 A::construct(m_pData + len, std::forward<Args>(args)...);
2229 template<
class... Args>
2235 rise_error(eInvalidIndex);
2238 reallocator r(!areArgsFromThisArray(std::forward<Args>(args)...));
2239 r.reallocate(
this, oldLen + 1);
2240 A::construct(m_pData + oldLen, std::forward<Args>(args)...);
2242 if (
index != oldLen) {
2243 T tmp = std::move(m_pData[oldLen]);
2244 A::moveAssignRange(m_pData +
index + 1, m_pData +
index, oldLen -
index);
2245 m_pData[
index] = std::move(tmp);
2257 template<
class... Args>
2264 return begin_non_const() +
index;
2280 assertValid(arrayIndex);
2282 if (arrayIndex < --len)
2284 copy_if_referenced();
2286 A::moveAssignRange(pData + arrayIndex, pData + arrayIndex + 1, len - arrayIndex);
2305 if (!isValid(startIndex) || startIndex > endIndex)
2307 rise_error(eInvalidIndex);
2310 copy_if_referenced();
2313 size_type n2remove = endIndex - startIndex;
2314 A::moveAssignRange(pData + startIndex, pData + endIndex, len - endIndex);
2315 A::destroyRange(pData + len - n2remove, n2remove);
2316 buffer()->m_nLength -= n2remove;
2337 const T* pData = m_pData;
2340 if (pData[i] ==
value)
2382 copy_buffer(physLength, !referenced(),
true);
2396 copy_if_referenced();
2398 iterator iter1 = begin_non_const();
2401 while(iter1 < iter2)
2424 if(!isValid(firstIndex) || !isValid(secondIndex))
2426 rise_error(eInvalidIndex);
2428 if(firstIndex != secondIndex)
2430 T tmp = std::move(
at(firstIndex));
2431 at(firstIndex) = std::move(
at(secondIndex));
2432 at(secondIndex) = std::move(tmp);
2446 m_pData = other.m_pData;
2447 other.m_pData = temp;
2482 return (
length() ? m_pData :
nullptr);
2485 const T*
data()
const
2487 return (
length() ? m_pData :
nullptr);
2490 const Buffer*
buffer()
const
2492 return reinterpret_cast<const Buffer*
>(m_pData) - 1;
2496 return reinterpret_cast<Buffer*
>(m_pData) - 1;
2498 bool referenced()
const
2500 return buffer()->m_nRefCounter > 1;
2504 OdArray& variadicAssignHelper(
2512 OdArray& variadicAssignHelper(
2522 template<
typename... Args>
2523 OdArray& variadicAssignHelper(
2530 return variadicAssignHelper(
index + 1, args...);
2534#if !defined(SWIG) || defined(SWIGBUILD)
2536 template<
typename U = T,
2537 typename std::enable_if<std::is_same<U, T>::value && !std::is_move_assignable<U>::value,
bool>
::type =
true>
2538 void increaseLogicalLength(
2544 throw OdError(eNotApplicable);
2547 template<
typename U = T,
2548 typename std::enable_if<std::is_same<U, T>::value && std::is_move_assignable<U>::value,
bool>
::type =
true>
2549 void increaseLogicalLength(
2555 reallocator r(m_pData > std::addressof(
value) || std::addressof(
value) > m_pData + oldLen);
2557 A::copyConstructFill(m_pData + oldLen, diff,
value);
2560 template<
typename U = T,
2561 typename std::enable_if<std::is_same<U, T>::value && !std::is_default_constructible<U>::value,
bool>
::type =
true>
2562 void increaseLogicalLength(
2567 throw OdError(eNotApplicable);
2570 template<
typename U = T,
2571 typename std::enable_if<std::is_same<U, T>::value && std::is_default_constructible<U>::value,
bool>
::type =
true>
2572 void increaseLogicalLength(
2577 copy_before_write(oldLen + diff,
true);
2578 A::defaultConstructFill(m_pData + oldLen, diff);
2582 bool areArgsFromThisArray()
2587 bool areArgsFromThisArray(U&& arg)
2589 return static_cast<const void*
>(std::addressof(arg)) >=
static_cast<const void*
>(
begin()) &&
2590 static_cast<const void*
>(std::addressof(arg)) <
static_cast<const void*
>(
end());
2592 template<
class U,
class... Args>
2593 bool areArgsFromThisArray(U&& arg, Args&&... args)
2595 return areArgsFromThisArray(std::forward<U>(arg)) || areArgsFromThisArray(std::forward<Args>(args)...);
#define ODA_ASSERT_ONCE(exp)
ALLOCDLL_EXPORT void * odrxRealloc(void *pMemBlock, size_t newSize, size_t oldSize)
ALLOCDLL_EXPORT void * odrxAlloc(size_t nBytes)
ALLOCDLL_EXPORT void odrxFree(void *pMemBlock)
#define FIRSTDLL_EXPORT_STATIC
const T * asArrayPtr() const
OdArray & appendMove(OdArray &otherArray)
OdArray & emplaceAt(size_type index, Args &&... args)
OdArray & insertAtMove(size_type index, T &value)
OdArray(std::initializer_list< T > l)
static OdArray< T, A > create(const T *sourceArray, int sourceLength)
size_type capacity() const
OdArray & swap(size_type firstIndex, size_type secondIndex)
const T & getAt(size_type arrayIndex) const
bool operator==(const OdArray &array) const
const T & operator[](size_type index) const
void swap(OdArray &other)
const_iterator end() const
void assign(const_iterator first, const_iterator afterLast)
size_type physicalLength() const
std::reverse_iterator< const_iterator > rbegin() const
iterator insert(iterator before, T &&value)
void emplace_back(Args &&... args)
std::reverse_iterator< const_iterator > rend() const
OdArray & setAll(const T &value)
bool operator!=(const OdArray &array) const
iterator emplace(iterator before, Args &&... args)
OdArray(size_type physicalLength, int growLength=8)
void resize(size_type logicalLength)
void insertMove(iterator before, iterator first, iterator afterLast)
OdArray & operator=(const OdArray &source)
OdArray & append(const OdArray &otherArray)
void push_back(T &&value)
bool contains(const ConstForPtrT &value, size_type start=0) const
OdArray & setPhysicalLength(size_type physLength)
OdArray & setGrowLength(int growLength)
iterator erase(iterator where)
OdArray(const OdArray &source)
OdArray(OdArray &&source)
bool find(const ConstForPtrT &value, size_type &findIndex, size_type start=0) const
void push_back(const T &value)
OdArray & setAt(size_type arrayIndex, const T &value)
size_type logicalLength() const
const AECVariant & const_reference
size_type append(T &&value)
OdArray & appendList(const Args &... args)
OdArray & appendRep(const T &value, size_type nCount)
void reserve(size_type reserveLength)
void insert(iterator before, const_iterator first, const_iterator afterLast)
const T & at(size_type arrayIndex) const
std::reverse_iterator< iterator > rend()
OdArray & setLogicalLength(size_type logLength)
typename A::size_type size_type
OdArray & removeSubArray(size_type startIndex, size_type endIndex)
OdArray & append(OdArray &&otherArray)
iterator erase(iterator first, iterator afterLast)
typename std::conditional< std::is_pointer< AECVariant >::value, typename std::add_const< typename std::remove_pointer< AECVariant >::type >::type *, AECVariant >::type ConstForPtrT
OdArray(Iter begin, Iter end)
iterator insert(iterator before, size_type numElements, const T &value)
T & at(size_type arrayIndex)
void assignMove(iterator first, iterator afterLast)
const AECVariant * const_iterator
OdArray & insertAt(size_type index, T &&val)
OdArray & removeAt(size_type arrayIndex)
size_type appendMove(T &value)
void resize(size_type logicalLength, const T &value)
size_type append(const T &value)
iterator insert(iterator before, const T &value=T())
std::reverse_iterator< iterator > rbegin()
OdArray & insertAt(size_type index, const T &value)
bool remove(const T &value, size_type start=0)
const_iterator begin() const
static void defaultConstruct(T *pElement)
static void defaultConstructFill(T *pDestination, size_type numElements)
static void copyConstructFill(T *pDestination, size_type numElements, const T &value)
static void copyConstructRange(T *pDestination, const T *pSource, size_type numElements)
static void moveAssignRange(T *pDestination, T *pSource, size_type numElements)
static void construct(T *pDestination, Args &&... args)
static void defaultConstructFill(T *, size_type)
static void destroyRange(T *, size_type)
static void moveConstruct(T *pElement, T &&value)
static void copyConstruct(T *pElement, const T &value)
static void destroy(T *pObject)
static void copyAssignRangeDisjoint(T *pDestination, const T *pSource, size_type numElements)
static void copyConstructRange(T *pDestination, const T *pSource, size_type numElements)
static void copyConstructFill(T *pDestination, size_type numElements, const T &value)
static void copyAssignRange(T *pDestination, const T *pSource, size_type numElements)
static void moveConstructRange(T *pDestination, T *pSource, size_type numElements)
static void defaultConstruct(T *)
static void moveAssignRange(T *pDestination, T *pSource, size_type numElements)
static void copyConstructRange(T *pDestination, const T *pSource, size_type numElements)
static void defaultConstructFill(T *pDestination, size_type numElements)
static void copyConstructFill(T *pDestination, size_type numElements, const T &value)
static void moveConstructRange(T *pDestination, T *pSource, size_type numElements)
static void copyAssignRange(T *pDestination, const T *pSource, size_type numElements)
static void construct(T *pDestination, Args &&... args)
static void defaultConstruct(T *pElement)
static void destroyRange(T *objects, size_type numObjects)
static void destroy(T *pObject)
static void copyConstruct(T *pElement, const T &value)
static void moveConstruct(T *pElement, T &&value)
static void copyAssignRangeDisjoint(T *pDestination, const T *pSource, size_type numElements)
static void copyAssignRangeDisjoint(T *pDestination, const T *pSource, size_type numElements)
static void moveAssignRange(T *pDestination, T *pSource, size_type numElements)
static void copyAssignRange(T *pDestination, const T *pSource, size_type numElements)
GLint GLenum GLsizei GLsizei GLint GLsizei const void * data
GLsizei GLsizei GLchar * source
GLuint GLsizei GLsizei GLint GLenum * type
GLsizei const GLfloat * value
static FIRSTDLL_EXPORT_STATIC OdArrayBuffer g_empty_array_buffer
OdRefCounter m_nRefCounter