From 9fb791e9fad6c63fc1dac49f4d05ae63b8a3db9b Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 5 Jan 2016 11:55:15 +0200 Subject: Rename build directory/namespace to build2 --- build2/utility | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 build2/utility (limited to 'build2/utility') diff --git a/build2/utility b/build2/utility new file mode 100644 index 0000000..a460bab --- /dev/null +++ b/build2/utility @@ -0,0 +1,85 @@ +// file : build2/utility -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Ltd +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD2_UTILITY +#define BUILD2_UTILITY + +#include // move(), make_pair() +#include // assert() +#include // uncaught_exception() +#include + +#include + +namespace build2 +{ + using std::move; + using std::make_pair; + + // Empty string and path. + // + extern const std::string empty_string; + extern const path empty_path; + extern const dir_path empty_dir_path; + + // Parse version string in the X.Y.Z[-{a|b}N] to a version integer in the + // AABBCCDD form as describe in . Throw invalid_argument + // if the passed string is not a valid version. + // + unsigned int + to_version (const string&); + + // Call a function if there is an exception. + // + + // Means we are in the body of a destructor that is being called + // as part of the exception stack unwindining. Used to compensate + // for the deficiencies of uncaught_exception() until C++17 + // uncaught_exceptions() becomes available. + // + // @@ MT: will have to be TLS. + // + extern bool exception_unwinding_dtor; + + template + struct exception_guard; + + template + inline exception_guard + make_exception_guard (F f) + { + return exception_guard (move (f)); + } + + template + struct exception_guard + { + exception_guard (F f): f_ (move (f)) {} + ~exception_guard () + { + if (std::uncaught_exception ()) + { + exception_unwinding_dtor = true; + f_ (); + exception_unwinding_dtor = false; + } + } + + private: + F f_; + }; + + // Pools (@@ perhaps move into a separate header). + // + struct string_pool: std::unordered_set + { + const std::string& + find (const char* s) {return *emplace (s).first;} + + const std::string& + find (const std::string& s) {return *emplace (s).first;} + }; +} + +#endif // BUILD2_UTILITY -- cgit v1.1