+ vector<T, A> (vector<T, A> const& v) : __vector<T, A> (v)
+ {
+ }
+
+ vector<T, A> (const_iterator b, const_iterator e) : __vector<T, A> (b, e)
+ {
+ }
+
+ T*
+ data ()
+ {
+ return &(*this)[0];
+ }
+
+ T const*
+ data () const
+ {
+ return &(*this)[0];
+ }
+ };
+
+} /* namespace std */
+
+#endif /* !HAVE_STL_DATA_METHOD */
+
+template<typename T>
+T const &
+boundary (vector<T> const &v, int dir, vsize i)
+{
+ assert (dir);
+ return v[dir == -1 ? i : v.size () - 1 - i];
+}
+
+template<typename T>
+T &
+boundary (vector<T> &v, int dir, vsize i)
+{
+ assert (dir);
+ return v[dir == -1 ? i : v.size () - 1 - i];
+}
+
+template<typename T>
+T const &
+back (vector<T> const &v, vsize i)
+{
+ return v[v.size () - i - 1];
+}
+
+template<typename T>
+T&
+back (vector<T> &v, vsize i)
+{
+ return v[v.size () - i - 1];
+}
+
+template<typename T>
+void
+concat (vector<T> &v, vector<T> const& w)
+{
+ v.insert (v.end (), w.begin (), w.end ());
+}
+
+template<class T>
+void
+binary_search_bounds (vector<T> const &table,
+ T const &key, int (*compare) (T const &, T const &),
+ vsize *lo,
+ vsize *hi)
+{
+ if (*lo >= *hi)
+ return;
+
+ int cmp;
+ int result;
+
+ /* binary search */
+ do
+ {
+ cmp = (*lo + *hi) / 2;
+
+ result = (*compare) (key, table[cmp]);
+
+ if (result < 0)
+ *hi = cmp;
+ else
+ *lo = cmp;
+ }
+ while (*hi - *lo > 1);
+}
+
+template<typename T>
+void
+binary_search_bounds (vector<T*> const &table,
+ T const *key, int (*compare) (T *const &, T *const &),
+ vsize *lo,
+ vsize *hi)
+{
+ vsize cmp;
+ int result;
+
+ /* binary search */
+ do
+ {
+ cmp = (*lo + *hi) / 2;
+
+ result = (*compare) ((T *) key, table[cmp]);
+
+ if (result < 0)
+ *hi = cmp;
+ else
+ *lo = cmp;
+ }
+ while (*hi - *lo > 1);
+}