From a9e2221dfddfbe26eebd6fca92a99be9e8ec1082 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 18 Jun 2015 11:55:27 +0200 Subject: Move some utilities from build2 to libbutl --- butl/utility | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 butl/utility (limited to 'butl/utility') diff --git a/butl/utility b/butl/utility new file mode 100644 index 0000000..b1fa8f6 --- /dev/null +++ b/butl/utility @@ -0,0 +1,53 @@ +// file : butl/utility -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUTL_UTILITY +#define BUTL_UTILITY + +#include // strcmp + +namespace butl +{ + // Key comparators (i.e., to be used in sets, maps, etc). + // + struct compare_c_string + { + bool operator() (const char* x, const char* y) const + { + return std::strcmp (x, y) < 0; + } + }; + + struct compare_pointer_target + { + template + bool operator() (const P& x, const P& y) const {return *x < *y;} + }; + + // Support for reverse iteration using range-based for-loop: + // + // for (... : reverse_iterate (x)) ... + // + template + class reverse_range + { + T& x_; + + public: + reverse_range (T& x): x_ (x) {} + + auto begin () -> decltype (this->x_.rbegin ()) {return x_.rbegin ();} + auto end () -> decltype (this->x_.rend ()) {return x_.rend ();} + }; + + template + inline reverse_range + reverse_iterate (T& x) {return reverse_range (x);} + + template + inline reverse_range + reverse_iterate (const T& x) {return reverse_range (x);} +} + +#endif // BUTL_UTILITY -- cgit v1.1