ug4
stl_debug.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2013: G-CSC, Goethe University Frankfurt
3  * Author: Martin Rupp
4  *
5  * This file is part of UG4.
6  *
7  * UG4 is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License version 3 (as published by the
9  * Free Software Foundation) with the following additional attribution
10  * requirements (according to LGPL/GPL v3 §7):
11  *
12  * (1) The following notice must be displayed in the Appropriate Legal Notices
13  * of covered and combined works: "Based on UG4 (www.ug4.org/license)".
14  *
15  * (2) The following notice must be displayed at a prominent place in the
16  * terminal output of covered works: "Based on UG4 (www.ug4.org/license)".
17  *
18  * (3) The following bibliography is recommended for citation and must be
19  * preserved in all covered files:
20  * "Reiter, S., Vogel, A., Heppner, I., Rupp, M., and Wittum, G. A massively
21  * parallel geometric multigrid solver on hierarchically distributed grids.
22  * Computing and visualization in science 16, 4 (2013), 151-164"
23  * "Vogel, A., Reiter, S., Rupp, M., Nägel, A., and Wittum, G. UG4 -- a novel
24  * flexible software system for simulating pde based models on high performance
25  * computers. Computing and visualization in science 16, 4 (2013), 165-179"
26  *
27  * This program is distributed in the hope that it will be useful,
28  * but WITHOUT ANY WARRANTY; without even the implied warranty of
29  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
30  * GNU Lesser General Public License for more details.
31  */
32 
33 #ifndef __H__LIB_ALGEBRA__STL_DEBUG__
34 #define __H__LIB_ALGEBRA__STL_DEBUG__
35 
36 #include <vector>
37 
38 #ifndef NDEBUG
39 #include "common/error.h"
40 
41 namespace ug{
42 
43 template<typename T, class Allocator = std::allocator<T> >
44 class stdvector : public std::vector<T, Allocator>
45 {
46 private:
47  typedef std::vector<T, Allocator> super;
48 public:
49  typedef typename super::size_type size_type;
50 
51 private:
52 
53  inline void size_check(size_t i) const
54  {
55  UG_COND_THROW(i >= super::size(), "accessing element " << i << " but vector only has size " << super::size() << ".")
56  }
57 
58 public:
59  explicit stdvector(const Allocator& a= Allocator()) : super(a) { }
60  explicit stdvector(size_type n, const T& value = T(), const Allocator& a= Allocator()) : super(n, value, a) { }
61 
62  stdvector(const std::vector<T, Allocator> &x) : super(x) { }
64 
65  inline typename super::reference operator[] (size_t i)
66  {
67  size_check(i);
68  return super::operator[](i);
69  }
70  inline typename super::const_reference operator[] (size_t i) const
71  {
72  size_check(i);
73  return super::operator[](i);
74  }
75 };
76 
77 }
78 #else
79 
80 #define stdvector std::vector
81 
82 #endif
83 
84 
85 #endif // __H__LIB_ALGEBRA__LIB_ALGEBRA__
Definition: stl_debug.h:45
void size_check(size_t i) const
Definition: stl_debug.h:53
stdvector(const std::vector< T, Allocator > &x)
Definition: stl_debug.h:62
stdvector(const stdvector< T, Allocator > &x)
Definition: stl_debug.h:63
stdvector(const Allocator &a=Allocator())
Definition: stl_debug.h:59
super::reference operator[](size_t i)
Definition: stl_debug.h:65
super::size_type size_type
Definition: stl_debug.h:49
std::vector< T, Allocator > super
Definition: stl_debug.h:47
stdvector(size_type n, const T &value=T(), const Allocator &a=Allocator())
Definition: stl_debug.h:60
#define UG_COND_THROW(cond, msg)
UG_COND_THROW(cond, msg) : performs a UG_THROW(msg) if cond == true.
Definition: error.h:61
the ug namespace