OpenCores
URL https://opencores.org/ocsvn/openrisc_me/openrisc_me/trunk

Subversion Repositories openrisc_me

[/] [openrisc/] [trunk/] [gnu-src/] [gcc-4.5.1/] [libstdc++-v3/] [include/] [ext/] [pb_ds/] [detail/] [basic_types.hpp] - Blame information for rev 424

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 424 jeremybenn
// -*- C++ -*-
2
 
3
// Copyright (C) 2005, 2006, 2009 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 3, 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
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// <http://www.gnu.org/licenses/>.
24
 
25
// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
26
 
27
// Permission to use, copy, modify, sell, and distribute this software
28
// is hereby granted without fee, provided that the above copyright
29
// notice appears in all copies, and that both that copyright notice
30
// and this permission notice appear in supporting documentation. None
31
// of the above authors, nor IBM Haifa Research Laboratories, make any
32
// representation about the suitability of this software for any
33
// purpose. It is provided "as is" without express or implied
34
// warranty.
35
 
36
/**
37
 * @file basic_types.hpp
38
 * Contains basic types used by containers.
39
 */
40
 
41
#ifndef PB_DS_BASIC_TYPES_HPP
42
#define PB_DS_BASIC_TYPES_HPP
43
 
44
#include <algorithm>
45
#include <utility>
46
#include <ext/pb_ds/tag_and_trait.hpp>
47
#include <ext/pb_ds/detail/type_utils.hpp>
48
 
