1 //===- TypeTraits.h -------------------------------------------------------===//
2 //
3 //                     The MCLinker Project
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 #ifndef MCLD_ADT_TYPETRAITS_H_
10 #define MCLD_ADT_TYPETRAITS_H_
11 
12 #include <cstdlib>
13 
14 namespace mcld {
15 
16 template <typename DataType>
17 struct NonConstTraits;
18 
19 template <typename DataType>
20 struct ConstTraits {
21   typedef DataType value_type;
22   typedef const DataType* pointer;
23   typedef const DataType& reference;
24   typedef size_t size_type;
25   typedef ConstTraits<DataType> const_traits;
26   typedef NonConstTraits<DataType> nonconst_traits;
27 };
28 
29 template <typename DataType>
30 struct NonConstTraits {
31   typedef DataType value_type;
32   typedef DataType* pointer;
33   typedef DataType& reference;
34   typedef size_t size_type;
35   typedef ConstTraits<DataType> const_traits;
36   typedef NonConstTraits<DataType> nonconst_traits;
37 };
38 
39 template <typename DataType>
40 struct ConstIteratorTraits {
41   typedef DataType value_type;
42   typedef const DataType* pointer;
43   typedef const DataType& reference;
44   typedef size_t size_type;
45   typedef ConstTraits<DataType> const_traits;
46   typedef NonConstTraits<DataType> nonconst_traits;
47   typedef typename DataType::const_iterator iterator;
48 };
49 
50 template <typename DataType>
51 struct NonConstIteratorTraits {
52   typedef DataType value_type;
53   typedef DataType* pointer;
54   typedef DataType& reference;
55   typedef size_t size_type;
56   typedef ConstTraits<DataType> const_traits;
57   typedef NonConstTraits<DataType> nonconst_traits;
58   typedef typename DataType::iterator iterator;
59 };
60 
61 }  // namespace mcld
62 
63 #endif  // MCLD_ADT_TYPETRAITS_H_
64