dynarray.h

来自「A*算法 A*算法 A*算法 A*算法A*算法A*算法」· C头文件 代码 · 共 1,001 行 · 第 1/4 页

H
1,001
字号
                                                                    \
  size_t  m_nSize,                                                  \
          m_nCount;                                                 \
                                                                    \
  T      *m_pItems;                                                 \
}

#endif // !wxUSE_STL

// ============================================================================
// The private helper macros containing the core of the array classes
// ============================================================================

// Implementation notes:
//
// JACS: Salford C++ doesn't like 'var->operator=' syntax, as in:
//          { ((wxBaseArray *)this)->operator=((const wxBaseArray&)src);
//       so using a temporary variable instead.
//
// The classes need a (even trivial) ~name() to link under Mac X
//
// _WX_ERROR_REMOVE is needed to resolve the name conflict between the wxT()
// macro and T typedef: we can't use wxT() inside WX_DEFINE_ARRAY!

#define _WX_ERROR_REMOVE wxT("removing inexisting element in wxArray::Remove")

// ----------------------------------------------------------------------------
// _WX_DEFINE_TYPEARRAY: array for simple types
// ----------------------------------------------------------------------------

#if wxUSE_STL

#define  _WX_DEFINE_TYPEARRAY(T, name, base, classexp)                \
typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2);         \
classexp name : public base                                           \
{                                                                     \
public:                                                               \
  T& operator[](size_t uiIndex) const                                 \
    { return (T&)(base::operator[](uiIndex)); }                       \
  T& Item(size_t uiIndex) const                                       \
    { return (T&)/*const cast*/base::operator[](uiIndex); }           \
  T& Last() const                                                     \
    { return Item(Count() - 1); }                                     \
                                                                      \
  int Index(T e, bool bFromEnd = false) const                         \
    { return base::Index(e, bFromEnd); }                              \
                                                                      \
  void Add(T lItem, size_t nInsert = 1)                               \
    { insert(end(), nInsert, lItem); }                                \
  void Insert(T lItem, size_t uiIndex, size_t nInsert = 1)            \
    { insert(begin() + uiIndex, nInsert, lItem); }                    \
                                                                      \
  void RemoveAt(size_t uiIndex, size_t nRemove = 1)                   \
    { base::RemoveAt(uiIndex, nRemove); }                             \
  void Remove(T lItem)                                                \
    { int iIndex = Index(lItem);                                      \
      wxCHECK2_MSG( iIndex != wxNOT_FOUND, return,                    \
         _WX_ERROR_REMOVE);                                           \
      RemoveAt((size_t)iIndex); }                                     \
                                                                      \
  void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); }           \
}

#define  _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp)         \
         _WX_DEFINE_TYPEARRAY(T, name, base, classexp)

#else // if !wxUSE_STL

// common declaration used by both _WX_DEFINE_TYPEARRAY and
// _WX_DEFINE_TYPEARRAY_PTR
#define  _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, ptrop)  \
wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type),          \
                       TypeTooBigToBeStoredIn##base,                  \
                       name);                                         \
