https://mooseframework.inl.gov
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 
17 template <class T>
19 template <typename T>
20 void storeHelper(std::ostream & stream, UniqueStorage<T> &, void *);
21 template <typename T>
22 void loadHelper(std::istream & stream, UniqueStorage<T> &, void *);
23 
34 template <class T>
35 class UniqueStorage
36 {
37 public:
38  UniqueStorage() = default;
39  UniqueStorage(UniqueStorage &&) = default;
40  UniqueStorage(const UniqueStorage & mp) = delete;
41  UniqueStorage & operator=(const UniqueStorage &) = 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;
52  using pointer = value_type *;
53  using reference = value_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>>;
71  using iterator = DereferenceIterator<typename values_type::iterator>;
72  using const_iterator = DereferenceIterator<typename values_type::const_iterator>;
73 
81  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 
97  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 
129  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 
137 protected:
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 
169 private:
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 };
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.
void loadHelper(std::istream &stream, UniqueStorage< T > &, void *)
UniqueStorage helper routine.
Definition: DataIO.h:1063
std::unique_ptr< T > & pointerValue(const std::size_t i)
Returns a reference to the underlying unique pointer at index i.
const_iterator end() const
Definition: UniqueStorage.h:85
DereferenceIterator(const BaseIterator &it)
Definition: UniqueStorage.h:49
void clear()
Clears the underlying vector.
const_iterator begin() const
Definition: UniqueStorage.h:84
Storage container that stores a vector of unique pointers of T, but represents most of the public fac...
Definition: UniqueStorage.h:18
void setPointer(const std::size_t i, std::unique_ptr< T > &&ptr)
Sets the underlying unique_ptr at index i to ptr.
iterator begin()
Begin and end iterators to the underlying data.
Definition: UniqueStorage.h:82
std::size_t size() const
void storeHelper(std::ostream &stream, UniqueStorage< T > &, void *)
UniqueStorage helper routine.
Definition: DataIO.h:970
void resize(const std::size_t size)
Resizes the underlying vector.
typename std::vector< std::unique_ptr< RestartableDataValue > > values_type
Definition: UniqueStorage.h:70
T * queryValue(const std::size_t i)
const T * queryValue(const std::size_t i) const
DereferenceIterator< typename values_type::iterator > iterator
Definition: UniqueStorage.h:71
reference operator[](size_t n) const
Definition: UniqueStorage.h:62
const T & operator[](const std::size_t i) const
Definition: UniqueStorage.h:98
bool empty() const
DereferenceIterator< typename values_type::const_iterator > const_iterator
Definition: UniqueStorage.h:72
typename BaseIterator::value_type::element_type value_type
Definition: UniqueStorage.h:51
Iterator that adds an additional dereference to BaseIterator.
Definition: UniqueStorage.h:47
infix_ostream_iterator< T, charT, traits > & operator*()
Definition: InfixIterator.h:56
UniqueStorage()=default
iterator end()
Definition: UniqueStorage.h:83
UniqueStorage & operator=(const UniqueStorage &)=delete
T & operator[](const std::size_t i)
values_type _values
The underlying data.
bool hasValue(const std::size_t i) const
T & addPointer(std::unique_ptr< T > &&ptr)
Adds the given object in ptr to the storage.