X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/5d99dbf06a14904944f5593c63705934bdfdcfb7..b2609562b3d4fc548afcc0a3dfe4ff5fd4ae3d36:/types.h diff --git a/types.h b/types.h index e78186c..b326ef7 100644 --- a/types.h +++ b/types.h @@ -48,8 +48,6 @@ using std::setfill; using std::setprecision; using std::ostream; using std::istream; -using std::ostream_iterator; -using std::istream_iterator; using std::ios; #include @@ -61,6 +59,12 @@ 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; + #include using std::mutex; using lock = std::unique_lock; @@ -99,6 +103,7 @@ using std::is_same; using std::underlying_type; using std::enable_if; using std::remove_reference; +using std::add_const; #include using std::pair; @@ -108,22 +113,37 @@ using std::forward; #include using std::vector; +// type traits and manipulators -template struct is_iterable : false_type {}; +template struct is_const_iterable : false_type {}; -template struct is_iterable struct is_const_iterable().cbegin(), declval().cend(), void()) > : true_type {}; +template struct supports_emplace_back : false_type {}; + +template struct supports_emplace_back().emplace_back(declval()), void()) +> : true_type {}; + +template +using enum_type_t = typename enable_if::value, typename 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; } + +// string manipulation + template -inline typename enable_if::value, string>::type +inline typename enable_if::value, string>::type implode(const C & v, string delim=" ") { - if (v.begin() == v.end()) + auto i=v.cbegin(), end=v.cend(); + if (i == end) return string(); ostringstream oss; - auto last = prev(v.end()); - copy(v.begin(), last, ostream_iterator(oss, delim.c_str())); - oss << *last; + oss << *i++; + while (i != end) + oss << delim << *i++; return oss.str(); } @@ -132,7 +152,7 @@ inline vector explode(const string &s, string delim=" ") { size_t start = 0, end = 0; while ((end = s.find(delim, start)) != string::npos) { out.push_back(s.substr(start, end - start)); - start = end + 1; + start = end + delim.size(); } out.push_back(s.substr(start)); return out; @@ -141,10 +161,25 @@ inline vector explode(const string &s, string delim=" ") { #include "lang/verify.h" #include "threaded_log.h" +// struct tuple adapter, useful for marshalling +// used like +// 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__); } +// struct ordering and comparison +// used like +// struct foo { +// int a, b; +// MEMBERS(a, b) +// }; +// LEXICOGRAPHIC_COMPARISON(foo) + #define LEXICOGRAPHIC_OPERATOR(_c_, _op_) \ inline bool operator _op_(const _c_ &b) const { return _tuple_() _op_ b._tuple_(); } @@ -153,7 +188,9 @@ LEXICOGRAPHIC_OPERATOR(_c_, <) LEXICOGRAPHIC_OPERATOR(_c_, <=) \ LEXICOGRAPHIC_OPERATOR(_c_, >) LEXICOGRAPHIC_OPERATOR(_c_, >=) \ LEXICOGRAPHIC_OPERATOR(_c_, ==) LEXICOGRAPHIC_OPERATOR(_c_, !=) -// The following implementation of tuple_indices is redistributed under the MIT +// crucial tool for 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. template struct tuple_indices {}; @@ -168,6 +205,11 @@ template struct make_tuple_indices { typedef typename make_indices_imp, E>::type 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. +struct pass { template inline pass(Args&&...) {} }; + #include "endian.h" #endif