ug4
page_container.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011-2015: G-CSC, Goethe University Frankfurt
3  * Author: Sebastian Reiter
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__UG__page_container__
34 #define __H__UG__page_container__
35 
36 #include <vector>
37 #include <memory>
38 #include "common/types.h"
39 
40 namespace ug
41 {
42 
43 template <class T, int MAX_PAGE_SIZE = 4096,
44  class Allocator = std::allocator<T> >
46 {
47  public:
48  typedef Allocator allocator_type;
49  typedef typename Allocator::size_type size_type;
50  typedef typename Allocator::difference_type difference_type;
51  typedef typename Allocator::reference reference;
52  typedef typename Allocator::const_reference const_reference;
53 
54  public:
55  PageContainer();
56 
57  PageContainer(const PageContainer& pc);
58 
60 
62 
63  inline size_t size() const;
64  inline size_t capacity() const;
65 
66  void resize(size_t size, const T& val = T());
67 
68  void reserve(size_t size);
69 
70  void clear();
71 
72  inline T& operator[](size_t ind);
73  inline const T& operator[](size_t ind) const;
74 
75  void swap(PageContainer& pc);
76 
77  private:
78  void assign_container(const PageContainer& pc);
79 
81  inline T* get_page(size_t ind) const;
82 
84  inline size_t get_page_index(size_t ind) const;
85 
87  inline size_t get_page_offset(size_t ind) const;
88 
89  private:
90  std::vector<T*> m_pages;
91  const size_t m_numPageEntries;
92  size_t m_size;
93  Allocator m_alloc;
94 };
95 
96 }// end of namespace
97 
99 // include implementation
100 #include "page_container_impl.h"
101 
102 #endif
Definition: page_container.h:46
size_t capacity() const
Definition: page_container_impl.h:89
Allocator::const_reference const_reference
Definition: page_container.h:52
PageContainer()
Definition: page_container_impl.h:47
Allocator::reference reference
Definition: page_container.h:51
size_t m_size
Definition: page_container.h:92
Allocator m_alloc
Definition: page_container.h:93
T * get_page(size_t ind) const
returns the page in which the data for the given index lies
Definition: page_container_impl.h:213
void reserve(size_t size)
Definition: page_container_impl.h:137
size_t get_page_offset(size_t ind) const
returns the offset that a index has in its page
Definition: page_container_impl.h:228
size_t size() const
Definition: page_container_impl.h:82
void resize(size_t size, const T &val=T())
Definition: page_container_impl.h:96
std::vector< T * > m_pages
Definition: page_container.h:90
void clear()
Definition: page_container_impl.h:153
Allocator allocator_type
Definition: page_container.h:48
~PageContainer()
Definition: page_container_impl.h:63
const size_t m_numPageEntries
Definition: page_container.h:91
Allocator::size_type size_type
Definition: page_container.h:49
PageContainer & operator=(const PageContainer &pc)
Definition: page_container_impl.h:74
size_t get_page_index(size_t ind) const
returns the index of the page in which the data for the given index lies
Definition: page_container_impl.h:221
T & operator[](size_t ind)
Definition: page_container_impl.h:160
Allocator::difference_type difference_type
Definition: page_container.h:50
void assign_container(const PageContainer &pc)
Definition: page_container_impl.h:190
void swap(PageContainer &pc)
Definition: page_container_impl.h:176
the ug namespace