//              COPYRIGHT T.R.BARBOUR 1995. All rights reserved.
//              =============================================== 
                                                                
#ifndef constructObjects_H
#define constructObjects_H

#include "tdefs.h"
#include <new.h>

#define TP template<class T>
TP void constructObject(T& obj) {
   new(&obj) T;
}
TP void copyConstructObject(T& dest, const T& src) {
   new(&dest) T(src);
}
TP void destructObject(T& obj) {
//	obj.T::~T();                     // Borland can't do this
   (&obj)->T::~T();
}
/*
#ifdef __BCPLUSPLUS__
#define BORLAND_CANT_DESTROY(T) void destructObject(T&); //
BORLAND_CANT_DESTROY(byte);
BORLAND_CANT_DESTROY(uint);
BORLAND_CANT_DESTROY(int);
BORLAND_CANT_DESTROY(ulong);
BORLAND_CANT_DESTROY(long);
BORLAND_CANT_DESTROY(char);
BORLAND_CANT_DESTROY(float);
BORLAND_CANT_DESTROY(double);
BORLAND_CANT_DESTROY(long double);
BORLAND_CANT_DESTROY(void*);
#undef BORLAND_CANT_DESTROY
#endif                */

TP void constructObjects(T* objs, uint count) {
   for(T* p = objs; p < objs + count; constructObject(*p++));
};
TP void copyConstructObjects(T* dest, const T* src, uint count) {
   for(const T* fr = src; fr < src + count; copyConstructObject(*dest++,*fr++));
};
TP void destructObjects(T* objs, uint count) {
   for(T* p = objs + count; p > objs; destructObject(*(--p)));
};
#undef TP

#endif
