#define INLINE inline
#endif
+#if !STD_VECTOR
+#define index_assert(i) (assert (i >= 0 && i < size_));
+#else
+#define index_assert(i) (assert (i != VPOS && i < size_));
+#endif
+
namespace std {
/// copy a bare (C-)array from #src# to #dest# sized #count#
template<class T> void arrcpy (T *dest, T const *src, int count);
template<class T>
class Array
{
-protected:
+public:
+
/// maximum length of array.
vsize max_;
public:
/* std::vector interface */
+ typedef T* iterator;
+ typedef T const* const_iterator;
+
Array ()
{
array_ = 0;
max_ = size_ = src.size_;
}
+ Array (const_iterator begin, const_iterator end);
+
T const &back () const
{
return (*this)[size_ - 1];
return array_;
}
- typedef T* iterator;
+ T const*
+ data () const
+ {
+ return array_;
+ }
iterator
begin ()
return data ();
}
- iterator const
+ const_iterator
begin () const
{
return data ();
return data () + size_;
}
- iterator const
+ const_iterator
end () const
{
return data () + size_;
void clear ()
{
- resize (0);
+ //resize (0);
+ size_ = 0;
+ }
+
+ T &
+ at (vsize i)
+ {
+ return (*this)[i];
+ }
+
+ T const &
+ at (vsize i) const
+ {
+ return (*this)[i];
}
- /* std::vector uses unchecked variant for [] */
T &operator [] (vsize i)
{
- return elem_ref (i);
+ return array_[i];
}
- /* std::vector uses unchecked variant for [] */
T const &operator [] (vsize i) const
{
- return elem_ref (i);
+ return array_[i];
}
iterator
erase (iterator p)
{
vsize i = p - data ();
-#if !STD_VECTOR
- assert (i >= 0 && i < size_);
-#else
- assert (i < size_);
-#endif
+ index_assert (i);
arrcpy (array_ + i, array_ + i + 1, size_ - i - 1);
size_--;
return p;
}
+ /// add to the end of array
+ void push_back (T x)
+ {
+ if (size_ == max_)
+ remax (2 * max_ + 1);
+ // T::operator= (T &) is called here. Safe to use with automatic
+ // vars
+ array_[size_++] = x;
+ }
/* Flower intererface */
T *remove_array ();
- /// access element
- T &elem_ref (vsize i) const
- {
-#if !STD_VECTOR
- assert (i >= 0 && i < size_);
-#else
- assert (i < size_);
-#endif
- return ((T *)array_)[i];
- }
- /// access element
- T elem (vsize i) const
- {
- return elem_ref (i);
- }
-
- /// add to the end of array
- void push_back (T x)
- {
- if (size_ == max_)
- remax (2 * max_ + 1);
-
- // T::operator= (T &) is called here. Safe to use with automatic
- // vars
- array_[size_++] = x;
- }
-#if 0
- /// remove and return last entry
- T pop ()
- {
- assert (!empty ());
- T l = top (0);
- resize (size () - 1);
- return l;
- }
-#endif
-
/// access last entry
T &top (vsize j)
{
if (dir == 1)
return top (idx);
else
- return elem_ref (idx);
+ return at (idx);
}
T boundary (int dir, vsize idx) const
{
if (dir == 1)
return top (idx);
else
- return elem (idx);
+ return at (idx);
}
void swap (vsize i, vsize j)
{
(*this)[j] = t;
}
- void insert (T k, vsize j);
+ void insert (iterator j, T k);
void unordered_del (vsize i)
{
- elem_ref (i) = back ();
+ at (i) = back ();
resize (size () -1);
}
- // quicksort.
- void sort (int (*compare) (T const &, T const &),
- vsize lower=VPOS, vsize upper=VPOS);
void concat (Array<T> const &src)
{
vsize s = size_;
resize (size_ + src.size_);
arrcpy (array_ + s, src.array_, src.size_);
}
- Array<T> slice (vsize lower, vsize upper) const;
void reverse ();
};
-template<class T>
-int default_compare (T const &a, T const &b)
-{
- if (a < b)
- return -1;
- else if (a > b)
- return 1;
- else
- return 0;
-}
-
#include "array.icc"
}