yaml-cpp

FORK: A YAML parser and emitter in C++
git clone https://git.neptards.moe/neptards/yaml-cpp.git
Log | Files | Refs | README | LICENSE

gmock-internal-utils.h (20000B)


      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 <type_traits>
     46 #include "gmock/internal/gmock-port.h"
     47 #include "gtest/gtest.h"
     48 
     49 namespace testing {
     50 
     51 template <typename>
     52 class Matcher;
     53 
     54 namespace internal {
     55 
     56 // Silence MSVC C4100 (unreferenced formal parameter) and
     57 // C4805('==': unsafe mix of type 'const int' and type 'const bool')
     58 #ifdef _MSC_VER
     59 # pragma warning(push)
     60 # pragma warning(disable:4100)
     61 # pragma warning(disable:4805)
     62 #endif
     63 
     64 // Joins a vector of strings as if they are fields of a tuple; returns
     65 // the joined string.
     66 GTEST_API_ std::string JoinAsTuple(const Strings& fields);
     67 
     68 // Converts an identifier name to a space-separated list of lower-case
     69 // words.  Each maximum substring of the form [A-Za-z][a-z]*|\d+ is
     70 // treated as one word.  For example, both "FooBar123" and
     71 // "foo_bar_123" are converted to "foo bar 123".
     72 GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name);
     73 
     74 // PointeeOf<Pointer>::type is the type of a value pointed to by a
     75 // Pointer, which can be either a smart pointer or a raw pointer.  The
     76 // following default implementation is for the case where Pointer is a
     77 // smart pointer.
     78 template <typename Pointer>
     79 struct PointeeOf {
     80   // Smart pointer classes define type element_type as the type of
     81   // their pointees.
     82   typedef typename Pointer::element_type type;
     83 };
     84 // This specialization is for the raw pointer case.
     85 template <typename T>
     86 struct PointeeOf<T*> { typedef T type; };  // NOLINT
     87 
     88 // GetRawPointer(p) returns the raw pointer underlying p when p is a
     89 // smart pointer, or returns p itself when p is already a raw pointer.
     90 // The following default implementation is for the smart pointer case.
     91 template <typename Pointer>
     92 inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {
     93   return p.get();
     94 }
     95 // This overloaded version is for the raw pointer case.
     96 template <typename Element>
     97 inline Element* GetRawPointer(Element* p) { return p; }
     98 
     99 // MSVC treats wchar_t as a native type usually, but treats it as the
    100 // same as unsigned short when the compiler option /Zc:wchar_t- is
    101 // specified.  It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t
    102 // is a native type.
    103 #if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)
    104 // wchar_t is a typedef.
    105 #else
    106 # define GMOCK_WCHAR_T_IS_NATIVE_ 1
    107 #endif
    108 
    109 // In what follows, we use the term "kind" to indicate whether a type
    110 // is bool, an integer type (excluding bool), a floating-point type,
    111 // or none of them.  This categorization is useful for determining
    112 // when a matcher argument type can be safely converted to another
    113 // type in the implementation of SafeMatcherCast.
    114 enum TypeKind {
    115   kBool, kInteger, kFloatingPoint, kOther
    116 };
    117 
    118 // KindOf<T>::value is the kind of type T.
    119 template <typename T> struct KindOf {
    120   enum { value = kOther };  // The default kind.
    121 };
    122 
    123 // This macro declares that the kind of 'type' is 'kind'.
    124 #define GMOCK_DECLARE_KIND_(type, kind) \
    125   template <> struct KindOf<type> { enum { value = kind }; }
    126 
    127 GMOCK_DECLARE_KIND_(bool, kBool);
    128 
    129 // All standard integer types.
    130 GMOCK_DECLARE_KIND_(char, kInteger);
    131 GMOCK_DECLARE_KIND_(signed char, kInteger);
    132 GMOCK_DECLARE_KIND_(unsigned char, kInteger);
    133 GMOCK_DECLARE_KIND_(short, kInteger);  // NOLINT
    134 GMOCK_DECLARE_KIND_(unsigned short, kInteger);  // NOLINT
    135 GMOCK_DECLARE_KIND_(int, kInteger);
    136 GMOCK_DECLARE_KIND_(unsigned int, kInteger);
    137 GMOCK_DECLARE_KIND_(long, kInteger);  // NOLINT
    138 GMOCK_DECLARE_KIND_(unsigned long, kInteger);  // NOLINT
    139 
    140 #if GMOCK_WCHAR_T_IS_NATIVE_
    141 GMOCK_DECLARE_KIND_(wchar_t, kInteger);
    142 #endif
    143 
    144 // Non-standard integer types.
    145 GMOCK_DECLARE_KIND_(Int64, kInteger);
    146 GMOCK_DECLARE_KIND_(UInt64, kInteger);
    147 
    148 // All standard floating-point types.
    149 GMOCK_DECLARE_KIND_(float, kFloatingPoint);
    150 GMOCK_DECLARE_KIND_(double, kFloatingPoint);
    151 GMOCK_DECLARE_KIND_(long double, kFloatingPoint);
    152 
    153 #undef GMOCK_DECLARE_KIND_
    154 
    155 // Evaluates to the kind of 'type'.
    156 #define GMOCK_KIND_OF_(type) \
    157   static_cast< ::testing::internal::TypeKind>( \
    158       ::testing::internal::KindOf<type>::value)
    159 
    160 // Evaluates to true if and only if integer type T is signed.
    161 #define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)
    162 
    163 // LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value
    164 // is true if and only if arithmetic type From can be losslessly converted to
    165 // arithmetic type To.
    166 //
    167 // It's the user's responsibility to ensure that both From and To are
    168 // raw (i.e. has no CV modifier, is not a pointer, and is not a
    169 // reference) built-in arithmetic types, kFromKind is the kind of
    170 // From, and kToKind is the kind of To; the value is
    171 // implementation-defined when the above pre-condition is violated.
    172 template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To>
    173 struct LosslessArithmeticConvertibleImpl : public std::false_type {};
    174 
    175 // Converting bool to bool is lossless.
    176 template <>
    177 struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool>
    178     : public std::true_type {};
    179 
    180 // Converting bool to any integer type is lossless.
    181 template <typename To>
    182 struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To>
    183     : public std::true_type {};
    184 
    185 // Converting bool to any floating-point type is lossless.
    186 template <typename To>
    187 struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To>
    188     : public std::true_type {};
    189 
    190 // Converting an integer to bool is lossy.
    191 template <typename From>
    192 struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool>
    193     : public std::false_type {};
    194 
    195 // Converting an integer to another non-bool integer is lossless
    196 // if and only if the target type's range encloses the source type's range.
    197 template <typename From, typename To>
    198 struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To>
    199     : public bool_constant<
    200       // When converting from a smaller size to a larger size, we are
    201       // fine as long as we are not converting from signed to unsigned.
    202       ((sizeof(From) < sizeof(To)) &&
    203        (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) ||
    204       // When converting between the same size, the signedness must match.
    205       ((sizeof(From) == sizeof(To)) &&
    206        (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {};  // NOLINT
    207 
    208 #undef GMOCK_IS_SIGNED_
    209 
    210 // Converting an integer to a floating-point type may be lossy, since
    211 // the format of a floating-point number is implementation-defined.
    212 template <typename From, typename To>
    213 struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To>
    214     : public std::false_type {};
    215 
    216 // Converting a floating-point to bool is lossy.
    217 template <typename From>
    218 struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool>
    219     : public std::false_type {};
    220 
    221 // Converting a floating-point to an integer is lossy.
    222 template <typename From, typename To>
    223 struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To>
    224     : public std::false_type {};
    225 
    226 // Converting a floating-point to another floating-point is lossless
    227 // if and only if the target type is at least as big as the source type.
    228 template <typename From, typename To>
    229 struct LosslessArithmeticConvertibleImpl<
    230   kFloatingPoint, From, kFloatingPoint, To>
    231     : public bool_constant<sizeof(From) <= sizeof(To)> {};  // NOLINT
    232 
    233 // LosslessArithmeticConvertible<From, To>::value is true if and only if
    234 // arithmetic type From can be losslessly converted to arithmetic type To.
    235 //
    236 // It's the user's responsibility to ensure that both From and To are
    237 // raw (i.e. has no CV modifier, is not a pointer, and is not a
    238 // reference) built-in arithmetic types; the value is
    239 // implementation-defined when the above pre-condition is violated.
    240 template <typename From, typename To>
    241 struct LosslessArithmeticConvertible
    242     : public LosslessArithmeticConvertibleImpl<
    243   GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {};  // NOLINT
    244 
    245 // This interface knows how to report a Google Mock failure (either
    246 // non-fatal or fatal).
    247 class FailureReporterInterface {
    248  public:
    249   // The type of a failure (either non-fatal or fatal).
    250   enum FailureType {
    251     kNonfatal, kFatal
    252   };
    253 
    254   virtual ~FailureReporterInterface() {}
    255 
    256   // Reports a failure that occurred at the given source file location.
    257   virtual void ReportFailure(FailureType type, const char* file, int line,
    258                              const std::string& message) = 0;
    259 };
    260 
    261 // Returns the failure reporter used by Google Mock.
    262 GTEST_API_ FailureReporterInterface* GetFailureReporter();
    263 
    264 // Asserts that condition is true; aborts the process with the given
    265 // message if condition is false.  We cannot use LOG(FATAL) or CHECK()
    266 // as Google Mock might be used to mock the log sink itself.  We
    267 // inline this function to prevent it from showing up in the stack
    268 // trace.
    269 inline void Assert(bool condition, const char* file, int line,
    270                    const std::string& msg) {
    271   if (!condition) {
    272     GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal,
    273                                         file, line, msg);
    274   }
    275 }
    276 inline void Assert(bool condition, const char* file, int line) {
    277   Assert(condition, file, line, "Assertion failed.");
    278 }
    279 
    280 // Verifies that condition is true; generates a non-fatal failure if
    281 // condition is false.
    282 inline void Expect(bool condition, const char* file, int line,
    283                    const std::string& msg) {
    284   if (!condition) {
    285     GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal,
    286                                         file, line, msg);
    287   }
    288 }
    289 inline void Expect(bool condition, const char* file, int line) {
    290   Expect(condition, file, line, "Expectation failed.");
    291 }
    292 
    293 // Severity level of a log.
    294 enum LogSeverity {
    295   kInfo = 0,
    296   kWarning = 1
    297 };
    298 
    299 // Valid values for the --gmock_verbose flag.
    300 
    301 // All logs (informational and warnings) are printed.
    302 const char kInfoVerbosity[] = "info";
    303 // Only warnings are printed.
    304 const char kWarningVerbosity[] = "warning";
    305 // No logs are printed.
    306 const char kErrorVerbosity[] = "error";
    307 
    308 // Returns true if and only if a log with the given severity is visible
    309 // according to the --gmock_verbose flag.
    310 GTEST_API_ bool LogIsVisible(LogSeverity severity);
    311 
    312 // Prints the given message to stdout if and only if 'severity' >= the level
    313 // specified by the --gmock_verbose flag.  If stack_frames_to_skip >=
    314 // 0, also prints the stack trace excluding the top
    315 // stack_frames_to_skip frames.  In opt mode, any positive
    316 // stack_frames_to_skip is treated as 0, since we don't know which
    317 // function calls will be inlined by the compiler and need to be
    318 // conservative.
    319 GTEST_API_ void Log(LogSeverity severity, const std::string& message,
    320                     int stack_frames_to_skip);
    321 
    322 // A marker class that is used to resolve parameterless expectations to the
    323 // correct overload. This must not be instantiable, to prevent client code from
    324 // accidentally resolving to the overload; for example:
    325 //
    326 //    ON_CALL(mock, Method({}, nullptr))...
    327 //
    328 class WithoutMatchers {
    329  private:
    330   WithoutMatchers() {}
    331   friend GTEST_API_ WithoutMatchers GetWithoutMatchers();
    332 };
    333 
    334 // Internal use only: access the singleton instance of WithoutMatchers.
    335 GTEST_API_ WithoutMatchers GetWithoutMatchers();
    336 
    337 // Type traits.
    338 
    339 // Disable MSVC warnings for infinite recursion, since in this case the
    340 // the recursion is unreachable.
    341 #ifdef _MSC_VER
    342 # pragma warning(push)
    343 # pragma warning(disable:4717)
    344 #endif
    345 
    346 // Invalid<T>() is usable as an expression of type T, but will terminate
    347 // the program with an assertion failure if actually run.  This is useful
    348 // when a value of type T is needed for compilation, but the statement
    349 // will not really be executed (or we don't care if the statement
    350 // crashes).
    351 template <typename T>
    352 inline T Invalid() {
    353   Assert(false, "", -1, "Internal error: attempt to return invalid value");
    354   // This statement is unreachable, and would never terminate even if it
    355   // could be reached. It is provided only to placate compiler warnings
    356   // about missing return statements.
    357   return Invalid<T>();
    358 }
    359 
    360 #ifdef _MSC_VER
    361 # pragma warning(pop)
    362 #endif
    363 
    364 // Given a raw type (i.e. having no top-level reference or const
    365 // modifier) RawContainer that's either an STL-style container or a
    366 // native array, class StlContainerView<RawContainer> has the
    367 // following members:
    368 //
    369 //   - type is a type that provides an STL-style container view to
    370 //     (i.e. implements the STL container concept for) RawContainer;
    371 //   - const_reference is a type that provides a reference to a const
    372 //     RawContainer;
    373 //   - ConstReference(raw_container) returns a const reference to an STL-style
    374 //     container view to raw_container, which is a RawContainer.
    375 //   - Copy(raw_container) returns an STL-style container view of a
    376 //     copy of raw_container, which is a RawContainer.
    377 //
    378 // This generic version is used when RawContainer itself is already an
    379 // STL-style container.
    380 template <class RawContainer>
    381 class StlContainerView {
    382  public:
    383   typedef RawContainer type;
    384   typedef const type& const_reference;
    385 
    386   static const_reference ConstReference(const RawContainer& container) {
    387     static_assert(!std::is_const<RawContainer>::value,
    388                   "RawContainer type must not be const");
    389     return container;
    390   }
    391   static type Copy(const RawContainer& container) { return container; }
    392 };
    393 
    394 // This specialization is used when RawContainer is a native array type.
    395 template <typename Element, size_t N>
    396 class StlContainerView<Element[N]> {
    397  public:
    398   typedef typename std::remove_const<Element>::type RawElement;
    399   typedef internal::NativeArray<RawElement> type;
    400   // NativeArray<T> can represent a native array either by value or by
    401   // reference (selected by a constructor argument), so 'const type'
    402   // can be used to reference a const native array.  We cannot
    403   // 'typedef const type& const_reference' here, as that would mean
    404   // ConstReference() has to return a reference to a local variable.
    405   typedef const type const_reference;
    406 
    407   static const_reference ConstReference(const Element (&array)[N]) {
    408     static_assert(std::is_same<Element, RawElement>::value,
    409                   "Element type must not be const");
    410     return type(array, N, RelationToSourceReference());
    411   }
    412   static type Copy(const Element (&array)[N]) {
    413     return type(array, N, RelationToSourceCopy());
    414   }
    415 };
    416 
    417 // This specialization is used when RawContainer is a native array
    418 // represented as a (pointer, size) tuple.
    419 template <typename ElementPointer, typename Size>
    420 class StlContainerView< ::std::tuple<ElementPointer, Size> > {
    421  public:
    422   typedef typename std::remove_const<
    423       typename internal::PointeeOf<ElementPointer>::type>::type RawElement;
    424   typedef internal::NativeArray<RawElement> type;
    425   typedef const type const_reference;
    426 
    427   static const_reference ConstReference(
    428       const ::std::tuple<ElementPointer, Size>& array) {
    429     return type(std::get<0>(array), std::get<1>(array),
    430                 RelationToSourceReference());
    431   }
    432   static type Copy(const ::std::tuple<ElementPointer, Size>& array) {
    433     return type(std::get<0>(array), std::get<1>(array), RelationToSourceCopy());
    434   }
    435 };
    436 
    437 // The following specialization prevents the user from instantiating
    438 // StlContainer with a reference type.
    439 template <typename T> class StlContainerView<T&>;
    440 
    441 // A type transform to remove constness from the first part of a pair.
    442 // Pairs like that are used as the value_type of associative containers,
    443 // and this transform produces a similar but assignable pair.
    444 template <typename T>
    445 struct RemoveConstFromKey {
    446   typedef T type;
    447 };
    448 
    449 // Partially specialized to remove constness from std::pair<const K, V>.
    450 template <typename K, typename V>
    451 struct RemoveConstFromKey<std::pair<const K, V> > {
    452   typedef std::pair<K, V> type;
    453 };
    454 
    455 // Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to
    456 // reduce code size.
    457 GTEST_API_ void IllegalDoDefault(const char* file, int line);
    458 
    459 template <typename F, typename Tuple, size_t... Idx>
    460 auto ApplyImpl(F&& f, Tuple&& args, IndexSequence<Idx...>) -> decltype(
    461     std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) {
    462   return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...);
    463 }
    464 
    465 // Apply the function to a tuple of arguments.
    466 template <typename F, typename Tuple>
    467 auto Apply(F&& f, Tuple&& args)
    468     -> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
    469                           MakeIndexSequence<std::tuple_size<Tuple>::value>())) {
    470   return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),
    471                    MakeIndexSequence<std::tuple_size<Tuple>::value>());
    472 }
    473 
    474 // Template struct Function<F>, where F must be a function type, contains
    475 // the following typedefs:
    476 //
    477 //   Result:               the function's return type.
    478 //   Arg<N>:               the type of the N-th argument, where N starts with 0.
    479 //   ArgumentTuple:        the tuple type consisting of all parameters of F.
    480 //   ArgumentMatcherTuple: the tuple type consisting of Matchers for all
    481 //                         parameters of F.
    482 //   MakeResultVoid:       the function type obtained by substituting void
    483 //                         for the return type of F.
    484 //   MakeResultIgnoredValue:
    485 //                         the function type obtained by substituting Something
    486 //                         for the return type of F.
    487 template <typename T>
    488 struct Function;
    489 
    490 template <typename R, typename... Args>
    491 struct Function<R(Args...)> {
    492   using Result = R;
    493   static constexpr size_t ArgumentCount = sizeof...(Args);
    494   template <size_t I>
    495   using Arg = ElemFromList<I, typename MakeIndexSequence<sizeof...(Args)>::type,
    496                            Args...>;
    497   using ArgumentTuple = std::tuple<Args...>;
    498   using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;
    499   using MakeResultVoid = void(Args...);
    500   using MakeResultIgnoredValue = IgnoredValue(Args...);
    501 };
    502 
    503 template <typename R, typename... Args>
    504 constexpr size_t Function<R(Args...)>::ArgumentCount;
    505 
    506 #ifdef _MSC_VER
    507 # pragma warning(pop)
    508 #endif
    509 
    510 }  // namespace internal
    511 }  // namespace testing
    512 
    513 #endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_