?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. // Copyright 2007, Google Inc.
  2. // All rights reserved.
  3. //
  4. // Redistribution and use in source and binary forms, with or without
  5. // modification, are permitted provided that the following conditions are
  6. // met:
  7. //
  8. //     * Redistributions of source code must retain the above copyright
  9. // notice, this list of conditions and the following disclaimer.
  10. //     * Redistributions in binary form must reproduce the above
  11. // copyright notice, this list of conditions and the following disclaimer
  12. // in the documentation and/or other materials provided with the
  13. // distribution.
  14. //     * Neither the name of Google Inc. nor the names of its
  15. // contributors may be used to endorse or promote products derived from
  16. // this software without specific prior written permission.
  17. //
  18. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  19. // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  20. // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  21. // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  22. // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  23. // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  24. // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  25. // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  26. // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  28. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29.  
  30.  
  31. // Google Mock - a framework for writing C++ mock classes.
  32. //
  33. // This file defines some utilities useful for implementing Google
  34. // Mock.  They are subject to change without notice, so please DO NOT
  35. // USE THEM IN USER CODE.
  36.  
  37. // GOOGLETEST_CM0002 DO NOT DELETE
  38.  
  39. #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
  40. #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
  41.  
  42. #include <stdio.h>
  43. #include <ostream>  // NOLINT
  44. #include <string>
  45. #include "gmock/internal/gmock-generated-internal-utils.h"
  46. #include "gmock/internal/gmock-port.h"
  47. #include "gtest/gtest.h"
  48.  
  49. namespace testing {
  50. namespace internal {
  51.  
  52. // Silence MSVC C4100 (unreferenced formal parameter) and
  53. // C4805('==': unsafe mix of type 'const int' and type 'const bool')
  54. #ifdef _MSC_VER
  55. # pragma warning(push)
  56. # pragma warning(disable:4100)
  57. # pragma warning(disable:4805)
  58. #endif
  59.  
  60. // Joins a vector of strings as if they are fields of a tuple; returns
  61. // the joined string.
  62. GTEST_API_ std::string JoinAsTuple(const Strings& fields);
  63.  
  64. // Converts an identifier name to a space-separated list of lower-case
  65. // words.  Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
  66. // treated as one word.  For example, both "FooBar123" and
  67. // "foo_bar_123" are converted to "foo bar 123".
  68. GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name);
  69.  
  70. // PointeeOf<Pointer>::type is the type of a value pointed to by a
  71. // Pointer, which can be either a smart pointer or a raw pointer.  The
  72. // following default implementation is for the case where Pointer is a
  73. // smart pointer.
  74. template <typename Pointer>
  75. struct PointeeOf {
  76.   // Smart pointer classes define type element_type as the type of
  77.   // their pointees.
  78.   typedef typename Pointer::element_type type;
  79. };
  80. // This specialization is for the raw pointer case.
  81. template <typename T>
  82. struct PointeeOf<T*> { typedef T type; };  // NOLINT
  83.  
  84. // GetRawPointer(p) returns the raw pointer underlying p when p is a
  85. // smart pointer, or returns p itself when p is already a raw pointer.
  86. // The following default implementation is for the smart pointer case.
  87. template <typename Pointer>
  88. inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {
  89.   return p.get();
  90. }
  91. // This overloaded version is for the raw pointer case.
  92. template <typename Element>
  93. inline Element* GetRawPointer(Element* p) { return p; }
  94.  
  95. // This comparator allows linked_ptr to be stored in sets.
  96. template <typename T>
  97. struct LinkedPtrLessThan {
  98.   bool operator()(const ::testing::internal::linked_ptr<T>& lhs,
  99.                   const ::testing::internal::linked_ptr<T>& rhs) const {
  100.     return lhs.get() < rhs.get();
  101.   }
  102. };
  103.  
  104. // Symbian compilation can be done with wchar_t being either a native
  105. // type or a typedef.  Using Google Mock with OpenC without wchar_t
  106. // should require the definition of _STLP_NO_WCHAR_T.
  107. //
  108. // MSVC treats wchar_t as a native type usually, but treats it as the
  109. // same as unsigned short when the compiler option /Zc:wchar_t- is
  110. // specified.  It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t
  111. // is a native type.
  112. #if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \
  113.     (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED))
  114. // wchar_t is a typedef.
  115. #else
  116. # define GMOCK_WCHAR_T_IS_NATIVE_ 1
  117. #endif
  118.  
  119. // signed wchar_t and unsigned wchar_t are NOT in the C++ standard.
  120. // Using them is a bad practice and not portable.  So DON'T use them.
  121. //
  122. // Still, Google Mock is designed to work even if the user uses signed
  123. // wchar_t or unsigned wchar_t (obviously, assuming the compiler
  124. // supports them).
  125. //
  126. // To gcc,
  127. //   wchar_t == signed wchar_t != unsigned wchar_t == unsigned int
  128. #ifdef __GNUC__
  129. #if !defined(__WCHAR_UNSIGNED__)
  130. // signed/unsigned wchar_t are valid types.
  131. # define GMOCK_HAS_SIGNED_WCHAR_T_ 1
  132. #endif
  133. #endif
  134.  
  135. // In what follows, we use the term "kind" to indicate whether a type
  136. // is bool, an integer type (excluding bool), a floating-point type,
  137. // or none of them.  This categorization is useful for determining
  138. // when a matcher argument type can be safely converted to another
  139. // type in the implementation of SafeMatcherCast.
  140. enum TypeKind {
  141.   kBool, kInteger, kFloatingPoint, kOther
  142. };
  143.  
  144. // KindOf<T>::value is the kind of type T.
  145. template <typename T> struct KindOf {
  146.   enum { value = kOther };  // The default kind.
  147. };
  148.  
  149. // This macro declares that the kind of 'type' is 'kind'.
  150. #define GMOCK_DECLARE_KIND_(type, kind) \
  151.   template <> struct KindOf<type> { enum { value = kind }; }
  152.  
  153. GMOCK_DECLARE_KIND_(bool, kBool);
  154.  
  155. // All standard integer types.
  156. GMOCK_DECLARE_KIND_(char, kInteger);
  157. GMOCK_DECLARE_KIND_(signed char, kInteger);
  158. GMOCK_DECLARE_KIND_(unsigned char, kInteger);
  159. GMOCK_DECLARE_KIND_(short, kInteger);  // NOLINT
  160. GMOCK_DECLARE_KIND_(unsigned short, kInteger);  // NOLINT
  161. GMOCK_DECLARE_KIND_(int, kInteger);
  162. GMOCK_DECLARE_KIND_(unsigned int, kInteger);
  163. GMOCK_DECLARE_KIND_(long, kInteger);  // NOLINT
  164. GMOCK_DECLARE_KIND_(unsigned long, kInteger);  // NOLINT
  165.  
  166. #if GMOCK_WCHAR_T_IS_NATIVE_
  167. GMOCK_DECLARE_KIND_(wchar_t, kInteger);
  168. #endif
  169.  
  170. // Non-standard integer types.
  171. GMOCK_DECLARE_KIND_(Int64, kInteger);
  172. GMOCK_DECLARE_KIND_(UInt64, kInteger);
  173.  
  174. // All standard floating-point types.
  175. GMOCK_DECLARE_KIND_(float, kFloatingPoint);
  176. GMOCK_DECLARE_KIND_(double, kFloatingPoint);
  177. GMOCK_DECLARE_KIND_(long double, kFloatingPoint);
  178.  
  179. #undef GMOCK_DECLARE_KIND_
  180.  
  181. // Evaluates to the kind of 'type'.
  182. #define GMOCK_KIND_OF_(type) \
  183.   static_cast< ::testing::internal::TypeKind>( \
  184.       ::testing::internal::KindOf<type>::value)
  185.  
  186. // Evaluates to true iff integer type T is signed.
  187. #define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)
  188.  
  189. // LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value
  190. // is true iff arithmetic type From can be losslessly converted to
  191. // arithmetic type To.
  192. //
  193. // It's the user's responsibility to ensure that both From and To are
  194. // raw (i.e. has no CV modifier, is not a pointer, and is not a
  195. // reference) built-in arithmetic types, kFromKind is the kind of
  196. // From, and kToKind is the kind of To; the value is
  197. // implementation-defined when the above pre-condition is violated.
  198. template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To>
  199. struct LosslessArithmeticConvertibleImpl : public false_type {};
  200.  
  201. // Converting bool to bool is lossless.
  202. template <>
  203. struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool>
  204.     : public true_type {};  // NOLINT
  205.  
  206. // Converting bool to any integer type is lossless.
  207. template <typename To>
  208. struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To>
  209.     : public true_type {};  // NOLINT
  210.  
  211. // Converting bool to any floating-point type is lossless.
  212. template <typename To>
  213. struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To>
  214.     : public true_type {};  // NOLINT
  215.  
  216. // Converting an integer to bool is lossy.
  217. template <typename From>
  218. struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool>
  219.     : public false_type {};  // NOLINT
  220.  
  221. // Converting an integer to another non-bool integer is lossless iff
  222. // the target type's range encloses the source type's range.
  223. template <typename From, typename To>
  224. struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To>
  225.     : public bool_constant<
  226.       // When converting from a smaller size to a larger size, we are
  227.       // fine as long as we are not converting from signed to unsigned.
  228.       ((sizeof(From) < sizeof(To)) &&
  229.        (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) ||
  230.       // When converting between the same size, the signedness must match.
  231.       ((sizeof(From) == sizeof(To)) &&
  232.        (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {};  // NOLINT
  233.  
  234. #undef GMOCK_IS_SIGNED_
  235.  
  236. // Converting an integer to a floating-point type may be lossy, since
  237. // the format of a floating-point number is implementation-defined.
  238. template <typename From, typename To>
  239. struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To>
  240.     : public false_type {};  // NOLINT
  241.  
  242. // Converting a floating-point to bool is lossy.
  243. template <typename From>
  244. struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool>
  245.     : public false_type {};  // NOLINT
  246.  
  247. // Converting a floating-point to an integer is lossy.
  248. template <typename From, typename To>
  249. struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To>
  250.     : public false_type {};  // NOLINT
  251.  
  252. // Converting a floating-point to another floating-point is lossless
  253. // iff the target type is at least as big as the source type.
  254. template <typename From, typename To>
  255. struct LosslessArithmeticConvertibleImpl<
  256.   kFloatingPoint, From, kFloatingPoint, To>
  257.     : public bool_constant<sizeof(From) <= sizeof(To)> {};  // NOLINT
  258.  
  259. // LosslessArithmeticConvertible<From, To>::value is true iff arithmetic
  260. // type From can be losslessly converted to arithmetic type To.
  261. //
  262. // It's the user's responsibility to ensure that both From and To are
  263. // raw (i.e. has no CV modifier, is not a pointer, and is not a
  264. // reference) built-in arithmetic types; the value is
  265. // implementation-defined when the above pre-condition is violated.
  266. template <typename From, typename To>
  267. struct LosslessArithmeticConvertible
  268.     : public LosslessArithmeticConvertibleImpl<
  269.   GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {};  // NOLINT
  270.  
  271. // This interface knows how to report a Google Mock failure (either
  272. // non-fatal or fatal).
  273. class FailureReporterInterface {
  274.  public:
  275.   // The type of a failure (either non-fatal or fatal).
  276.   enum FailureType {
  277.     kNonfatal, kFatal
  278.   };
  279.  
  280.   virtual ~FailureReporterInterface() {}
  281.  
  282.   // Reports a failure that occurred at the given source file location.
  283.   virtual void ReportFailure(FailureType type, const char* file, int line,
  284.                              const std::string& message) = 0;
  285. };
  286.  
  287. // Returns the failure reporter used by Google Mock.
  288. GTEST_API_ FailureReporterInterface* GetFailureReporter();
  289.  
  290. // Asserts that condition is true; aborts the process with the given
  291. // message if condition is false.  We cannot use LOG(FATAL) or CHECK()
  292. // as Google Mock might be used to mock the log sink itself.  We
  293. // inline this function to prevent it from showing up in the stack
  294. // trace.
  295. inline void Assert(bool condition, const char* file, int line,
  296.                    const std::string& msg) {
  297.   if (!condition) {
  298.     GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal,
  299.                                         file, line, msg);
  300.   }
  301. }
  302. inline void Assert(bool condition, const char* file, int line) {
  303.   Assert(condition, file, line, "Assertion failed.");
  304. }
  305.  
  306. // Verifies that condition is true; generates a non-fatal failure if
  307. // condition is false.
  308. inline void Expect(bool condition, const char* file, int line,
  309.                    const std::string& msg) {
  310.   if (!condition) {
  311.     GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal,
  312.                                         file, line, msg);
  313.   }
  314. }
  315. inline void Expect(bool condition, const char* file, int line) {
  316.   Expect(condition, file, line, "Expectation failed.");
  317. }
  318.  
  319. // Severity level of a log.
  320. enum LogSeverity {
  321.   kInfo = 0,
  322.   kWarning = 1
  323. };
  324.  
  325. // Valid values for the --gmock_verbose flag.
  326.  
  327. // All logs (informational and warnings) are printed.
  328. const char kInfoVerbosity[] = "info";
  329. // Only warnings are printed.
  330. const char kWarningVerbosity[] = "warning";
  331. // No logs are printed.
  332. const char kErrorVerbosity[] = "error";
  333.  
  334. // Returns true iff a log with the given severity is visible according
  335. // to the --gmock_verbose flag.
  336. GTEST_API_ bool LogIsVisible(LogSeverity severity);
  337.  
  338. // Prints the given message to stdout iff 'severity' >= the level
  339. // specified by the --gmock_verbose flag.  If stack_frames_to_skip >=
  340. // 0, also prints the stack trace excluding the top
  341. // stack_frames_to_skip frames.  In opt mode, any positive
  342. // stack_frames_to_skip is treated as 0, since we don't know which
  343. // function calls will be inlined by the compiler and need to be
  344. // conservative.
  345. GTEST_API_ void Log(LogSeverity severity, const std::string& message,
  346.                     int stack_frames_to_skip);
  347.  
  348. // A marker class that is used to resolve parameterless expectations to the
  349. // correct overload. This must not be instantiable, to prevent client code from
  350. // accidentally resolving to the overload; for example:
  351. //
  352. //    ON_CALL(mock, Method({}, nullptr))...
  353. //
  354. class WithoutMatchers {
  355.  private:
  356.   WithoutMatchers() {}
  357.   friend GTEST_API_ WithoutMatchers GetWithoutMatchers();
  358. };
  359.  
  360. // Internal use only: access the singleton instance of WithoutMatchers.
  361. GTEST_API_ WithoutMatchers GetWithoutMatchers();
  362.  
  363. // FIXME: group all type utilities together.
  364.  
  365. // Type traits.
  366.  
  367. // is_reference<T>::value is non-zero iff T is a reference type.
  368. template <typename T> struct is_reference : public false_type {};
  369. template <typename T> struct is_reference<T&> : public true_type {};
  370.  
  371. // type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type.
  372. template <typename T1, typename T2> struct type_equals : public false_type {};
  373. template <typename T> struct type_equals<T, T> : public true_type {};
  374.  
  375. // remove_reference<T>::type removes the reference from type T, if any.
  376. template <typename T> struct remove_reference { typedef T type; };  // NOLINT
  377. template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT
  378.  
  379. // DecayArray<T>::type turns an array type U[N] to const U* and preserves
  380. // other types.  Useful for saving a copy of a function argument.
  381. template <typename T> struct DecayArray { typedef T type; };  // NOLINT
  382. template <typename T, size_t N> struct DecayArray<T[N]> {
  383.   typedef const T* type;
  384. };
  385. // Sometimes people use arrays whose size is not available at the use site
  386. // (e.g. extern const char kNamePrefix[]).  This specialization covers that
  387. // case.
  388. template <typename T> struct DecayArray<T[]> {
  389.   typedef const T* type;
  390. };
  391.  
  392. // Disable MSVC warnings for infinite recursion, since in this case the
  393. // the recursion is unreachable.
  394. #ifdef _MSC_VER
  395. # pragma warning(push)
  396. # pragma warning(disable:4717)
  397. #endif
  398.  
  399. // Invalid<T>() is usable as an expression of type T, but will terminate
  400. // the program with an assertion failure if actually run.  This is useful
  401. // when a value of type T is needed for compilation, but the statement
  402. // will not really be executed (or we don't care if the statement
  403. // crashes).
  404. template <typename T>
  405. inline T Invalid() {
  406.   Assert(false, "", -1, "Internal error: attempt to return invalid value");
  407.   // This statement is unreachable, and would never terminate even if it
  408.   // could be reached. It is provided only to placate compiler warnings
  409.   // about missing return statements.
  410.   return Invalid<T>();
  411. }
  412.  
  413. #ifdef _MSC_VER
  414. # pragma warning(pop)
  415. #endif
  416.  
  417. // Given a raw type (i.e. having no top-level reference or const
  418. // modifier) RawContainer that's either an STL-style container or a
  419. // native array, class StlContainerView<RawContainer> has the
  420. // following members:
  421. //
  422. //   - type is a type that provides an STL-style container view to
  423. //     (i.e. implements the STL container concept for) RawContainer;
  424. //   - const_reference is a type that provides a reference to a const
  425. //     RawContainer;
  426. //   - ConstReference(raw_container) returns a const reference to an STL-style
  427. //     container view to raw_container, which is a RawContainer.
  428. //   - Copy(raw_container) returns an STL-style container view of a
  429. //     copy of raw_container, which is a RawContainer.
  430. //
  431. // This generic version is used when RawContainer itself is already an
  432. // STL-style container.
  433. template <class RawContainer>
  434. class StlContainerView {
  435.  public:
  436.   typedef RawContainer type;
  437.   typedef const type& const_reference;
  438.  
  439.   static const_reference ConstReference(const RawContainer& container) {
  440.     // Ensures that RawContainer is not a const type.
  441.     testing::StaticAssertTypeEq<RawContainer,
  442.         GTEST_REMOVE_CONST_(RawContainer)>();
  443.     return container;
  444.   }
  445.   static type Copy(const RawContainer& container) { return container; }
  446. };
  447.  
  448. // This specialization is used when RawContainer is a native array type.
  449. template <typename Element, size_t N>
  450. class StlContainerView<Element[N]> {
  451.  public:
  452.   typedef GTEST_REMOVE_CONST_(Element) RawElement;
  453.   typedef internal::NativeArray<RawElement> type;
  454.   // NativeArray<T> can represent a native array either by value or by
  455.   // reference (selected by a constructor argument), so 'const type'
  456.   // can be used to reference a const native array.  We cannot
  457.   // 'typedef const type& const_reference' here, as that would mean
  458.   // ConstReference() has to return a reference to a local variable.
  459.   typedef const type const_reference;
  460.  
  461.   static const_reference ConstReference(const Element (&array)[N]) {
  462.     // Ensures that Element is not a const type.
  463.     testing::StaticAssertTypeEq<Element, RawElement>();
  464. #if GTEST_OS_SYMBIAN
  465.     // The Nokia Symbian compiler confuses itself in template instantiation
  466.     // for this call without the cast to Element*:
  467.     // function call '[testing::internal::NativeArray<char *>].NativeArray(
  468.     //     {lval} const char *[4], long, testing::internal::RelationToSource)'
  469.     //     does not match
  470.     // 'testing::internal::NativeArray<char *>::NativeArray(
  471.     //     char *const *, unsigned int, testing::internal::RelationToSource)'
  472.     // (instantiating: 'testing::internal::ContainsMatcherImpl
  473.     //     <const char * (&)[4]>::Matches(const char * (&)[4]) const')
  474.     // (instantiating: 'testing::internal::StlContainerView<char *[4]>::
  475.     //     ConstReference(const char * (&)[4])')
  476.     // (and though the N parameter type is mismatched in the above explicit
  477.     // conversion of it doesn't help - only the conversion of the array).
  478.     return type(const_cast<Element*>(&array[0]), N,
  479.                 RelationToSourceReference());
  480. #else
  481.     return type(array, N, RelationToSourceReference());
  482. #endif  // GTEST_OS_SYMBIAN
  483.   }
  484.   static type Copy(const Element (&array)[N]) {
  485. #if GTEST_OS_SYMBIAN
  486.     return type(const_cast<Element*>(&array[0]), N, RelationToSourceCopy());
  487. #else
  488.     return type(array, N, RelationToSourceCopy());
  489. #endif  // GTEST_OS_SYMBIAN
  490.   }
  491. };
  492.  
  493. // This specialization is used when RawContainer is a native array
  494. // represented as a (pointer, size) tuple.
  495. template <typename ElementPointer, typename Size>
  496. class StlContainerView< ::testing::tuple<ElementPointer, Size> > {
  497.  public:
  498.   typedef GTEST_REMOVE_CONST_(
  499.       typename internal::PointeeOf<ElementPointer>::type) RawElement;
  500.   typedef internal::NativeArray<RawElement> type;
  501.   typedef const type const_reference;
  502.  
  503.   static const_reference ConstReference(
  504.       const ::testing::tuple<ElementPointer, Size>& array) {
  505.     return type(get<0>(array), get<1>(array), RelationToSourceReference());
  506.   }
  507.   static type Copy(const ::testing::tuple<ElementPointer, Size>& array) {
  508.     return type(get<0>(array), get<1>(array), RelationToSourceCopy());
  509.   }
  510. };
  511.  
  512. // The following specialization prevents the user from instantiating
  513. // StlContainer with a reference type.
  514. template <typename T> class StlContainerView<T&>;
  515.  
  516. // A type transform to remove constness from the first part of a pair.
  517. // Pairs like that are used as the value_type of associative containers,
  518. // and this transform produces a similar but assignable pair.
  519. template <typename T>
  520. struct RemoveConstFromKey {
  521.   typedef T type;
  522. };
  523.  
  524. // Partially specialized to remove constness from std::pair<const K, V>.
  525. template <typename K, typename V>
  526. struct RemoveConstFromKey<std::pair<const K, V> > {
  527.   typedef std::pair<K, V> type;
  528. };
  529.  
  530. // Mapping from booleans to types. Similar to boost::bool_<kValue> and
  531. // std::integral_constant<bool, kValue>.
  532. template <bool kValue>
  533. struct BooleanConstant {};
  534.  
  535. // Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to
  536. // reduce code size.
  537. GTEST_API_ void IllegalDoDefault(const char* file, int line);
  538.  
  539. #if GTEST_LANG_CXX11
  540. // Helper types for Apply() below.
  541. template <size_t... Is> struct int_pack { typedef int_pack type; };
  542.  
  543. template <class Pack, size_t I> struct append;
  544. template <size_t... Is, size_t I>
  545. struct append<int_pack<Is...>, I> : int_pack<Is..., I> {};
  546.  
  547. template <size_t C>
  548. struct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {};
  549. template <> struct make_int_pack<0> : int_pack<> {};
  550.  
  551. template <typename F, typename Tuple, size_t... Idx>
  552. auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype(
  553.     std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) {
  554.   return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...);
  555. }
  556.  
  557. // Apply the function to a tuple of arguments.
  558. template <typename F, typename Tuple>
  559. auto Apply(F&& f, Tuple&& args)
  560.     -> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
  561.                           make_int_pack<std::tuple_size<Tuple>::value>())) {
  562.   return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
  563.                    make_int_pack<std::tuple_size<Tuple>::value>());
  564. }
  565. #endif
  566.  
  567.  
  568. #ifdef _MSC_VER
  569. # pragma warning(pop)
  570. #endif
  571.  
  572. }  // namespace internal
  573. }  // namespace testing
  574.  
  575. #endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_
  576.