ctrldarr.h

来自「开放源码的编译器open watcom 1.6.0版的源代码」· C头文件 代码 · 共 211 行

H
211
字号
/****************************************************************************
File: CtrldArray.h

Description:   class JAM_ControlledArray<T,Mem>

Usage:

Notes:
move() can be redefined for built-in and "moveable" types as just 
   memmove(dst, src, n*sizeof(T));

Output/input is of the form "[N] t1 t2 t3 ... tN".

History:
28 Aug 1992 Jam      created from JAM_Array
   
****************************************************************************/     
#ifndef JAM_ControlledArray_H
#define JAM_ControlledArray_H

#include <iostream.h>
#include <stddef.h>     // for size_t
#include <assert.hpp>
#include <PlaceNew.h>
#include <Iter.h>

//************************************************************************
// JAM_ControlledArray definition
//************************************************************************

template<class T, class Mem> class JAM_ControlledArray {
public:
   JAM_ControlledArray();
   //: constructs zero element array

   JAM_ControlledArray(const JAM_ControlledArray<T,Mem>& array);
   //: copy construct each element with array

   JAM_ControlledArray(size_t length);
   //: constructs "length" element array using T's default constructor

   JAM_ControlledArray(size_t length, const T& init); 
   //: copy constructs each element with an initial value

   ~JAM_ControlledArray(); 
   //: destroy each element and free memory used

   void operator=(const JAM_ControlledArray<T,Mem>& array); 
   //: assign each element, resizing if necessary

   void resize(size_t new_length);
   //: grow or shrink to new_size elements
   //. elements 0..min(length,new_length)-1 are copy constructed
   //. elements length-1..new_length-1 are destroyed _or_
   //. elements new_length-1..length-1 are default constructed

   void resize(size_t new_length, const T& init);
   //: like resize except initialize any new elements with 'init'

   void clear(); 
   //: destroy each element and free memory used; makes length()==0

   void enter(size_t index, const T& item); 
   //: assigns item to index position (ie, array[index]=item)

   T& operator[](size_t index); 
   //: returns non-const reference to index'th element

   const T& elem(size_t index) const;
   //: returns const reference to index'th element

   const T& operator[](size_t index) const; 
   //: returns const reference to index'th element

   size_t length() const; 
   //: returns current number of elements in array

   static size_t max();
   //: returns maximum length (due to size_t limit) of array


// JAM_Iter<Container> functionality //

   typedef size_t IterState;
   //: position indicator used by JAM_Iter<Container>

   typedef const T& IterItemType;
   //: type JAM_Iter<Container> can convert to

   typedef const T* IterItemTypeP;
   //: type JAM_Iter<Container> operator->() returns

   typedef T& MuterItemType;
   //: type JAM_Muter<Container> can convert to

   typedef T* MuterItemTypeP;
   //: type JAM_Muter<Container> operator->() returns

   static int valid(const IterState& i)
   //: returns whether 'i' is offEnd
      { return i != size_t(-1); }

   void gofirst(IterState& i) const
   //: puts 'i' at first item or offEnd, returns false if length is 0
      { if (length()) i = 0; else i = size_t(-1); }
   void golast(IterState& i) const
   //: puts 'i' at last item or offEnd, returns false if length is 0
      { if (length()) i = length()-1; else i = size_t(-1); }

   void next(IterState& i) const
   //: puts 'i' at next item or offEnd if already at last item
   //: if 'i' already offEnd, puts at first; returns false if offEnd
      { if (length()==0 || i==length()-1) i = size_t(-1);
        else if (i==size_t(-1)) i = 0;
        else ++i; }
   void prev(IterState& i) const
   //: puts 'i' at prev item or offEnd if already at first item
   //: if 'i' already offEnd, puts at first; returns false if offEnd
      { if (length()==0 || i==0) i = size_t(-1);
        else if (i==size_t(-1)) i = length()-1;
        else --i; }

   const T& val(const IterState& i) const
   //: returns IterItemType indicated by 'i'
      { return elem(i); }

   T& ref(const IterState& i)
   //: returns IterItemType indicated by 'i'
      { return (*this)[i]; }

   T* refp(const IterState& i)
   //: returns MuterItemTypeP indicated by 'i'
      { return &(*this)[i]; }

   void remiter(const IterState& i);
   //: removes item at i

   void insiter(IterState& i, const T& item);
   //: inserts item at i

protected:
   T* _arr;       // each element constructed and destroyed explicitly
   size_t _length;  // current number of elements

   static void move(T* dst, T* src, size_t n); 
   //: copy src to raw memory dst then destroy src elements
};


//**************************************************************************
// JAM_ControlledArray functions
//**************************************************************************

template<class T, class Mem>
ostream& operator<<(ostream& os, const JAM_ControlledArray<T, Mem>& array);

template<class T, class Mem>
istream& operator>>(istream& is, JAM_ControlledArray<T, Mem>& array);


//**************************************************************************
// JAM_ControlledArray inline member functions
//**************************************************************************

template<class T, class Mem>
inline JAM_ControlledArray<T,Mem>::JAM_ControlledArray()
   : _length(0), _arr(0)
{
}

template<class T, class Mem>
inline const T& JAM_ControlledArray<T,Mem>::elem(size_t index) const
{ JAM_assert(index<_length); return _arr[index];
}

template<class T, class Mem>
inline void JAM_ControlledArray<T,Mem>::enter(size_t index, const T& item)
{ JAM_assert(index<_length); _arr[index] = item;
}

template<class T, class Mem>
inline const T& JAM_ControlledArray<T,Mem>::operator[](size_t index) const
{ JAM_assert(index<_length); return _arr[index];
}

template<class T, class Mem>
inline T& JAM_ControlledArray<T,Mem>::operator[](size_t index)
{ JAM_assert(index<_length); return _arr[index];
}

template<class T, class Mem>
inline size_t JAM_ControlledArray<T,Mem>::length() const
{ return _length;
}

template<class T, class Mem>
inline size_t JAM_ControlledArray<T,Mem>::max()
{ return size_t(-1) / sizeof(T);
}


//**************************************************************************
// Non-inlined functions
//**************************************************************************

#ifndef DONT_INCLUDE_CPP
#include <CtrldArr.cpp> //## ay
#endif

#endif // JAM_ControlledArray_H

⌨️ 快捷键说明

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