LSSTApplications  1.1.2+25,10.0+13,10.0+132,10.0+133,10.0+224,10.0+41,10.0+8,10.0-1-g0f53050+14,10.0-1-g4b7b172+19,10.0-1-g61a5bae+98,10.0-1-g7408a83+3,10.0-1-gc1e0f5a+19,10.0-1-gdb4482e+14,10.0-11-g3947115+2,10.0-12-g8719d8b+2,10.0-15-ga3f480f+1,10.0-2-g4f67435,10.0-2-gcb4bc6c+26,10.0-28-gf7f57a9+1,10.0-3-g1bbe32c+14,10.0-3-g5b46d21,10.0-4-g027f45f+5,10.0-4-g86f66b5+2,10.0-4-gc4fccf3+24,10.0-40-g4349866+2,10.0-5-g766159b,10.0-5-gca2295e+25,10.0-6-g462a451+1
LSSTDataManagementBasePackage
SmallPtrVector.cc
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 
3 /*
4  * LSST Data Management System
5  * Copyright 2008, 2009, 2010 LSST Corporation.
6  *
7  * This product includes software developed by the
8  * LSST Project (http://www.lsst.org/).
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the LSST License Statement and
21  * the GNU General Public License along with this program. If not,
22  * see <http://www.lsstcorp.org/LegalNotices/>.
23  */
24 
29 #ifndef LSST_AP_UTILS_SMALLPTRVECTOR_CC
30 #define LSST_AP_UTILS_SMALLPTRVECTOR_CC
31 
32 #include <cstring>
33 #include <algorithm>
34 #include <stdexcept>
35 
36 
37 namespace lsst { namespace ap { namespace utils {
38 
39 template <typename T, size_t N>
41  _beg(_buf), _end(_buf), _cap(_buf + N) { }
42 
43 template <typename T, size_t N>
44  template <size_t N2>
46  _beg(_buf), _end(_buf), _cap(_buf + N)
47 {
48  *this = v;
49 }
50 
51 template <typename T, size_t N>
53  if (_beg != _buf) {
54  delete[] _beg;
55  }
56 }
57 
58 template <typename T, size_t N>
60  return static_cast<size_type>(_end - _beg);
61 }
62 
63 template <typename T, size_t N>
65  return static_cast<size_type>(_cap - _beg);
66 }
67 
68 template <typename T, size_t N>
71  sizeof(value_type);
72 }
73 
74 template <typename T, size_t N>
75 inline bool SmallPtrVector<T, N>::empty() const {
76  return size() == 0;
77 }
78 
79 template <typename T, size_t N>
81  return _beg;
82 }
83 
84 template <typename T, size_t N>
86  return _beg;
87 }
88 
89 template <typename T, size_t N>
91  return _end;
92 }
93 
94 template <typename T, size_t N>
96  return _end;
97 }
98 
99 template <typename T, size_t N>
101  typename SmallPtrVector<T, N>::size_type i) const
102 {
103  return *(_beg + i);
104 }
105 
106 template <typename T, size_t N>
107 inline typename SmallPtrVector<T, N>::reference SmallPtrVector<T, N>::operator[](
108  typename SmallPtrVector<T, N>::size_type i)
109 {
110  return *(_beg + i);
111 }
112 
113 template <typename T, size_t N>
115  return *_beg;
116 }
117 
118 template <typename T, size_t N>
120  return *_beg;
121 }
122 
123 template <typename T, size_t N>
125  return *(_end - 1);
126 }
127 
128 template <typename T, size_t N>
130  return *(_end - 1);
131 }
132 
133 template <typename T, size_t N>
135  _end = _beg;
136 }
137 
138 template <typename T, size_t N>
140  if (_end > _beg) {
141  --_end;
142  }
143 }
144 
145 template <typename T, size_t N>
147  if (_end == _cap) {
148  _grow();
149  }
150  *_end++ = v;
151 }
152 
153 
154 template <typename T, size_t N>
155  template <size_t N2>
157  SmallPtrVector<T, N2> const &v)
158 {
159  if (_beg == v._beg) {
160  return *this;
161  }
162  clear();
163  if (v.size() > 0) {
164  reserve(v.size());
165  std::memcpy(_beg, v._beg, v.size()*sizeof(value_type));
166  _end = _beg + v.size();
167  }
168 }
169 
170 template <typename T, size_t N>
172  if (n > max_size()) {
173  throw std::length_error("cannot expand vector: "
174  "max_size() would be exceeded");
175  } else if (n > capacity()) {
176  T **array = new T *[n];
177  size_type sz = size();
178  if (sz > 0) {
179  std::memcpy(array, _beg, sz*sizeof(value_type));
180  }
181  std::swap(array, _beg);
182  _end = _beg + sz;
183  _cap = _beg + n;
184  if (array != _buf) {
185  delete[] array;
186  }
187  }
188 }
189 
190 template <typename T, size_t N>
192  if (this == &v) {
193  return;
194  }
195  if (_beg == _buf && v._beg == v._buf) {
196  T *tmp[N];
197  size_type sz = size();
198  size_type vsz = v.size();
199  std::memcpy(tmp, _beg, sz*sizeof(value_type));
200  std::memcpy(_beg, v._beg, vsz*sizeof(value_type));
201  std::memcpy(v._beg, tmp, sz*sizeof(value_type));
202  _end = _beg + vsz;
203  v._end = v._beg + sz;
204  } else if (v._beg == v._buf) {
205  size_type sz = v.size();
206  std::memcpy(_buf, v._beg, sz*sizeof(value_type));
207  v._beg = _beg;
208  v._end = _end;
209  v._cap = _cap;
210  _beg = _buf;
211  _end = _buf + sz;
212  _cap = _buf + N;
213  } else if (_beg == _buf) {
214  size_type sz = size();
215  std::memcpy(v._buf, _beg, sz*sizeof(value_type));
216  _beg = v._beg;
217  _end = v._end;
218  _cap = v._cap;
219  v._beg = v._buf;
220  v._end = v._buf + sz;
221  v._cap = v._buf + N;
222  } else {
223  std::swap(_beg, v._beg);
224  std::swap(_end, v._end);
225  std::swap(_cap, v._cap);
226  }
227 }
228 
229 template <typename T, size_t N>
231  if (max_size() == size()) {
232  throw std::length_error("cannot expand vector: "
233  "max_size() would be exceeded");
234  }
235  size_type c = 2*capacity();
236  if (c == 0) {
237  ++c;
238  }
239  if (c < capacity() || c > max_size()) {
240  c = max_size();
241  }
242  reserve(c);
243 }
244 
245 }}} // namespace lsst::ap::utils
246 
247 #endif // LSST_AP_UTILS_SMALLPTRVECTOR_CC
248 
SmallPtrVector & operator=(SmallPtrVector< T, N2 > const &v)
void swap(SmallPtrVector &v)
void swap(ImageBase< PixelT > &a, ImageBase< PixelT > &b)
Definition: Image.cc:291
const_reference operator[](size_type i) const
const_reference back() const
const_iterator begin() const
double max
Definition: attributes.cc:218
std::stringstream _buf
const_reference front() const
const_iterator end() const