TypeTraits.h revision 87f34658dec9097d987d254a990ea7f311bfc95f
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#ifdef ENABLE_UNITTEST
12#include <gtest.h>
13#endif
14
15#include <cstdlib>
16
17namespace mcld {
18
19template<typename DataType>
20struct NonConstTraits;
21
22template<typename DataType>
23struct ConstTraits
24{
25  typedef DataType                 value_type;
26  typedef const DataType*          pointer;
27  typedef const DataType&          reference;
28  typedef size_t                   size_type;
29  typedef ConstTraits<DataType>    const_traits;
30  typedef NonConstTraits<DataType> nonconst_traits;
31};
32
33template<typename DataType>
34struct NonConstTraits
35{
36  typedef DataType                 value_type;
37  typedef DataType*                pointer;
38  typedef DataType&                reference;
39  typedef size_t                   size_type;
40  typedef ConstTraits<DataType>    const_traits;
41  typedef NonConstTraits<DataType> nonconst_traits;
42};
43
44template<typename DataType>
45struct ConstIteratorTraits
46{
47  typedef DataType                          value_type;
48  typedef const DataType*                   pointer;
49  typedef const DataType&                   reference;
50  typedef size_t                            size_type;
51  typedef ConstTraits<DataType>             const_traits;
52  typedef NonConstTraits<DataType>          nonconst_traits;
53  typedef typename DataType::const_iterator iterator;
54};
55
56template<typename DataType>
57struct NonConstIteratorTraits
58{
59  typedef DataType                    value_type;
60  typedef DataType*                   pointer;
61  typedef DataType&                   reference;
62  typedef size_t                      size_type;
63  typedef ConstTraits<DataType>       const_traits;
64  typedef NonConstTraits<DataType>    nonconst_traits;
65  typedef typename DataType::iterator iterator;
66};
67
68} // namespace of mcld
69
70#endif
71
72