X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/f0dcb6b97d6d40f67698d1f71ac26970f1776f82..5224670fe4e903bd507eabd486f8723353893bfa:/types.h diff --git a/types.h b/types.h index 888cd68..797ccf0 100644 --- a/types.h +++ b/types.h @@ -2,157 +2,93 @@ #define types_h #include - #include -using std::copy; -using std::count_if; -using std::find; -using std::max; -using std::min; -using std::min_element; -using std::move; -using std::swap; - #include -using cond = std::condition_variable; -using std::cv_status; - #include -using std::chrono::duration_cast; -using std::chrono::microseconds; -using std::chrono::milliseconds; -using std::chrono::nanoseconds; -using std::chrono::seconds; -using std::chrono::steady_clock; -using std::chrono::system_clock; -using std::chrono::time_point; -using std::chrono::time_point_cast; - #include -using std::exception; - #include -using std::ifstream; -using std::ofstream; - #include -// std::bind conflicts with BIND(2) -using std::function; -using std::placeholders::_1; - #include #include -using std::cout; -using std::cerr; -using std::endl; -using std::dec; -using std::hex; -using std::left; -using std::setw; -using std::setfill; -using std::setprecision; -using std::ostream; -using std::istream; -using std::ios; - #include -using std::numeric_limits; - #include -using std::list; - #include -using std::map; - #include -using std::enable_shared_from_this; -using std::make_shared; -using std::shared_ptr; -using std::unique_ptr; -using std::weak_ptr; - #include -using std::mutex; -using lock = std::unique_lock; - +#include +#include #include -using std::ostringstream; -using std::istringstream; - #include +#include +#include +#include +#include +#include + using std::string; -using std::to_string; -using std::stoi; -#include +using cond = std::condition_variable; +using lock = std::unique_lock; using std::thread; -using std::call_once; -using std::once_flag; -namespace this_thread { - using namespace std::this_thread; -} -#include +using std::shared_ptr; +using std::unique_ptr; + using std::tuple; -using std::get; -using std::tie; -#include -using std::decay; -using std::true_type; -using std::false_type; -using std::is_enum; -using std::is_member_function_pointer; -using std::is_same; -using std::underlying_type; using std::enable_if; -using std::remove_reference; -using std::add_const; - -#include -using std::pair; -using std::declval; -using std::forward; - -#include -using std::vector; +using std::false_type; +using std::true_type; // type traits and manipulators template struct is_const_iterable : false_type {}; template struct is_const_iterable().cbegin(), declval().cend(), void()) + decltype(std::declval().cbegin(), std::declval().cend(), void()) > : true_type {}; template struct supports_emplace_back : false_type {}; template struct supports_emplace_back().emplace_back(declval()), void()) + decltype(std::declval().emplace_back(std::declval()), void()) > : true_type {}; -template -using enum_type_t = typename enable_if::value, typename underlying_type::type>::type; +template using enum_type_t = typename enable_if< + std::is_enum::value, typename std::underlying_type::type>::type; + template constexpr inline enum_type_t from_enum(E e) noexcept { return (enum_type_t)e; } template constexpr inline E to_enum(enum_type_t value) noexcept { return (E)value; } + +template struct is_tuple_convertible : false_type {}; + +template struct is_tuple_convertible()._tuple_(), void()) +> : true_type {}; + // string manipulation +template +std::ostream & operator<<(std::ostream & o, const std::pair & d) { + return o << "<" << d.first << "," << d.second << ">"; +} + template inline typename enable_if::value, string>::type implode(const C & v, string delim=" ") { auto i=v.cbegin(), end=v.cend(); if (i == end) return string(); - ostringstream oss; + std::ostringstream oss; oss << *i++; while (i != end) oss << delim << *i++; return oss.str(); } -inline vector explode(const string & s, string delim=" ") { - vector out; +inline std::vector explode(const string & s, string delim=" ") { + std::vector out; size_t start = 0, end = 0; while ((end = s.find(delim, start)) != string::npos) { out.push_back(s.substr(start, end - start)); @@ -162,26 +98,31 @@ inline vector explode(const string & s, string delim=" ") { return out; } -#include "verify.h" -#include "threaded_log.h" +template +typename enable_if< + is_const_iterable::value && + !std::is_same::value, std::ostream>::type & +operator<<(std::ostream & o, const A & a) { + return o << "[" << implode(a, ", ") << "]"; +} + +#include +#define VERIFY(expr) { if (!(expr)) abort(); } -// struct tuple adapter, useful for marshalling -// used like +// struct tuple adapter, useful for marshalling and endian swapping. usage: +// // struct foo { // int a, b; // MEMBERS(a, b) // }; #define MEMBERS(...) \ -inline auto _tuple_() -> decltype(tie(__VA_ARGS__)) { return tie(__VA_ARGS__); } \ -inline auto _tuple_() const -> decltype(tie(__VA_ARGS__)) { return tie(__VA_ARGS__); } +inline auto _tuple_() -> decltype(std::tie(__VA_ARGS__)) { return std::tie(__VA_ARGS__); } \ +inline auto _tuple_() const -> decltype(std::tie(__VA_ARGS__)) { return std::tie(__VA_ARGS__); } -// struct ordering and comparison -// used like -// struct foo { -// int a, b; -// MEMBERS(a, b) -// }; +// struct ordering and comparison operations; requires the use of MEMBERS. +// usage: +// // LEXICOGRAPHIC_COMPARISON(foo) #define LEXICOGRAPHIC_OPERATOR(_c_, _op_) \ @@ -192,8 +133,7 @@ LEXICOGRAPHIC_OPERATOR(_c_, <) LEXICOGRAPHIC_OPERATOR(_c_, <=) \ LEXICOGRAPHIC_OPERATOR(_c_, >) LEXICOGRAPHIC_OPERATOR(_c_, >=) \ LEXICOGRAPHIC_OPERATOR(_c_, ==) LEXICOGRAPHIC_OPERATOR(_c_, !=) -// crucial tool for tuple indexing in variadic templates -// +// Tuple indexing in variadic templates. // This implementation of tuple_indices is redistributed under the MIT // License as an insubstantial portion of the LLVM compiler infrastructure. @@ -209,6 +149,8 @@ template struct make_tuple_indices { typedef typename make_indices_imp, E>::type type; }; +#define TUPLE_INDICES(_ArgPack_) typename make_tuple_indices::type() + // Template parameter pack expansion is not allowed in certain contexts, but // brace initializers (for instance, calls to constructors of empty structs) // are fair game.