typedef int (CMPFUNC_CONV *CMPFUNC##T)(T *pItem1, T *pItem2);         \
classexp name : public base                                           \
{                                                                     \
public:                                                               \
  name() { }                                                          \
  ~name() { }                                                         \
                                                                      \
  name& operator=(const name& src)                                    \
    { base* temp = (base*) this;                                      \
      (*temp) = ((const base&)src);                                   \
      return *this; }                                                 \
                                                                      \
  T& operator[](size_t uiIndex) const                                 \
    { return (T&)(base::operator[](uiIndex)); }                       \
  T& Item(size_t uiIndex) const                                       \
    { return (T&)(base::operator[](uiIndex)); }                       \
  T& Last() const                                                     \
    { return (T&)(base::operator[](Count() - 1)); }                   \
                                                                      \
  int Index(T lItem, bool bFromEnd = false) const                     \
    { return base::Index((base_type)lItem, bFromEnd); }               \
                                                                      \
  void Add(T lItem, size_t nInsert = 1)                               \
    { base::Add((base_type)lItem, nInsert); }                         \
  void Insert(T lItem, size_t uiIndex, size_t nInsert = 1)            \
    { base::Insert((base_type)lItem, uiIndex, nInsert) ; }            \
                                                                      \
  void RemoveAt(size_t uiIndex, size_t nRemove = 1)                   \
    { base::RemoveAt(uiIndex, nRemove); }                             \
  void Remove(T lItem)                                                \
    { int iIndex = Index(lItem);                                      \
      wxCHECK2_MSG( iIndex != wxNOT_FOUND, return,                    \
         _WX_ERROR_REMOVE);                                           \
      base::RemoveAt((size_t)iIndex); }                               \
                                                                      \
  void Sort(CMPFUNC##T fCmp) { base::Sort((CMPFUNC)fCmp); }           \
                                                                      \
  /* STL-like interface */                                            \
private:                                                              \
  typedef base::iterator biterator;                                   \
  typedef base::const_iterator bconst_iterator;                       \
  typedef base::value_type bvalue_type;                               \
  typedef base::const_reference bconst_reference;                     \
public:                                                               \
  typedef T value_type;                                               \
  typedef value_type* pointer;                                        \
  typedef const value_type* const_pointer;                            \
  typedef value_type* iterator;                                       \
  typedef const value_type* const_iterator;                           \
  typedef value_type& reference;                                      \
  typedef const value_type& const_reference;                          \
  typedef base::difference_type difference_type;                      \
  typedef base::size_type size_type;                                  \
                                                                      \
  class reverse_iterator                                              \
  {                                                                   \
    typedef T value_type;                                             \
    typedef value_type& reference;                                    \
    typedef value_type* pointer;                                      \
    typedef reverse_iterator itor;                                    \
    friend inline itor operator+(int o, const itor& it)               \
        { return it.m_ptr - o; }                                      \
    friend inline itor operator+(const itor& it, int o)               \
        { return it.m_ptr - o; }                                      \
    friend inline itor operator-(const itor& it, int o)               \
        { return it.m_ptr + o; }                                      \
    friend inline difference_type operator-(const itor& i1,           \
                                            const itor& i2)           \
        { return i1.m_ptr - i2.m_ptr; }                               \
                                                                      \
  public:                                                             \
    pointer m_ptr;                                                    \
    reverse_iterator() : m_ptr(NULL) { }                              \
    reverse_iterator(pointer ptr) : m_ptr(ptr) { }                    \
    reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { }            \
    reference operator*() const { return *m_ptr; }                    \
    ptrop                                                             \
    itor& operator++() { --m_ptr; return *this; }                     \
    const itor operator++(int)                                        \
      { reverse_iterator tmp = *this; --m_ptr; return tmp; }          \
    itor& operator--() { ++m_ptr; return *this; }                     \
    const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; }\
    bool operator ==(const itor& it) { return m_ptr == it.m_ptr; }    \
    bool operator !=(const itor& it) { return m_ptr != it.m_ptr; }    \
  };                                                                  \
                                                                      \
  class const_reverse_iterator                                        \
  {                                                                   \
    typedef T value_type;                                             \
    typedef const value_type& reference;                              \
    typedef const value_type* pointer;                                \
    typedef const_reverse_iterator itor;                              \
    friend inline itor operator+(int o, const itor& it)               \
        { return it.m_ptr - o; }                                      \
    friend inline itor operator+(const itor& it, int o)               \
        { return it.m_ptr - o; }                                      \
    friend inline itor operator-(const itor& it, int o)               \
        { return it.m_ptr + o; }                                      \
    friend inline difference_type operator-(const itor& i1,           \
                                            const itor& i2)           \
        { return i1.m_ptr - i2.m_ptr; }                               \
                                                                      \
  public:                                                             \
    pointer m_ptr;                                                    \
    const_reverse_iterator() : m_ptr(NULL) { }                        \
    const_reverse_iterator(pointer ptr) : m_ptr(ptr) { }              \
    const_reverse_iterator(const itor& it) : m_ptr(it.m_ptr) { }      \
    const_reverse_iterator(const reverse_iterator& it) : m_ptr(it.m_ptr) { }\
    reference operator*() const { return *m_ptr; }                    \
    ptrop                                                             \
    itor& operator++() { --m_ptr; return *this; }                     \
    const itor operator++(int)                                        \
      { itor tmp = *this; --m_ptr; return tmp; }                      \
    itor& operator--() { ++m_ptr; return *this; }                     \
    const itor operator--(int) { itor tmp = *this; ++m_ptr; return tmp; }\
    bool operator ==(const itor& it) { return m_ptr == it.m_ptr; }    \
    bool operator !=(const itor& it) { return m_ptr != it.m_ptr; }    \
  };                                                                  \
                                                                      \
  name(size_type n, const_reference v) { assign(n, v); }              \
  name(const_iterator first, const_iterator last)                     \
    { assign(first, last); }                                          \
  void assign(const_iterator first, const_iterator last)              \
    { base::assign((bconst_iterator)first, (bconst_iterator)last); }  \
  void assign(size_type n, const_reference v)                         \
    { base::assign(n, (bconst_reference)v); }                         \
  reference back() { return *(end() - 1); }                           \
  const_reference back() const { return *(end() - 1); }               \
  iterator begin() { return (iterator)base::begin(); }                \
  const_iterator begin() const { return (const_iterator)base::begin(); }\
  size_type capacity() const { return base::capacity(); }             \
  iterator end() { return (iterator)base::end(); }                    \
  const_iterator end() const { return (const_iterator)base::end(); }  \
  iterator erase(iterator first, iterator last)                       \
    { return (iterator)base::erase((biterator)first, (biterator)last); }\
  iterator erase(iterator it)                                         \
    { return (iterator)base::erase((biterator)it); }                  \
  reference front() { return *begin(); }                              \
  const_reference front() const { return *begin(); }                  \
  void insert(iterator it, size_type n, const_reference v)            \
    { base::insert((biterator)it, n, (bconst_reference)v); }          \
  iterator insert(iterator it, const_reference v = value_type())      \
    { return (iterator)base::insert((biterator)it, (bconst_reference)v); }\
  void insert(iterator it, const_iterator first, const_iterator last) \
    { base::insert((biterator)it, (bconst_iterator)first,             \
                   (bconst_iterator)last); }                          \
  void pop_back() { base::pop_back(); }                               \
  void push_back(const_reference v)                                   \
    { base::push_back((bconst_reference)v); }                         \
  reverse_iterator rbegin() { return reverse_iterator(end() - 1); }   \
  const_reverse_iterator rbegin() const;                              \
  reverse_iterator rend() { return reverse_iterator(begin() - 1); }   \
  const_reverse_iterator rend() const;                                \
  void reserve(size_type n) { base::reserve(n); };                    \
  void resize(size_type n, value_type v = value_type());              \
}

#define _WX_PTROP pointer operator->() const { return m_ptr; }
#define _WX_PTROP_NONE

#define _WX_DEFINE_TYPEARRAY(T, name, base, classexp)                 \
    _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP)
#define _WX_DEFINE_TYPEARRAY_PTR(T, name, base, classexp)          \
    _WX_DEFINE_TYPEARRAY_HELPER(T, name, base, classexp, _WX_PTROP_NONE)

#endif // !wxUSE_STL

// ----------------------------------------------------------------------------
// _WX_DEFINE_SORTED_TYPEARRAY: sorted array for simple data types
//    cannot handle types with size greater than pointer because of sorting
// ----------------------------------------------------------------------------

#define _WX_DEFINE_SORTED_TYPEARRAY_2(T, name, base, defcomp, classexp, comptype)\
wxCOMPILE_TIME_ASSERT2(sizeof(T) <= sizeof(base::base_type),          \
                       TypeTooBigToBeStoredInSorted##base,            \
                       name);                                         \
classexp name : public base                                           \

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?