X-Git-Url: http://xvm.mit.edu/gitweb/invirt/third/libt4.git/blobdiff_plain/5a5c578e2e358a121cdb9234a6cb11c4ecfbf323..f0dcb6b97d6d40f67698d1f71ac26970f1776f82:/types.h diff --git a/types.h b/types.h index 9739a2a..888cd68 100644 --- a/types.h +++ b/types.h @@ -1,39 +1,44 @@ #ifndef types_h #define types_h +#include + #include using std::copy; -using std::move; +using std::count_if; +using std::find; using std::max; using std::min; using std::min_element; -using std::find; -using std::count_if; +using std::move; +using std::swap; + +#include +using cond = std::condition_variable; +using std::cv_status; #include -using std::chrono::seconds; -using std::chrono::milliseconds; +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::duration_cast; -using std::chrono::time_point_cast; using std::chrono::time_point; +using std::chrono::time_point_cast; #include using std::exception; #include -using std::ofstream; using std::ifstream; +using std::ofstream; -#ifndef LIBT4_NO_FUNCTIONAL #include +// std::bind conflicts with BIND(2) using std::function; -using std::bind; using std::placeholders::_1; -#endif #include #include @@ -48,8 +53,7 @@ using std::setfill; using std::setprecision; using std::ostream; using std::istream; -using std::ostream_iterator; -using std::istream_iterator; +using std::ios; #include using std::numeric_limits; @@ -60,11 +64,16 @@ 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; -using cond = std::condition_variable; -using std::cv_status; #include using std::ostringstream; @@ -77,6 +86,11 @@ using std::stoi; #include using std::thread; +using std::call_once; +using std::once_flag; +namespace this_thread { + using namespace std::this_thread; +} #include using std::tuple; @@ -92,22 +106,124 @@ 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; +// type traits and manipulators -template struct is_iterable : false_type {}; +template struct is_const_iterable : false_type {}; -template struct is_iterable().cbegin(), declval().cend(), void()) +template struct is_const_iterable().cbegin(), declval().cend(), void()) > : true_type {}; -#include "lang/verify.h" +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 +implode(const C & v, string delim=" ") { + auto i=v.cbegin(), end=v.cend(); + if (i == end) + return string(); + ostringstream oss; + oss << *i++; + while (i != end) + oss << delim << *i++; + return oss.str(); +} + +inline vector explode(const string & s, string delim=" ") { + vector out; + size_t start = 0, end = 0; + while ((end = s.find(delim, start)) != string::npos) { + out.push_back(s.substr(start, end - start)); + start = end + delim.size(); + } + out.push_back(s.substr(start)); + return out; +} + +#include "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_(); } + +#define LEXICOGRAPHIC_COMPARISON(_c_) \ +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 +// +// This implementation of tuple_indices is redistributed under the MIT +// License as an insubstantial portion of the LLVM compiler infrastructure. + +template struct tuple_indices {}; +template struct make_indices_imp; +template struct make_indices_imp, E> { + typedef typename make_indices_imp, E>::type type; +}; +template struct make_indices_imp, E> { + typedef tuple_indices type; +}; +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" + +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + +#if __has_attribute(noreturn) +#define NORETURN [[noreturn]] +#else +#define NORETURN +#endif + #endif