Nugget
call_traits.h
1 // Copyright (c) Electronic Arts Inc. All rights reserved.
4 
6 // The design for call_traits here is very similar to that found in template
7 // metaprogramming libraries such as Boost, GCC, and Metrowerks, given that
8 // these libraries have established this interface as a defacto standard for
9 // solving this problem. Also, these are described in various books on the
10 // topic of template metaprogramming, such as "Modern C++ Design".
11 //
12 // See http://www.boost.org/libs/utility/call_traits.htm or search for
13 // call_traits in Google for a description of call_traits.
15 
16 
17 #ifndef EASTL_CALL_TRAITS_H
18 #define EASTL_CALL_TRAITS_H
19 
20 
21 #include <EASTL/internal/config.h>
22 #include <EASTL/type_traits.h>
23 
24 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
25  #pragma once // Some compilers (e.g. VC++) benefit significantly from using this. We've measured 3-4% build speed improvements in apps as a result.
26 #endif
27 
28 
29 
30 namespace eastl
31 {
32 
33 
34  template <typename T, bool small_>
35  struct ct_imp2 { typedef const T& param_type; };
36 
37  template <typename T>
38  struct ct_imp2<T, true> { typedef const T param_type; };
39 
40  template <typename T, bool isp, bool b1>
41  struct ct_imp { typedef const T& param_type; };
42 
43  template <typename T, bool isp>
44  struct ct_imp<T, isp, true> { typedef typename ct_imp2<T, sizeof(T) <= sizeof(void*)>::param_type param_type; };
45 
46  template <typename T, bool b1>
47  struct ct_imp<T, true, b1> { typedef T const param_type; };
48 
49 
50 
51  template <typename T>
52  struct call_traits
53  {
54  public:
55  typedef T value_type;
56  typedef T& reference;
57  typedef const T& const_reference;
58  typedef typename ct_imp<T, is_pointer<T>::value, is_arithmetic<T>::value>::param_type param_type;
59  };
60 
61 
62  template <typename T>
63  struct call_traits<T&>
64  {
65  typedef T& value_type;
66  typedef T& reference;
67  typedef const T& const_reference;
68  typedef T& param_type;
69  };
70 
71 
72  template <typename T, size_t N>
73  struct call_traits<T [N]>
74  {
75  private:
76  typedef T array_type[N];
77 
78  public:
79  typedef const T* value_type;
80  typedef array_type& reference;
81  typedef const array_type& const_reference;
82  typedef const T* const param_type;
83  };
84 
85 
86  template <typename T, size_t N>
87  struct call_traits<const T [N]>
88  {
89  private:
90  typedef const T array_type[N];
91 
92  public:
93  typedef const T* value_type;
94  typedef array_type& reference;
95  typedef const array_type& const_reference;
96  typedef const T* const param_type;
97  };
98 
99 
100 } // namespace eastl
101 
102 
103 #endif // Header include guard
104 
105 
106 
107 
108 
109 
110 
111 
112 
113 
114 
115 
116 
117 
EA Standard Template Library.
Definition: algorithm.h:288
Definition: call_traits.h:53
Definition: call_traits.h:35
Definition: call_traits.h:41
Definition: type_fundamental.h:213