5 #ifndef DUNE_ISTL_BASEARRAY_HH
6 #define DUNE_ISTL_BASEARRAY_HH
14 #include "istlexception.hh"
46 template<
class B,
class ST=std::
size_t >
47 class base_array_unmanaged
54 typedef B member_type;
63 using const_reference =
const B&;
68 reference operator[] (size_type i)
70 #ifdef DUNE_ISTL_WITH_CHECKING
71 if (i>=n)
DUNE_THROW(ISTLError,
"index out of range");
77 const_reference operator[] (size_type i)
const
79 #ifdef DUNE_ISTL_WITH_CHECKING
80 if (i>=n)
DUNE_THROW(ISTLError,
"index out of range");
88 :
public RandomAccessIteratorFacade<RealIterator<T>, T>
92 typedef typename std::remove_const<T>::type ValueType;
94 friend class RandomAccessIteratorFacade<RealIterator<const ValueType>, const ValueType>;
95 friend class RandomAccessIteratorFacade<RealIterator<ValueType>, ValueType>;
96 friend class RealIterator<const ValueType>;
97 friend class RealIterator<ValueType>;
104 RealIterator (
const B* _p, B* _i) : p(_p), i(_i)
107 RealIterator(
const RealIterator<ValueType>& it)
112 size_type index ()
const
118 bool equals (
const RealIterator<ValueType>& other)
const
125 bool equals (
const RealIterator<const ValueType>& other)
const
131 std::ptrdiff_t distanceTo(
const RealIterator& o)
const
150 reference
elementAt (std::ptrdiff_t offset)
const
156 reference dereference ()
const
161 void advance(std::ptrdiff_t d)
171 typedef RealIterator<B> iterator;
177 return iterator(p,p);
183 return iterator(p,p+n);
188 iterator beforeEnd ()
190 return iterator(p,p+n-1);
195 iterator beforeBegin ()
197 return iterator(p,p-1);
201 iterator find (size_type i)
207 typedef RealIterator<const B> const_iterator;
210 const_iterator begin ()
const
212 return const_iterator(p,p+0);
216 const_iterator end ()
const
218 return const_iterator(p,p+n);
223 const_iterator beforeEnd ()
const
225 return const_iterator(p,p+n-1);
230 const_iterator beforeBegin ()
const
232 return const_iterator(p,p-1);
236 const_iterator find (size_type i)
const
238 return const_iterator(p,p+
std::min(i,n));
245 size_type
size ()
const
251 const B* data()
const
264 base_array_unmanaged ()
268 base_array_unmanaged (size_type n_, B* p_)
298 template<
class B,
class ST=std::
size_t >
299 class compressed_base_array_unmanaged
306 typedef B member_type;
309 typedef ST size_type;
312 using reference = B&;
315 using const_reference =
const B&;
320 reference operator[] (size_type i)
322 const size_type* lb = std::lower_bound(j, j+n, i);
323 if (lb == j+n || *lb != i)
324 DUNE_THROW(ISTLError,
"index "<<i<<
" not in compressed array");
329 const_reference operator[] (size_type i)
const
331 const size_type* lb = std::lower_bound(j, j+n, i);
332 if (lb == j+n || *lb != i)
333 DUNE_THROW(ISTLError,
"index "<<i<<
" not in compressed array");
340 :
public BidirectionalIteratorFacade<RealIterator<T>, T>
344 typedef typename std::remove_const<T>::type ValueType;
346 friend class BidirectionalIteratorFacade<RealIterator<const ValueType>, const ValueType>;
347 friend class BidirectionalIteratorFacade<RealIterator<ValueType>, ValueType>;
348 friend class RealIterator<const ValueType>;
349 friend class RealIterator<ValueType>;
357 RealIterator (B* _p, size_type* _j, size_type _i)
358 : p(_p), j(_j), i(_i)
364 RealIterator(
const RealIterator<ValueType>& it)
365 : p(it.p), j(it.j), i(it.i)
370 bool equals (
const RealIterator<ValueType>& it)
const
377 bool equals (
const RealIterator<const ValueType>& it)
const
385 size_type index ()
const
391 void setindex (size_type k)
403 size_type offset ()
const
422 reference dereference ()
const
433 typedef RealIterator<B> iterator;
438 return iterator(p,j,0);
444 return iterator(p,j,n);
449 iterator beforeEnd ()
451 return iterator(p,j,n-1);
456 iterator beforeBegin ()
458 return iterator(p,j,-1);
462 iterator find (size_type i)
464 const size_type* lb = std::lower_bound(j, j+n, i);
465 return (lb != j+n && *lb == i)
471 typedef RealIterator<const B> const_iterator;
474 const_iterator begin ()
const
476 return const_iterator(p,j,0);
480 const_iterator end ()
const
482 return const_iterator(p,j,n);
487 const_iterator beforeEnd ()
const
489 return const_iterator(p,j,n-1);
494 const_iterator beforeBegin ()
const
496 return const_iterator(p,j,-1);
500 const_iterator find (size_type i)
const
502 const size_type* lb = std::lower_bound(j, j+n, i);
503 return (lb != j+n && *lb == i)
504 ? const_iterator(p,j,lb-j)
511 size_type
size ()
const
518 compressed_base_array_unmanaged ()
#define DUNE_THROW(E, m)
Definition: exceptions.hh:218
constexpr auto min
Function object that returns the smaller of the given values.
Definition: hybridutilities.hh:506
constexpr auto equals
Function object for performing equality comparison.
Definition: hybridutilities.hh:572
constexpr decltype(auto) elementAt(Container &&c, Index &&i)
Get element at given position from container.
Definition: hybridutilities.hh:126
This file implements iterator facade classes for writing stl conformant iterators.
Dune namespace.
Definition: alignedallocator.hh:13
constexpr std::integral_constant< std::size_t, sizeof...(II)> size(std::integer_sequence< T, II... >)
Return the size of the sequence.
Definition: integersequence.hh:75