35 using Ptr = std::unique_ptr<BaseSpecies>;
53 explicit operator bool()
const {
54 return static_cast<bool>(species);
58 using Container = std::vector<Entry>;
69 void insert(std::string key, Ptr species);
76 std::size_t count(
const std::string& key)
const;
82 std::unique_ptr<BaseSpecies>&
at(
const std::string& key);
83 const std::unique_ptr<BaseSpecies>&
at(
const std::string& key)
const;
88 std::unique_ptr<BaseSpecies>*
find(
const std::string& key);
89 const std::unique_ptr<BaseSpecies>*
find(
const std::string& key)
const;
94 std::size_t
index_of(
const std::string& key)
const {
96 auto it = std::lower_bound(species_.begin(),
99 [](
const Entry& e,
const std::string& k) { return e.key < k; });
100 if (it == species_.end() || it->key != key)
101 return species_.size();
102 return static_cast<std::size_t
>(it - species_.begin());
108 assert(frozen_ && photons_);
112 assert(frozen_ && photons_);
116 assert(frozen_ && baryons_);
120 assert(frozen_ && baryons_);
123 std::size_t photons_index()
const {
125 return photons_index_;
127 std::size_t baryons_index()
const {
129 return baryons_index_;
143 return has_warm_matter_;
147 Container::iterator begin() {
148 return species_.begin();
150 Container::iterator end() {
151 return species_.end();
153 Container::const_iterator begin()
const {
154 return species_.begin();
156 Container::const_iterator end()
const {
157 return species_.end();
161 return species_.empty();
163 std::size_t size()
const {
164 return species_.size();
170 assert(i < species_.size());
171 return species_[i].species.get();
174 assert(i < species_.size());
175 return species_[i].species.get();
182 std::size_t photons_index_ = 0;
183 std::size_t baryons_index_ = 0;
184 bool has_ncdm_ =
false;
185 bool has_warm_matter_ =
false;
186 bool frozen_ =
false;