15 #ifndef INCG_IRIS_IUTEST_INTERNAL_DEFS_HPP_4B0AF5C2_8E8D_43EF_BFC5_F385E68F18DB_
16 #define INCG_IRIS_IUTEST_INTERNAL_DEFS_HPP_4B0AF5C2_8E8D_43EF_BFC5_F385E68F18DB_
20 #include "../iutest_defs.hpp"
27 #if IUTEST_HAS_HDR_CXXABI
37 #ifdef __INTEL_COMPILER
38 # define IUTEST_AMBIGUOUS_ELSE_BLOCKER_
40 # define IUTEST_AMBIGUOUS_ELSE_BLOCKER_ switch(::iutest::detail::AlwaysZero()) case 0: default:
43 #define IUTEST_SUPPRESS_UNREACHABLE_CODE_WARNING(statement) if( ::iutest::detail::AlwaysTrue() ) statement
46 #define IUTEST_MBS_CODE_UNKNOWN 0
47 #define IUTEST_MBS_CODE_UTF8 1
48 #define IUTEST_MBS_CODE_WINDOWS31J 2
49 #ifndef IUTEST_MBS_CODE
50 # if defined(IUTEST_OS_WINDOWS)
51 # define IUTEST_MBS_CODE IUTEST_MBS_CODE_WINDOWS31J
53 # define IUTEST_MBS_CODE IUTEST_MBS_CODE_UTF8
62 # define NULL (void*)0
67 # if defined(__MINGW32__)
68 # define IUTEST_BREAK() DebugBreak()
69 # elif defined(_MSC_VER)
71 # define IUTEST_BREAK() __debugbreak()
73 # define IUTEST_BREAK() DebugBreak()
75 # elif defined(IUTEST_OS_MAC)
77 # if defined(__ppc64__) || defined(__ppc__)
78 # define IUTEST_BREAK() __asm__("li r0, 20\nsc\nnop\nli r0, 37\nli r4, 2\nsc\nnop\n" : : : "memory", "r0", "r3", "r4" )
80 # define IUTEST_BREAK() __asm__("int $3\n" : : )
82 # elif defined(__GUNC__) && (defined (__i386__) || defined (__x86_64__))
83 # define IUTEST_BREAK() do { __asm { int 3 } } while(::iutest::detail::AlwaysFalse())
84 # elif defined(__clang__) || defined(__GNUC__)
85 # define IUTEST_BREAK() __builtin_trap()
86 # elif defined(__ARMCC_VERSION)
87 # define IUTEST_BREAK() do { __breakpoint(0xF02C); } while(::iutest::detail::AlwaysFalse())
89 # define IUTEST_BREAK() *static_cast<volatile int*>(NULL) = 1
94 #if IUTEST_HAS_IF_EXISTS
95 # define IUTEST_IF_EXISTS(identifier_, statement_) __if_exists(identifier_) { statement_ }
96 # define IUTEST_IF_NOT_EXISTS(identifier_, statement_) __if_not_exists(identifier_) { statement_ }
97 # define IUTEST_STATIC_EXISTS(identifier_) IUTEST_IF_EXISTS(identifier_, true) IUTEST_IF_NOT_EXISTS(identifier_, false)
99 # define IUTEST_IF_EXISTS(identifier_, statement_)
100 # define IUTEST_IF_NOT_EXISTS(identifier_, statement_)
101 # define IUTEST_STATIC_EXISTS(identifier_)
104 #if IUTEST_HAS_LIB && IUTEST_HAS_EXTERN_TEMPLATE
106 IUTEST_PRAGMA_EXTERN_TEMPLATE_WARN_DISABLE_BEGIN()
108 extern template class ::std::vector< ::std::basic_string<
char> >;
109 extern template class ::std::vector< ::std::basic_string<
wchar_t> >;
111 IUTEST_PRAGMA_EXTERN_TEMPLATE_WARN_DISABLE_END()
118 namespace type_traits = iutest_type_traits;
125 #if IUTEST_HAS_NULLPTR && !defined(IUTEST_NO_NULL_TO_NULLPTR_T)
126 typedef ::std::nullptr_t iu_nullptr_convertible_t;
128 typedef ::iutest_compatible::IsNullLiteralHelper::Object* iu_nullptr_convertible_t;
137 inline bool AlwaysTrue() {
return true; }
142 inline bool AlwaysFalse() {
return !AlwaysTrue(); }
147 inline int AlwaysZero() {
return 0; }
152 inline bool IsTrue(
bool b) {
return b; }
158 using namespace iutest_type_traits;
159 using namespace iutest_compatible;
161 #if !defined(IUTEST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
166 template<
typename Ite>
167 struct IteratorTraits
169 typedef typename Ite::value_type type;
172 struct IteratorTraits<T*>
177 struct IteratorTraits<const T*>
188 inline void Delete(T* ptr)
206 struct explicit_type_t {};
208 #if defined(IUTEST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS)
209 # define IUTEST_EXPLICIT_TEMPLATE_TYPE_(t) ::iutest::detail::explicit_type_t<t>*
210 # define IUTEST_APPEND_EXPLICIT_TEMPLATE_TYPE_(t) , ::iutest::detail::explicit_type_t<t>*
212 # define IUTEST_EXPLICIT_TEMPLATE_TYPE_(t)
213 # define IUTEST_APPEND_EXPLICIT_TEMPLATE_TYPE_(t)
217 inline explicit_type_t<T>* explicit_type() {
return NULL; }
223 class TypeUniqueCounter
227 static size_t count() {
return value++; }
229 template<
typename T>
size_t TypeUniqueCounter<T>::value = 0;
232 inline size_t GetTypeUniqueCounter() {
return TypeUniqueCounter<T>::count(); }
243 explicit auto_ptr(T* p = NULL) : m_ptr(p) {}
244 auto_ptr(
const auto_ptr& rhs) : m_ptr(rhs.m_ptr) { rhs.m_ptr = NULL; }
245 ~auto_ptr() {
if( m_ptr != NULL )
delete m_ptr; }
247 T& operator * ()
const {
return *m_ptr; }
248 T* operator -> ()
const {
return m_ptr; }
250 auto_ptr& operator = (auto_ptr& rhs) { m_ptr = rhs.m_ptr; rhs.m_ptr = NULL;
return *
this; }
252 T* get() {
return m_ptr; }
264 explicit scoped_ptr(T* p=NULL) : m_ptr(p) {}
265 ~scoped_ptr() { reset(); }
267 T& operator * ()
const {
return *m_ptr; }
268 T* operator -> ()
const {
return m_ptr; }
270 T* get()
const {
return m_ptr; }
278 void reset(T* p=NULL)
282 if( IsTrue(
sizeof(T) > 0) )
297 #define IUTEST_IS_NULLLITERAL(x) \
298 (sizeof(::iutest::detail::IsNullLiteralHelper::IsNullLiteral(x)) == 1)
304 struct IsContainerHelper
311 ,
typename T::iterator* =NULL,
typename T::const_iterator* =NULL) {
return 0; }
314 static IUTEST_CXX_CONSTEXPR no_t IsContainer(
long IUTEST_APPEND_EXPLICIT_TEMPLATE_TYPE_(T)) {
return 0; }
321 inline ::std::string GetTypeName()
324 const char*
const name =
typeid(T).name();
326 #if IUTEST_HAS_HDR_CXXABI
327 using abi::__cxa_demangle;
329 char*
const read_name = __cxa_demangle(name, 0, 0, &status);
330 ::std::string str(status == 0 ? read_name : name);
344 #define IIUT_GeTypeNameSpecialization(type) \
345 template<>inline ::std::string GetTypeName<type>() { return #type; } \
346 template<>inline ::std::string GetTypeName<type*>() { return #type "*"; }
348 #define IIUT_GeTypeNameSpecialization2(type) \
349 IIUT_GeTypeNameSpecialization(type) \
350 IIUT_GeTypeNameSpecialization(unsigned type)
352 IIUT_GeTypeNameSpecialization2(
char)
353 IIUT_GeTypeNameSpecialization2(
short)
354 IIUT_GeTypeNameSpecialization2(
int)
355 IIUT_GeTypeNameSpecialization2(
long)
356 IIUT_GeTypeNameSpecialization(
float)
357 IIUT_GeTypeNameSpecialization(
double)
358 IIUT_GeTypeNameSpecialization(
bool)
360 #undef IIUT_GeTypeNameSpecialization
361 #undef IIUT_GeTypeNameSpecialization2
369 struct GetTypeNameProxy
371 static ::std::string GetTypeName() {
return detail::GetTypeName<T>(); }
378 #endif // INCG_IRIS_IUTEST_INTERNAL_DEFS_HPP_4B0AF5C2_8E8D_43EF_BFC5_F385E68F18DB_