51 template<
typename T>
const char*
StorageType() {
return "Unknown"; }
89 template<
typename T>
class Storage :
public std::enable_shared_from_this<Storage<T>> {
90 const char* type = StorageType<object_type>();
92 std::vector<shared_ptr<T>> fish;
94 const shared_ptr<T> empty =
nullptr;
118 shared_ptr<
T>& operator[](
unsigned);
119 const shared_ptr<
T>&
at(
unsigned) const;
123 [[nodiscard]]
bool find(
unsigned) const;
133 [[nodiscard]]
size_t size() const;
140 template<
typename T>
typename Storage<T>::const_iterator
Storage<T>::cbegin()
const {
return pond.cbegin(); }
142 template<
typename T>
typename Storage<T>::const_iterator
Storage<T>::cend()
const {
return pond.cend(); }
146 template<
typename T>
typename Storage<T>::iterator
Storage<T>::end() {
return pond.end(); }
149 auto flag = pond.insert({I->get_tag(), I}).second;
150 if(!flag)
suanpan_warning(
"Storage fails to insert %s %u.\n", type, I->get_tag());
156 template<
typename T>
const shared_ptr<T>&
Storage<T>::at(
const unsigned L)
const {
return pond.contains(L) ? pond.at(L) : empty; }
158 template<
typename T>
const std::vector<shared_ptr<T>>&
Storage<T>::get()
const {
return fish; }
160 template<
typename T>
bool Storage<T>::find(
const unsigned L)
const {
return pond.contains(L); }
164 return pond.unsafe_erase(L) == 1;
166 return pond.erase(L) == 1;
176 fish.reserve(
size());
177 for(
const auto& [tag, obj] : pond)
178 if(obj->is_active()) fish.push_back(obj);
179 else bait.insert(tag);
196 template<
typename T>
typename Storage<T>::const_iterator
cbegin(
const Storage<T>&
S) {
return S.cbegin(); }
198 template<
typename T>
typename Storage<T>::const_iterator
cend(
const Storage<T>&
S) {
return S.cend(); }
202 template<
typename T>
typename Storage<T>::iterator
end(
Storage<T>&
S) {
return S.end(); }
const char * StorageType< Material >()
Definition: Storage.hpp:75
const char * StorageType< Load >()
Definition: Storage.hpp:73
const char * StorageType< Constraint >()
Definition: Storage.hpp:55
const char * StorageType< Amplitude >()
Definition: Storage.hpp:53
const char * StorageType< Database >()
Definition: Storage.hpp:61
const char * StorageType()
Definition: Storage.hpp:51
const char * StorageType< Domain >()
Definition: Storage.hpp:63
const char * StorageType< DomainBase >()
Definition: Storage.hpp:65
const char * StorageType< Node >()
Definition: Storage.hpp:79
const char * StorageType< Solver >()
Definition: Storage.hpp:87
const char * StorageType< Recorder >()
Definition: Storage.hpp:83
const char * StorageType< Criterion >()
Definition: Storage.hpp:59
const char * StorageType< Integrator >()
Definition: Storage.hpp:71
const char * StorageType< Element >()
Definition: Storage.hpp:67
const char * StorageType< Section >()
Definition: Storage.hpp:85
const char * StorageType< Converger >()
Definition: Storage.hpp:57
const char * StorageType< Modifier >()
Definition: Storage.hpp:77
const char * StorageType< Group >()
Definition: Storage.hpp:69
const char * StorageType< Orientation >()
Definition: Storage.hpp:81
An Amplitude class that can generate Amplitude pattern.
Definition: Amplitude.h:67
A Constraint class.
Definition: Constraint.h:36
The Converger class handles converger test to indicate if the iteration converges according to variou...
Definition: Converger.h:44
A Criterion class.
Definition: Criterion.h:38
A Database class is a top level container.
Definition: Database.h:33
The DomainBase class is a template.
Definition: DomainBase.h:90
A Domain class holds all FE model components.
Definition: Domain.h:37
A Element class.
Definition: Element.h:92
The Group class.
Definition: Group.h:36
The Integrator class is basically a wrapper of the DomainBase class with regard to some status changi...
Definition: Integrator.h:46
A Load class.
Definition: Load.h:37
A Material abstract base class.
Definition: Material.h:102
A Modifier class.
Definition: Modifier.h:36
The Node class holds the number of DoFs, coordinate, displacement, velocity and acceleration.
Definition: Node.h:77
A Orientation class.
Definition: Orientation.h:40
A Recorder class.
Definition: Recorder.h:35
A Section class.
Definition: Section.h:73
A Solver class defines solvers used in analysis.
Definition: Solver.h:38
A candidate Storage class that stores FEM objects.
Definition: Storage.hpp:89
bool insert(const shared_ptr< T > &)
Definition: Storage.hpp:148
void reset()
Definition: Storage.hpp:184
shared_ptr< T > & operator[](unsigned)
Definition: Storage.hpp:154
bool find(unsigned) const
Definition: Storage.hpp:160
Storage(const Storage &)=delete
void enable()
Definition: Storage.hpp:182
Storage()
Definition: Storage.hpp:136
size_t size() const
Definition: Storage.hpp:194
~Storage()
Definition: Storage.hpp:138
iterator end()
Definition: Storage.hpp:146
const shared_ptr< T > & at(unsigned) const
Definition: Storage.hpp:156
void clear()
Definition: Storage.hpp:189
void update()
Definition: Storage.hpp:174
const_iterator cend() const
Definition: Storage.hpp:142
iterator begin()
Definition: Storage.hpp:144
bool erase(unsigned)
Definition: Storage.hpp:162
void disable(unsigned)
Definition: Storage.hpp:172
Storage(Storage &&) noexcept=delete
const std::vector< shared_ptr< T > > & get() const
Definition: Storage.hpp:158
T object_type
Definition: Storage.hpp:103
const_iterator cbegin() const
Definition: Storage.hpp:140
std::vector< T > vector
Definition: container.h:53
std::unordered_set< T > unordered_set
Definition: container.h:55
std::unordered_map< T, D > unordered_map
Definition: container.h:57
void suanpan_debug(const char *M,...)
Definition: print.cpp:64
void suanpan_warning(const char *M,...)
Definition: print.cpp:101