System.DynamicArray.Create

From RAD Studio API Documentation
Jump to: navigation, search

C++

DynamicArray<T>::DynamicArray() : Data(0)
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1) : Data(0)
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2) : Data(0)
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3) : Data(0)
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4) : Data(0)
{
  set_length(5);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5) : Data(0)
{
  set_length(6);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6) : Data(0)
{
  set_length(7);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7) : Data(0)
{
  set_length(8);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8) : Data(0)
{
  set_length(9);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9) : Data(0)
{
  set_length(10);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5) : Data(0)
{
  set_length(6);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6) : Data(0)
{
  set_length(7);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7) : Data(0)
{
  set_length(8);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8) : Data(0)
{
  set_length(9);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9) : Data(0)
{
  set_length(10);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6) : Data(0)
{
  set_length(7);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7) : Data(0)
{
  set_length(8);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8) : Data(0)
{
  set_length(9);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9) : Data(0)
{
  set_length(10);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7) : Data(0)
{
  set_length(8);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8) : Data(0)
{
  set_length(9);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9) : Data(0)
{
  set_length(10);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8) : Data(0)
{
  set_length(9);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9) : Data(0)
{
  set_length(10);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9) : Data(0)
{
  set_length(10);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10) : Data(0)
{
  set_length(11);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11) : Data(0)
{
  set_length(12);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12) : Data(0)
{
  set_length(13);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13) : Data(0)
{
  set_length(14);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14) : Data(0)
{
  set_length(15);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15) : Data(0)
{
  set_length(16);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16) : Data(0)
{
  set_length(17);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17) : Data(0)
{
  set_length(18);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17;
}
template <class T>
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(const T &t0,  const T &t1,  const T &t2,  const T &t3,
                              const T &t4,  const T &t5,  const T &t6,  const T &t7,
                              const T &t8,  const T &t9,  const T &t10, const T &t11,
                              const T &t12, const T &t13, const T &t14, const T &t15,
                              const T &t16, const T &t17, const T &t18) : Data(0)
{
  set_length(19);
  Data[0] = t0;   Data[1] = t1;   Data[2] = t2;   Data[3] = t3;
  Data[4] = t4;   Data[5] = t5;   Data[6] = t6;   Data[7] = t7;
  Data[8] = t8;   Data[9] = t9;   Data[10] = t10; Data[11] = t11;
  Data[12] = t12; Data[13] = t13; Data[14] = t14; Data[15] = t15;
  Data[16] = t16; Data[17] = t17; Data[18] = t18;
}
#endif /* defined(SYSDYN_HAS_CXX11) */
template <class T>
template <size_t SIZE>
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
{
  set_length(SIZE);
  for (size_t i = 0; i < SIZE; i++)
    Data[i] = array[i];
}
template <class T>
DynamicArray<T>::~DynamicArray()
{
#ifdef __clang__
  if (_init_inst) {
    static DynamicArray<T> __force_inst1, __force_inst2 = __force_inst1;
  }
#endif
  DecRefCount();
  Data = 0;
}
template <class T>
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)
{
  IncRefCount();
}
template <class T> DynamicArray<T>&
DynamicArray<T>::operator =(const DynamicArray<T>& src)
{
  if (&src != this)
  {
    DecRefCount();
    Data = src.Data;
    IncRefCount();
  }
  return *this;
}
template <class T> T&
DynamicArray<T>::operator[](DynArrInt index)
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> const T&
DynamicArray<T>::operator[](DynArrInt index) const
{
  if (index < 0 || index >= this->Length)
    throw DynArrayOutOfRange(index, this->Length);
  if (!Data)
    throw DynArrayNullData();
  return *(Data + index);
}
template <class T> bool
DynamicArray<T>::operator == (const DynamicArray<T> &other) const
{
  return Data == other.Data;
}
template <class T> DynamicArray<T>
DynamicArray<T>::Copy() const
{
  DynamicArray<T> cpy;
  Copy(cpy);
  return cpy;
}
template <class T> void
DynamicArray<T>::Copy(DynamicArray<T>& dst) const
{
  DynArrInt l = (*this).Length;
  if (dst.Length != l)
    dst.Length = l;
  for (DynArrInt i=0; i<l; i++)
    dst[i] = (*this)[i];
}
template <class T> DynamicArray<T>
DynamicArray<T>::CopyRange(DynArrInt startIndex, DynArrInt count) const
{
  DynamicArray<T> cpy;
  CopyRange(cpy, startIndex, count);
  return cpy;
}
template <class T> void
DynamicArray<T>::CopyRange(DynamicArray<T>& dst, DynArrInt startIndex,
                                                 DynArrInt count) const
{
  if (dst.Length != count)
    dst.Length = count;
  for (DynArrInt i=0; i<count; i++)
    dst[i] = (*this)[startIndex+i];
}
template <class T> DynArrInt
DynamicArray<T>::get_high() const
{
  return get_length()-1;
}
template <class T> DynArrInt
DynamicArray<T>::get_low() const
{
  return 0;
}
template <class T> DynArrInt
DynamicArray<T>::get_length() const
{
  return Data ? GetRec().Length : 0;
}
template <class T> void
DynamicArray<T>::set_length(DynArrInt l)
{
  T* p = AllocData(l);
  if (p)
  {
    DynArrInt copyLen = (*this).Length;
    if (l < copyLen)
      copyLen = l;
    while (copyLen-- > 0)
      p[copyLen] = (*this)[copyLen];
  }
  SetData(p);
}
template <class T> int
DynamicArray<T>::get_refCount() const
{
  return Data ? GetRec().RefCnt : 0;
}
template <class T> void
DynamicArray<T>::IncRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
  typedef void (__fastcall *_DynArrayAddRef_Proc)(void*);
  (reinterpret_cast<_DynArrayAddRef_Proc>(_System__DynArrayAddRef))(Data);
