SMIL  1.0.4
DTraits.hpp
1 /*
2  * Copyright (c) 2011-2016, Matthieu FAESSEL and ARMINES
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are 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 copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * * Neither the name of Matthieu FAESSEL, or ARMINES nor the
14  * names of its contributors may be used to endorse or promote products
15  * derived from this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 
30 #ifndef _D_TRAITS_HPP
31 #define _D_TRAITS_HPP
32 
33 
34 
35 namespace smil
36 {
37  template<bool C, typename T = void>
38  struct enable_if
39  {
40  typedef T type;
41  };
42 
43  template<typename T>
44  struct enable_if<false, T> { };
45 
46  template<typename, typename>
47  struct is_same
48  {
49  static bool const value = false;
50  };
51 
52  template<typename A>
53  struct is_same<A, A>
54  {
55  static bool const value = true;
56  };
57 
58  template<typename B, typename D>
59  struct is_base_of
60  {
61  private:
62  static D* m_d;
63 
64  private:
65  static char check( B* );
66  static long check( ... );
67 
68  public:
69  static bool const value = sizeof check(m_d) == 1 && !is_same<B volatile const, void volatile const>::value;
70  };
71 
72  template <typename T>
73  struct is_integer
74  {
75  static bool const value = !std::numeric_limits<T>::is_iec559;
76  };
77 
78  template <typename T>
79  struct is_float
80  {
81  static bool const value = std::numeric_limits<T>::is_iec559;
82  };
83 
84 
85  #define ENABLE_IF(COND, RET_TYPE) typename smil::enable_if< ( COND ), RET_TYPE >::type
86  #define IS_SAME(A, B) ( smil::is_same<A, B>::value )
87  #define IS_DERIVED_FROM(D, B) ( smil::is_base_of<B, D>::value )
88  #define IS_INTEGER(T) ( smil::is_integer<T>::value )
89  #define IS_FLOAT(T) ( smil::is_float<T>::value )
90 
91 } // namespace smil
92 
93 #endif // _D_TRAITS_HPP
Definition: DTraits.hpp:39
Definition: DTraits.hpp:60
Definition: DTraits.hpp:80
Definition: DTraits.hpp:74
Definition: DTraits.hpp:48