| |
| /***************************************************************** |
| * Functions to help treat arrays in a uniform manner. These were |
| * inspired by a thread on comp.lang.c++.moderated, started by Dietmar |
| * Kuehl and contributed to by the rest of the entire planet. |
| * |
| * beginof (x), endof (x), lengthof (x) now accompany sizeof, where x |
| * can be either a container (currently only sequences) or a builtin |
| * array (/not/ a pointer). The beginof/endof are intended for use in |
| * the algorithms library, and lengthof is a "sizing" function. |
| * |
| * Note example: |
| * char an_array [17]; |
| * cerr << lengthof(an_array) << endl; |
| * produces assembly code of |
| * mov 17,register0 |
| * call ofstream_put |
| * i.e., the template function inlining really does work; g++ |
| * requires -O3 (or -finline-functions) before it does this, though. |
| * |
| * pedwards 13Nov98 |
| */ |
| // beginof |
| template <class T> |
| inline typename vector<T>::iterator beginof (vector<T> &v) |
| { return v.begin(); } |
| |
| template <class T, unsigned int sz> |
| inline T* beginof (T (&array)[sz]) { return array; } |
| |
| |
| // endof |
| template <class T> |
| inline typename vector<T>::iterator endof (vector<T> &v) |
| { return v.end(); } |
| |
| template <class T, unsigned int sz> |
| inline T* endof (T (&array)[sz]) { return array + sz; } |
| |
| |
| // lengthof |
| template <class T> |
| inline typename vector<T>::size_type lengthof (vector<T> &v) |
| { return v.size(); } |
| |
| template <class T, unsigned int sz> |
| inline unsigned int lengthof (T (&)[sz]) { return sz; } |
| |