#else
    _DynArrayAddRef(Data);
#endif
  }
}
template <class T> void
DynamicArray<T>::DecRefCount()
{
  if (Data)
  {
#if !defined(__clang__) || (defined(_WIN32) && !defined(_WIN64))
    typedef int (__fastcall *_DynArrayRelease_Proc)(void*);
    if ((reinterpret_cast<_DynArrayRelease_Proc>(_System__DynArrayRelease))(Data) == 0)
      FreeData();
#else
    if (_DynArrayRelease(Data) == 0)
      FreeData();
#endif
  }
}
template <class T> T*
DynamicArray<T>::AllocData(DynArrInt count)
{
  if (count == 0)
    return 0;
  char *pc = (char*)System::GetMemory(NativeInt(sizeof(T)*count + sizeof(TDynArrayRec)));
  reinterpret_cast<TDynArrayRec*>(pc)->RefCnt = 1;
  reinterpret_cast<TDynArrayRec*>(pc)->Length = count;
  pc += sizeof(TDynArrayRec);
  T *pt = reinterpret_cast<T*>(pc);
  T *p  = reinterpret_cast<T*>(pc);
  while (count-- > 0)
  {
    new  (pc) T;
    pc = reinterpret_cast<char*>(++p);
  }
  return pt;
}
template <class T> void
DynamicArray<T>::SetData(T* t)
{
  if (Data != t)
  {
    DecRefCount();
    Data = t;
  }
}
template <class T> void
DynamicArray<T>::FreeData()
{
  if (Data)
  {
    T*  p = Data;
    DynArrInt l = (*this).Length;
    for (; l-- > 0; p++) {
      if (p)    /* Not necessary but shuts off compiler warning */
        p->~T();
    }
    char* pc = reinterpret_cast<char*>(Data);
    pc -= sizeof(TDynArrayRec);
    System::FreeMemory(pc);
    Data = 0;
  }
}
#if defined(SYSDYN_HAS_CXX11)
template <class T> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t)
{
  Data[index] = t;
}
template <class T> template <class... Types> void
DynamicArray<T>::PushBackElement(DynArrInt index, const T &t, Types && ...values)
{
  Data[index] = t;
  PushBackElement(index + 1, std::forward<Types>(values)...);
}
#endif /* defined(SYSDYN_HAS_CXX11) */
#if defined(GENERIC_ARRAY_NAMES)
typedef DynamicArray<int>             ArrayOfint;
typedef DynamicArray<AnsiString>      ArrayOfstring;
typedef DynamicArray<WideString>      ArrayOfwidestring;
typedef DynamicArray<Byte>            ArrayOfbyte;
typedef DynamicArray<short>           ArrayOfshort;
typedef DynamicArray<long>            ArrayOflong;
typedef DynamicArray<bool>            ArrayOfboolean;
typedef DynamicArray<double>          ArrayOfdouble;
#endif
typedef DynamicArray<Integer>         TIntegerDynArray;
typedef DynamicArray<Cardinal>        TCardinalDynArray;
typedef DynamicArray<Word>            TWordDynArray;
typedef DynamicArray<Smallint>        TSmallIntDynArray;
typedef DynamicArray<Byte>            TByteDynArray;
typedef DynamicArray<Int8>            TInt8DynArray;
typedef DynamicArray<Int8>            TShortIntDynArray _DEPRECATED_ATTRIBUTE0;
typedef DynamicArray<__int64>         TInt64DynArray;
typedef DynamicArray<unsigned>        TLongWordDynArray;
typedef DynamicArray<Single>          TSingleDynArray;
typedef DynamicArray<Double>          TDoubleDynArray;
typedef DynamicArray<Boolean>         TBooleanDynArray;
typedef DynamicArray<String>          TStringDynArray;
typedef DynamicArray<WideString>      TWideStringDynArray;
template <typename T>
class sPointer {
  T* ptr;
public:
  sPointer()     : ptr(0) {}
  sPointer(T* p) : ptr(p) {}
 ~sPointer()              { delete ptr; }
  T* operator& ()         { return ptr; }
  T* operator->()         { return ptr; }
private:
  sPointer(const sPointer<T>&);
  const sPointer<T>& operator=(const sPointer<T>&);
};
} // namespace System
#if defined(SYSDYN_HAS_CXX11)
# undef SYSDYN_HAS_CXX11
#endif /* defined(SYSDYN_HAS_CXX11) */
#endif
DynamicArray<T>::DynamicArray(T(&array)[SIZE]) : Data(0)
DynamicArray<T>::DynamicArray(const DynamicArray<T>& src) : Data(src.Data)

Properties

Type Visibility Source Unit Parent
constructor public sysdyn.h System DynamicArray

Description

Creates and initializes a System.DynamicArray object.

When called with no parameters, the constructor creates an empty dynamic array. Otherwise, it copies another System.DynamicArray.