49
namespace __gnu_pbds
50
{
51
  namespace detail
52
  {
53
    template<typename Key, typename Mapped, typename Allocator, bool Store_Hash>
54
    struct value_type_base;
55
 
56
    /**
57
     * Specialization of value_type_base for the case where the hash value
58
     * is not stored alongside each value.
59
     **/
60
    template<typename Key, typename Mapped, typename Allocator>
61
    struct value_type_base<Key, Mapped, Allocator, false>
62
    {
63
      typedef typename Allocator::template rebind<Mapped>::other mapped_type_allocator;
64
      typedef typename mapped_type_allocator::value_type mapped_type;
65
      typedef typename mapped_type_allocator::pointer mapped_pointer;
66
      typedef typename mapped_type_allocator::const_pointer const_mapped_pointer;
67
      typedef typename mapped_type_allocator::reference mapped_reference;
68
      typedef typename mapped_type_allocator::const_reference const_mapped_reference;
69
 
70
      typedef typename Allocator::template rebind<std::pair<const Key, Mapped> >::other value_type_allocator;
71
      typedef typename value_type_allocator::value_type value_type;
72
      typedef typename value_type_allocator::pointer pointer;
73
      typedef typename value_type_allocator::const_pointer const_pointer;
74
      typedef typename value_type_allocator::reference reference;
75
      typedef typename value_type_allocator::const_reference const_reference;
76
 
77
      struct stored_value_type
78
      {
79
        value_type m_value;
80
      };
81
    };
82
 
83
    /**
84
     * Specialization of value_type_base for the case where the hash value
85
     * is stored alongside each value.
86
     **/
87
    template<typename Key, typename Mapped, typename Allocator>
88
    struct value_type_base<Key, Mapped, Allocator, true>
89
    {
90
      typedef typename Allocator::template rebind<Mapped>::other mapped_type_allocator;
91
      typedef typename mapped_type_allocator::value_type mapped_type;
92
      typedef typename mapped_type_allocator::pointer mapped_pointer;
93
      typedef typename mapped_type_allocator::const_pointer const_mapped_pointer;
94
      typedef typename mapped_type_allocator::reference mapped_reference;
95
      typedef typename mapped_type_allocator::const_reference const_mapped_reference;
96
 
97
      typedef typename Allocator::template rebind<std::pair<const Key, Mapped> >::other value_type_allocator;
98
      typedef typename value_type_allocator::value_type value_type;
99
      typedef typename value_type_allocator::pointer pointer;
100
      typedef typename value_type_allocator::const_pointer const_pointer;
101
      typedef typename value_type_allocator::reference reference;
102
      typedef typename value_type_allocator::const_reference const_reference;
103
 
104
      struct stored_value_type
105
      {
106
        value_type m_value;
107
        typename Allocator::size_type m_hash;
108
      };
109
    };
110
 
111
#define PB_DS_CLASS_T_DEC \
112
    template<typename Key, typename Allocator>
113
 
114
#define PB_DS_CLASS_C_DEC \
115
    value_type_base<Key, null_mapped_type, Allocator, false>
116
 
117
    /**
118
     * Specialization of value_type_base for the case where the hash value
119
     * is not stored alongside each value.
120
     **/
121
    template<typename Key, typename Allocator>
122
    struct value_type_base<Key, null_mapped_type, Allocator, false>
123
    {
124
      typedef typename Allocator::template rebind<null_mapped_type>::other mapped_type_allocator;
125
      typedef typename mapped_type_allocator::value_type mapped_type;
126
      typedef typename mapped_type_allocator::pointer mapped_pointer;
127
      typedef typename mapped_type_allocator::const_pointer const_mapped_pointer;
128
      typedef typename mapped_type_allocator::reference mapped_reference;
129
      typedef typename mapped_type_allocator::const_reference const_mapped_reference;
130
 
131
      typedef Key value_type;
132
 
133
      typedef typename Allocator::template rebind<value_type>::other value_type_allocator;
134
      typedef typename value_type_allocator::pointer pointer;
135
      typedef typename value_type_allocator::const_pointer const_pointer;
136
      typedef typename value_type_allocator::reference reference;
137
      typedef typename value_type_allocator::const_reference const_reference;
138
 
139
      struct stored_value_type
140
      {
141
        value_type m_value;
142
      };
143
 
144
      static null_mapped_type s_null_mapped;
145
    };
146
 
147
    PB_DS_CLASS_T_DEC
148
    null_mapped_type PB_DS_CLASS_C_DEC::s_null_mapped;
149
 
150
#undef PB_DS_CLASS_T_DEC
151
#undef PB_DS_CLASS_C_DEC
152
 
153
#define PB_DS_CLASS_T_DEC \
154
    template<typename Key, typename Allocator>
155
 
156
#define PB_DS_CLASS_C_DEC \
157
    value_type_base<Key, null_mapped_type, Allocator, true>
158
 
159
    /**
160
     * Specialization of value_type_base for the case where the hash value
161
     * is stored alongside each value.
162
     **/
163
    template<typename Key, typename Allocator>
164
    struct value_type_base<Key, null_mapped_type, Allocator, true>
165
    {
166
      typedef typename Allocator::template rebind<null_mapped_type>::other mapped_type_allocator;
167
      typedef typename mapped_type_allocator::value_type mapped_type;
168
      typedef typename mapped_type_allocator::pointer mapped_pointer;
169
      typedef typename mapped_type_allocator::const_pointer const_mapped_pointer;
170
      typedef typename mapped_type_allocator::reference mapped_reference;
171
      typedef typename mapped_type_allocator::const_reference const_mapped_reference;
172
 
173
      typedef Key value_type;
174
 
175
      typedef typename Allocator::template rebind<value_type>::other value_type_allocator;
176
      typedef typename value_type_allocator::pointer pointer;
177
      typedef typename value_type_allocator::const_pointer const_pointer;
178
      typedef typename value_type_allocator::reference reference;
179
      typedef typename value_type_allocator::const_reference const_reference;
180
 
181
      struct stored_value_type
182
      {
183
        value_type m_value;
184
        typename Allocator::size_type m_hash;
185
      };
186
 
187
      static null_mapped_type s_null_mapped;
188
    };
189
 
190
    PB_DS_CLASS_T_DEC
191
    null_mapped_type PB_DS_CLASS_C_DEC::s_null_mapped;
192
 
193
#undef PB_DS_CLASS_T_DEC
194
#undef PB_DS_CLASS_C_DEC
195
 
196
    template<typename Key, typename Mapped>
197
    struct no_throw_copies
198
    {
199
      typedef integral_constant<int, is_simple<Key>::value && is_simple<Mapped>::value> indicator;
200
    };
201
 
202
    template<typename Key>
203
    struct no_throw_copies<Key, null_mapped_type>
204
    {
205
      typedef integral_constant<int, is_simple<Key>::value> indicator;
206
    };
207
  } // namespace detail
208
} // namespace __gnu_pbds
209
 
210
#endif 
211
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.