https://mooseframework.inl.gov
Loading...
Searching...
No Matches
UniqueStorage.h
Go to the documentation of this file.
1//* This file is part of the MOOSE framework
2//* https://mooseframework.inl.gov
3//*
4//* All rights reserved, see COPYRIGHT for full restrictions
5//* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6//*
7//* Licensed under LGPL 2.1, please see LICENSE for details
8//* https://www.gnu.org/licenses/lgpl-2.1.html
9
10#pragma once
11
12#include <memory>
13#include <vector>
14#include <utility>
15#include <iostream>
16
17template <class T>
18class UniqueStorage;
19template <typename T>
20void storeHelper(std::ostream & stream, UniqueStorage<T> &, void *);
21template <typename T>
22void loadHelper(std::istream & stream, UniqueStorage<T> &, void *);
23
34template <class T>
36{
37public:
38 UniqueStorage() = default;
40 UniqueStorage(const UniqueStorage & mp) = delete;
42
46 template <class BaseIterator>
47 struct DereferenceIterator : public BaseIterator
48 {
49 DereferenceIterator(const BaseIterator & it) : BaseIterator(it) {}
50
51 using value_type = typename BaseIterator::value_type::element_type;
54
56 {
57 auto & val = BaseIterator::operator*();
58 mooseAssert(val, "Null object");
59 return *val;
60 }
61 pointer operator->() const { return BaseIterator::operator*().get(); }
62 reference operator[](size_t n) const
63 {
64 auto & val = BaseIterator::operator[](n);
65 mooseAssert(val, "Null object");
66 return *val;
67 }
68 };
69
70 using values_type = typename std::vector<std::unique_ptr<T>>;
73
82 iterator begin() { return iterator(_values.begin()); }
83 iterator end() { return iterator(_values.end()); }
84 const_iterator begin() const { return const_iterator(_values.begin()); }
85 const_iterator end() const { return const_iterator(_values.end()); }
87
98 const T & operator[](const std::size_t i) const
99 {
100 mooseAssert(hasValue(i), "Null object");
101 return *pointerValue(i);
102 }
103 T & operator[](const std::size_t i) { return const_cast<T &>(std::as_const(*this)[i]); }
105
112 std::size_t size() const { return _values.size(); }
116 bool empty() const { return _values.empty(); }
117
121 bool hasValue(const std::size_t i) const { return pointerValue(i) != nullptr; }
122
130 const T * queryValue(const std::size_t i) const { return pointerValue(i).get(); }
131 T * queryValue(const std::size_t i)
132 {
133 return const_cast<T *>(std::as_const(*this).queryValue(i));
134 }
136
137protected:
144 void setPointer(const std::size_t i, std::unique_ptr<T> && ptr)
145 {
146 mooseAssert(size() > i, "Invalid size");
147 _values[i] = std::move(ptr);
148 }
149
153 T & addPointer(std::unique_ptr<T> && ptr)
154 {
155 mooseAssert(ptr, "Null object");
156 return *_values.emplace_back(std::move(ptr));
157 }
158
162 void resize(const std::size_t size) { _values.resize(size); }
163
167 void clear() { _values.clear(); }
168
169private:
174 const std::unique_ptr<T> & pointerValue(const std::size_t i) const
175 {
176 mooseAssert(size() > i, "Invalid size");
177 return _values[i];
178 }
183 std::unique_ptr<T> & pointerValue(const std::size_t i)
184 {
185 return const_cast<std::unique_ptr<T> &>(std::as_const(*this).pointerValue(i));
186 }
187
188 friend void storeHelper<>(std::ostream & stream, UniqueStorage<T> &, void *);
189 friend void loadHelper<>(std::istream & stream, UniqueStorage<T> &, void *);
190
193};
void loadHelper(std::istream &stream, UniqueStorage< T > &, void *)
UniqueStorage helper routine.
Definition DataIO.h:1159
void storeHelper(std::ostream &stream, UniqueStorage< T > &, void *)
UniqueStorage helper routine.
Definition DataIO.h:1066
Storage container that stores a vector of unique pointers of T, but represents most of the public fac...
UniqueStorage(UniqueStorage &&)=default
bool empty() const
T * queryValue(const std::size_t i)
void clear()
Clears the underlying vector.
UniqueStorage & operator=(const UniqueStorage &)=delete
iterator begin()
Begin and end iterators to the underlying data.
T & operator[](const std::size_t i)
DereferenceIterator< typename values_type::const_iterator > const_iterator
std::size_t size() const
const T * queryValue(const std::size_t i) const
std::unique_ptr< T > & pointerValue(const std::size_t i)
Returns a reference to the underlying unique pointer at index i.
const_iterator begin() const
void resize(const std::size_t size)
Resizes the underlying vector.
DereferenceIterator< typename values_type::iterator > iterator
typename std::vector< std::unique_ptr< T > > values_type
bool hasValue(const std::size_t i) const
void setPointer(const std::size_t i, std::unique_ptr< T > &&ptr)
Sets the underlying unique_ptr at index i to ptr.
values_type _values
The underlying data.
UniqueStorage(const UniqueStorage &mp)=delete
T & addPointer(std::unique_ptr< T > &&ptr)
Adds the given object in ptr to the storage.
const_iterator end() const
UniqueStorage()=default
iterator end()
const std::unique_ptr< T > & pointerValue(const std::size_t i) const
Returns a read-only reference to the underlying unique pointer at index i.
const T & operator[](const std::size_t i) const
Iterator that adds an additional dereference to BaseIterator.
DereferenceIterator(const BaseIterator &it)
reference operator[](size_t n) const
typename BaseIterator::value_type::element_type value_type