1// -*- C++ -*-
2
3// Copyright (C) 2005, 2006 Free Software Foundation, Inc.
4//
5// This file is part of the GNU ISO C++ Library.  This library is free
6// software; you can redistribute it and/or modify it under the terms
7// of the GNU General Public License as published by the Free Software
8// Foundation; either version 2, or (at your option) any later
9// version.
10
11// This library is distributed in the hope that it will be useful, but
12// WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14// General Public License for more details.
15
16// You should have received a copy of the GNU General Public License
17// along with this library; see the file COPYING.  If not, write to
18// the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
19// MA 02111-1307, USA.
20
21// As a special exception, you may use this file as part of a free
22// software library without restriction.  Specifically, if other files
23// instantiate templates or use macros or inline functions from this
24// file, or you compile this file and link it with other files to
25// produce an executable, this file does not by itself cause the
26// resulting executable to be covered by the GNU General Public
27// License.  This exception does not however invalidate any other
28// reasons why the executable file might be covered by the GNU General
29// Public License.
30
31// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
32
33// Permission to use, copy, modify, sell, and distribute this software
34// is hereby granted without fee, provided that the above copyright
35// notice appears in all copies, and that both that copyright notice
36// and this permission notice appear in supporting documentation. None
37// of the above authors, nor IBM Haifa Research Laboratories, make any
38// representation about the suitability of this software for any
39// purpose. It is provided "as is" without express or implied
40// warranty.
41
42/**
43 * @file type_utils.hpp
44 * Contains utilities for handnling types. All of these classes are based on
45 *    "Modern C++" by Andrei Alxandrescu.
46 */
47
48#ifndef PB_DS_TYPE_UTILS_HPP
49#define PB_DS_TYPE_UTILS_HPP
50
51#include <cstddef>
52#include <utility>
53#include <tr1/type_traits>
54#include <ext/type_traits.h>
55#include <ext/numeric_traits.h>
56
57namespace pb_ds
58{
59  namespace detail
60  {
61    using std::tr1::is_same;
62    using std::tr1::is_const;
63    using std::tr1::is_pointer;
64    using std::tr1::is_reference;
65    using std::tr1::is_fundamental;
66    using std::tr1::is_member_object_pointer;
67    using std::tr1::is_member_pointer;
68    using std::tr1::is_base_of;
69    using std::tr1::remove_const;
70    using std::tr1::remove_reference;
71
72    // Need integral_const<bool, true> <-> integral_const<int, 1>, so
73    // because of this use the following typedefs instead of importing
74    // std::tr1's.
75    using std::tr1::integral_constant;
76    typedef std::tr1::integral_constant<int, 1> true_type;
77    typedef std::tr1::integral_constant<int, 0> false_type;
78
79    using __gnu_cxx::__conditional_type;
80    using __gnu_cxx::__numeric_traits;
81
82    template<typename T>
83    struct is_const_pointer
84    {
85      enum
86	{
87	  value = is_const<T>::value && is_pointer<T>::value
88	};
89    };
90
91    template<typename T>
92    struct is_const_reference
93    {
94      enum
95	{
96	  value = is_const<T>::value && is_reference<T>::value
97	};
98    };
99
100    template<typename T>
101    struct is_simple
102    {
103      enum
104	{
105	  value = is_fundamental<typename remove_const<T>::type>::value
106	  || is_pointer<typename remove_const<T>::type>::value
107	  || is_member_pointer<T>::value
108	};
109    };
110
111    template<typename T>
112    class is_pair
113    {
114    private:
115      template<typename U>
116      struct is_pair_imp
117      {
118	enum
119	  {
120	    value = 0
121	  };
122      };
123
124      template<typename U, typename V>
125      struct is_pair_imp<std::pair<U,V> >
126      {
127	enum
128	  {
129	    value = 1
130	  };
131      };
132
133    public:
134      enum
135	{
136	  value = is_pair_imp<T>::value
137	};
138    };
139
140
141    template<bool>
142    struct static_assert;
143
144    template<>
145    struct static_assert<true>
146    { };
147
148    template<int>
149    struct static_assert_dumclass
150    {
151      enum
152	{
153	  v = 1
154	};
155    };
156
157    template<typename Type>
158    struct type_to_type
159    {
160      typedef Type type;
161    };
162  } // namespace detail
163} // namespace pb_ds
164
165#endif
166