X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FSTLExtras.h;h=b10a4f11f85710c2335dcb211cd7f3d38ac54c1a;hb=02d62886678db69e8cc86baec381c5d86517fb25;hp=5b7b88b90085270c74e1c9a455175a3b3d024d7a;hpb=ee8af3e2a03495f3d846900fab56be324a0af167;p=oota-llvm.git diff --git a/include/llvm/ADT/STLExtras.h b/include/llvm/ADT/STLExtras.h index 5b7b88b9008..b10a4f11f85 100644 --- a/include/llvm/ADT/STLExtras.h +++ b/include/llvm/ADT/STLExtras.h @@ -18,6 +18,7 @@ #define LLVM_ADT_STLEXTRAS_H #include "llvm/Support/Compiler.h" +#include #include // for std::size_t #include // for qsort #include @@ -67,20 +68,23 @@ template class function_ref; template class function_ref { - Ret (*callback)(void *callable, Params ...params); - void *callable; + Ret (*callback)(intptr_t callable, Params ...params); + intptr_t callable; template - static Ret callback_fn(void *callable, Params ...params) { + static Ret callback_fn(intptr_t callable, Params ...params) { return (*reinterpret_cast(callable))( std::forward(params)...); } public: - template - function_ref(Callable &&callable) + template + function_ref(Callable &&callable, + typename std::enable_if< + !std::is_same::type, + function_ref>::value>::type * = nullptr) : callback(callback_fn::type>), - callable(reinterpret_cast(&callable)) {} + callable(reinterpret_cast(&callable)) {} Ret operator()(Params ...params) const { return callback(callable, std::forward(params)...); } @@ -90,38 +94,44 @@ public: template class function_ref { - Ret (*callback)(void *callable); - void *callable; + Ret (*callback)(intptr_t callable); + intptr_t callable; template - static Ret callback_fn(void *callable) { + static Ret callback_fn(intptr_t callable) { return (*reinterpret_cast(callable))(); } public: template - function_ref(Callable &&callable) + function_ref(Callable &&callable, + typename std::enable_if< + !std::is_same::type, + function_ref>::value>::type * = nullptr) : callback(callback_fn::type>), - callable(reinterpret_cast(&callable)) {} + callable(reinterpret_cast(&callable)) {} Ret operator()() const { return callback(callable); } }; template class function_ref { - Ret (*callback)(void *callable, Param1 param1); - void *callable; + Ret (*callback)(intptr_t callable, Param1 param1); + intptr_t callable; template - static Ret callback_fn(void *callable, Param1 param1) { + static Ret callback_fn(intptr_t callable, Param1 param1) { return (*reinterpret_cast(callable))( std::forward(param1)); } public: template - function_ref(Callable &&callable) + function_ref(Callable &&callable, + typename std::enable_if< + !std::is_same::type, + function_ref>::value>::type * = nullptr) : callback(callback_fn::type>), - callable(reinterpret_cast(&callable)) {} + callable(reinterpret_cast(&callable)) {} Ret operator()(Param1 param1) { return callback(callable, std::forward(param1)); } @@ -129,11 +139,11 @@ public: template class function_ref { - Ret (*callback)(void *callable, Param1 param1, Param2 param2); - void *callable; + Ret (*callback)(intptr_t callable, Param1 param1, Param2 param2); + intptr_t callable; template - static Ret callback_fn(void *callable, Param1 param1, Param2 param2) { + static Ret callback_fn(intptr_t callable, Param1 param1, Param2 param2) { return (*reinterpret_cast(callable))( std::forward(param1), std::forward(param2)); @@ -141,9 +151,12 @@ class function_ref { public: template - function_ref(Callable &&callable) + function_ref(Callable &&callable, + typename std::enable_if< + !std::is_same::type, + function_ref>::value>::type * = nullptr) : callback(callback_fn::type>), - callable(reinterpret_cast(&callable)) {} + callable(reinterpret_cast(&callable)) {} Ret operator()(Param1 param1, Param2 param2) { return callback(callable, std::forward(param1), @@ -153,11 +166,11 @@ public: template class function_ref { - Ret (*callback)(void *callable, Param1 param1, Param2 param2, Param3 param3); - void *callable; + Ret (*callback)(intptr_t callable, Param1 param1, Param2 param2, Param3 param3); + intptr_t callable; template - static Ret callback_fn(void *callable, Param1 param1, Param2 param2, + static Ret callback_fn(intptr_t callable, Param1 param1, Param2 param2, Param3 param3) { return (*reinterpret_cast(callable))( std::forward(param1), @@ -167,9 +180,12 @@ class function_ref { public: template - function_ref(Callable &&callable) + function_ref(Callable &&callable, + typename std::enable_if< + !std::is_same::type, + function_ref>::value>::type * = nullptr) : callback(callback_fn::type>), - callable(reinterpret_cast(&callable)) {} + callable(reinterpret_cast(&callable)) {} Ret operator()(Param1 param1, Param2 param2, Param3 param3) { return callback(callable, std::forward(param1), @@ -530,6 +546,12 @@ make_unique(size_t n) { #endif +struct FreeDeleter { + void operator()(void* v) { + ::free(v); + } +}; + template struct pair_hash { size_t operator()(const std::pair &P) const { @@ -537,6 +559,35 @@ struct pair_hash { } }; +/// A functor like C++14's std::less in its absence. +struct less { + template bool operator()(A &&a, B &&b) const { + return std::forward(a) < std::forward(b); + } +}; + +/// A functor like C++14's std::equal in its absence. +struct equal { + template bool operator()(A &&a, B &&b) const { + return std::forward(a) == std::forward(b); + } +}; + +/// Binary functor that adapts to any other binary functor after dereferencing +/// operands. +template struct deref { + T func; + // Could be further improved to cope with non-derivable functors and + // non-binary functors (should be a variadic template member function + // operator()). + template + auto operator()(A &lhs, B &rhs) const -> decltype(func(*lhs, *rhs)) { + assert(lhs); + assert(rhs); + return func(*lhs, *rhs); + } +}; + } // End llvm namespace #endif