#ifdef __DCL_INTERNAL__
__DCL_BEGIN_NAMESPACE
#ifdef __COMPILE_StringArray__
#define THIS_NAME __szStringArray_h__
#define THIS_VALUE __T("dcl/__ARRAY.h:String")
#define ARRAY_T StringArray
#define ELEMENT_T String
#define CONST_ELEMENT_REF const String&
#define HAVE_CONSTRUCTOR 1
#elif defined(__COMPILE_ByteStringArray__)
#define THIS_NAME __szByteStringArray_h__
#define THIS_VALUE __T("dcl/__ARRAY.h:ByteString")
#define ARRAY_T ByteStringArray
#define ELEMENT_T ByteString
#define CONST_ELEMENT_REF const ByteString&
#define HAVE_CONSTRUCTOR 1
#elif defined(__COMPILE_PointerArray__)
#define THIS_NAME __szPointerArray_h__
#define THIS_VALUE __T("dcl/__ARRAY.h:void*")
#define ARRAY_T PointerArray
#define ELEMENT_T void*
#define CONST_ELEMENT_REF const void*
#define HAVE_CONSTRUCTOR 0
#elif defined(__COMPILE_StringStringArray__)
#define THIS_NAME __szStringStringArray_h__
#define THIS_VALUE __T("dcl/__ARRAY.h:StringString")
#define ARRAY_T StringStringArray
#define ELEMENT_T StringString
#define CONST_ELEMENT_REF const StringString&
#define HAVE_CONSTRUCTOR 1
#endif
#if __DCL_HAVE_THIS_FILE__
static const char_t THIS_NAME[] = THIS_VALUE;
#undef __THIS_FILE__
#define __THIS_FILE__ THIS_NAME
#endif
/**
* template class Array의 DSO 호환성을 제공한다.
* <p>C++의 template class는 해당 코드를 사용하기 전에는 실제 이진 코드를 생성하지 않으므로,
* DSO(so, DLL)와 DSO, 또는 실행파일에서 객체를 주고받을 수 없다.<p>
* <p>이 클래스는 DSO의 이러한 문제를 해결하며,
* 포함파일은 <code><dcl/Array.h></code>이다.</p>
* <p>이 코드를 사용하는 클래스는 다음과 같다.</p>
* <ul>
* <li>class DCLCAPI StringArray</li>
* <li>class DCLCAPI ByteStringArray</li>
* <li>class DCLCAPI PointerArray</li>
* </ul>
*
* @see Array
*/
class DCLCAPI ARRAY_T : public Object
{
DECLARE_CLASSINFO(ARRAY_T)
public:
virtual String toString() const;
public:
typedef const ELEMENT_T* ConstIterator;
typedef ELEMENT_T* Iterator;
public:
virtual ~ARRAY_T();
// ~ARRAY_T();
ARRAY_T(size_t _size = 0);
ARRAY_T(const ARRAY_T& _src);
const ARRAY_T& operator=(const ARRAY_T& _src);
ConstIterator begin() const;
ConstIterator end() const;
Iterator begin();
Iterator end();
void clear();
void shrink();
void resize(size_t _size);
Iterator insert(Iterator _pos, CONST_ELEMENT_REF _element);
ARRAY_T& insert(size_t _index, CONST_ELEMENT_REF _element);
ARRAY_T& add(CONST_ELEMENT_REF _element);
ARRAY_T& add(const ARRAY_T& _src);
Iterator find(CONST_ELEMENT_REF _element);
Iterator erase(Iterator _pos);
Iterator erase(Iterator _first, Iterator _last);
ARRAY_T& erase(size_t _index);
ARRAY_T& erase(size_t _index, size_t _size);
size_t index(Iterator _pos) const;
size_t size() const;
bool isEmpty() const;
ELEMENT_T& operator[](size_t _index);
ELEMENT_T operator[](size_t _index) const;
ELEMENT_T* data() const;
size_t size(ConstIterator _first, ConstIterator _last) const;
size_t size(Iterator _first, Iterator _last) const;
protected:
ELEMENT_T* __pData;
struct Buffer
{
size_t __size;
size_t __maxSize;
ELEMENT_T* data() { return (ELEMENT_T*) (this + 1); }
} ;
Buffer* __buf() const { return (Buffer*) __pData -1; }
size_t& __size() const { return __buf()->__size; }
size_t& __maxSize() const { return __buf()->__maxSize; }
#if HAVE_CONSTRUCTOR
void constructElements(ELEMENT_T* _pElements, size_t _size);
void destructElements(ELEMENT_T* _pElements, size_t _size);
#endif
};
//////////////// Inline ////////////////////
inline
ARRAY_T::ConstIterator
ARRAY_T::begin() const
{
return (const ELEMENT_T*) __pData;
}
inline
ARRAY_T::ConstIterator
ARRAY_T::end() const
{
return (const ELEMENT_T*) __pData + size();
}
inline
ARRAY_T::Iterator
ARRAY_T::begin()
{
return __pData;
}
inline
ARRAY_T::Iterator
ARRAY_T::end()
{
return __pData + size();
}
inline
ARRAY_T&
ARRAY_T::add(CONST_ELEMENT_REF _element)
{
return insert(size(), _element);
}
inline
ARRAY_T::Iterator
ARRAY_T::erase(Iterator _pos)
{
__DCL_ASSERT_PARAM(begin() <= _pos);
__DCL_ASSERT_PARAM(_pos < end());
#if 0
erase(_pos -begin(), 1);
return _pos;
#endif
size_t index = _pos -begin();
erase(index, 1);
return __pData + index;
}
inline
ARRAY_T::Iterator
ARRAY_T::erase(Iterator _first, Iterator _last)
{
__DCL_ASSERT_PARAM(begin() <= _first);
__DCL_ASSERT_PARAM(_last <= end());
erase(_first -begin(), _last -_first);
return _first;
}
inline
ARRAY_T&
ARRAY_T::erase(size_t _index)
{
__DCL_ASSERT_PARAM(_index < size());
return erase(_index, 1);
}
inline
size_t
ARRAY_T::index(Iterator _pos) const
{
__DCL_ASSERT_PARAM(__pData <= _pos);
return _pos -__pData;
}
inline
size_t
ARRAY_T::size() const
{
return __buf()->__size;;
}
inline
bool
ARRAY_T::isEmpty() const
{
return size() == 0;
}
inline
ELEMENT_T&
ARRAY_T::operator[] (size_t _index)
{
__DCL_ASSERT_PARAM(_index < size());
return __pData[_index];
}
inline
ELEMENT_T
ARRAY_T::operator[] (size_t _index) const
{
__DCL_ASSERT_PARAM(_index < size());
return __pData[_index];
}
inline
ELEMENT_T*
ARRAY_T::data() const
{
return __pData;
}
inline
size_t
ARRAY_T::size(ConstIterator _first, ConstIterator _last) const
{
__DCL_ASSERT_PARAM(_first <= _last);
return _last -_first;
}
inline
size_t
ARRAY_T::size(Iterator _first, Iterator _last) const
{
__DCL_ASSERT_PARAM(_first <= _last);
return _last -_first;
}
#if __DCL_HAVE_THIS_FILE__
#undef __THIS_FILE__
#define __THIS_FILE__ __T(__FILE__)
#endif
#undef THIS_NAME
#undef THIS_VALUE
#undef ARRAY_T
#undef ELEMENT_T
#undef CONST_ELEMENT_REF
#undef HAVE_CONSTRUCTOR
__DCL_END_NAMESPACE
#endif // __DCL_INTERNAL__