diff options
Diffstat (limited to 'googlemock/include/gmock/internal/gmock-internal-utils.h')
| -rw-r--r-- | googlemock/include/gmock/internal/gmock-internal-utils.h | 39 | 
1 files changed, 36 insertions, 3 deletions
| diff --git a/googlemock/include/gmock/internal/gmock-internal-utils.h b/googlemock/include/gmock/internal/gmock-internal-utils.h index 7e65cea8..319b389b 100644 --- a/googlemock/include/gmock/internal/gmock-internal-utils.h +++ b/googlemock/include/gmock/internal/gmock-internal-utils.h @@ -41,7 +41,6 @@  #include <stdio.h>  #include <ostream>  // NOLINT  #include <string> -  #include "gmock/internal/gmock-generated-internal-utils.h"  #include "gmock/internal/gmock-port.h"  #include "gtest/gtest.h" @@ -49,11 +48,15 @@  namespace testing {  namespace internal { +// Joins a vector of strings as if they are fields of a tuple; returns +// the joined string. +GTEST_API_ std::string JoinAsTuple(const Strings& fields); +  // Converts an identifier name to a space-separated list of lower-case  // words.  Each maximum substring of the form [A-Za-z][a-z]*|\d+ is  // treated as one word.  For example, both "FooBar123" and  // "foo_bar_123" are converted to "foo bar 123". -GTEST_API_ string ConvertIdentifierNameToWords(const char* id_name); +GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name);  // PointeeOf<Pointer>::type is the type of a value pointed to by a  // Pointer, which can be either a smart pointer or a raw pointer.  The @@ -503,8 +506,38 @@ struct RemoveConstFromKey<std::pair<const K, V> > {  template <bool kValue>  struct BooleanConstant {}; +// Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to +// reduce code size. +void IllegalDoDefault(const char* file, int line); + +#if GTEST_LANG_CXX11 +// Helper types for Apply() below. +template <size_t... Is> struct int_pack { typedef int_pack type; }; + +template <class Pack, size_t I> struct append; +template <size_t... Is, size_t I> +struct append<int_pack<Is...>, I> : int_pack<Is..., I> {}; + +template <size_t C> +struct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {}; +template <> struct make_int_pack<0> : int_pack<> {}; + +template <typename F, typename Tuple, size_t... Idx> +auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype( +    std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) { +  return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...); +} + +// Apply the function to a tuple of arguments. +template <typename F, typename Tuple> +auto Apply(F&& f, Tuple&& args) +    -> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args), +                          make_int_pack<std::tuple_size<Tuple>::value>())) { +  return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args), +                   make_int_pack<std::tuple_size<Tuple>::value>()); +} +#endif  }  // namespace internal  }  // namespace testing  #endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ - | 
