#ifndef RXVT_STL_H #define RXVT_STL_H template static inline T min (T a, U b) { return a < b ? a : b; } template static inline T max (T a, U b) { return a > b ? a : b; } #include "simplevec.h" template struct vector : simplevec { }; #if 0 template struct rxvt_vec : simplevec { typedef T *iterator; void push_back (T d) { simplevec::push_back ((void *)d); } T pop_back () { return (T*)simplevec::pop_back (); } void erase (int i) { erase (begin () + i); } void erase (iterator i) { simplevec::erase ((void **)i); } iterator begin () const { return (iterator)simplevec::begin (); } iterator end () const { return (iterator)simplevec::end (); } T &operator [] (int i) { return * (T *) (& ((* (simplevec *)this)[i])); } const T &operator [] (int i) const { return * (const T *) (& ((* (const simplevec *)this)[i])); } }; #endif template I find (I first, I last, const T& value) { while (first != last && *first != value) ++first; return first; } template struct auto_ptr { T *p; auto_ptr () : p (0) { } auto_ptr (T *a) : p (a) { } auto_ptr (auto_ptr &a) { p = a.p; a.p = 0; } template auto_ptr (auto_ptr &a) { p = a.p; a.p = 0; } ~auto_ptr () { delete p; } // void because it makes sense in our context void operator = (T *a) { delete p; p = a; } void operator = (auto_ptr &a) { *this = a.p; a.p = 0; } template void operator = (auto_ptr &a) { *this = a.p; a.p = 0; } operator T * () const { return p; } T *operator -> () const { return p; } T &operator * () const { return *p; } T *get () { T *r = p; p = 0; return r; } }; typedef auto_ptr auto_str; struct stringvec : simplevec { ~stringvec () { for (char **c = begin (); c != end (); c++) delete [] *c; } }; #endif