#ifndef OAK_STL_ITERATOR_CONSTRUCTORS_H_2CBGJHQM #define OAK_STL_ITERATOR_CONSTRUCTORS_H_2CBGJHQM /* =============================================== */ /* = beginof/endof functions to create iterators = */ /* =============================================== */ inline char const* beginof (char const* cStr) { return cStr; } inline char const* endof (char const* cStr) { return cStr + strlen(cStr); } template T* beginof (T (&a)[N]) { return a; } template T* endof (T (&a)[N]) { return a + N; } template T (*beginof(T (&m)[N][M]))[M] { return m; } template T (*endof(T (&m)[N][M]))[M] { return m + N; } template typename T::const_iterator beginof (T const& c) { return c.begin(); } template typename T::const_iterator endof (T const& c) { return c.end(); } template typename T::iterator beginof (T& c) { return c.begin(); } template typename T::iterator endof (T& c) { return c.end(); } template T beginof (std::pair const& p) { return p.first; } template T endof (std::pair const& p) { return p.second; } /* ================================================= */ /* = rbeginof/rendof functions to create iterators = */ /* = wrapped in a std::reverse_iterator = */ /* ================================================= */ inline std::reverse_iterator rbeginof (char const* cStr) { return std::reverse_iterator(endof(cStr)); } inline std::reverse_iterator rendof (char const* cStr) { return std::reverse_iterator(beginof(cStr)); } template std::reverse_iterator rbeginof (T (&a)[N]) { return std::reverse_iterator(endof(a)); } template std::reverse_iterator rendof (T (&a)[N]) { return std::reverse_iterator(beginof(a)); } template std::reverse_iterator rbeginof (T (&m)[N][M]) { return std::reverse_iterator(endof(m)); } template std::reverse_iterator rendof (T (&m)[N][M]) { return std::reverse_iterator(beginof(m)); } template typename T::const_reverse_iterator rbeginof (T const& c) { return c.rbegin(); } template typename T::const_reverse_iterator rendof (T const& c) { return c.rend(); } template typename T::reverse_iterator rbeginof (T& c) { return c.rbegin(); } template typename T::reverse_iterator rendof (T& c) { return c.rend(); } #endif /* end of include guard: OAK_STL_ITERATOR_CONSTRUCTORS_H_2CBGJHQM */