10#ifndef TEUCHOS_STRING_INDEXED_ORDERED_VALUE_OBJECT_CONTAINER_HPP
11#define TEUCHOS_STRING_INDEXED_ORDERED_VALUE_OBJECT_CONTAINER_HPP
15#include "Teuchos_FilteredIterator.hpp"
72 template<
class ObjType>
84 template <
typename U,
typename = std::enable_if_t<std::is_convertible_v<U, ObjType>>>
98 isActive_ =
kop.isActive_;
111 template<
class ObjType>
150template<
class ObjType>
159 typedef std::deque<key_and_obj_t> key_and_obj_array_t;
161 typedef std::map<std::string, OrdinalIndex> key_to_idx_map_t;
206 template <
typename U,
typename = std::enable_if_t<std::is_convertible_v<U, ObjType>>>
268 key_and_obj_array_t key_and_obj_array_;
270 key_to_idx_map_t key_to_idx_map_;
297 void assertOrdinalIndex(
const Ordinal idx)
const;
306 void throwInvalidKeyError(
const Ordinal idx,
const std::string &key)
const;
309 Ordinal assertKeyGetOrdinal(
const std::string &key)
const;
322template<
class ObjType>
327 return ptrFromRef(getNonconstKeyAndObject(idx).second);
331template<
class ObjType>
336 return ptrFromRef(getKeyAndObject(idx).second);
340template<
class ObjType>
345 return getNonconstObjPtr(assertKeyGetOrdinal(key));
349template<
class ObjType>
354 return getObjPtr(assertKeyGetOrdinal(key));
361template<
class ObjType>
366 return Iterator(key_and_obj_array_.begin(), key_and_obj_array_.begin(),
367 key_and_obj_array_.end());
371template<
class ObjType>
376 return Iterator(key_and_obj_array_.end(), key_and_obj_array_.begin(),
377 key_and_obj_array_.end());
381template<
class ObjType>
386 return ConstIterator(key_and_obj_array_.begin(), key_and_obj_array_.begin(),
387 key_and_obj_array_.end());
391template<
class ObjType>
396 return ConstIterator(key_and_obj_array_.end(), key_and_obj_array_.begin(),
397 key_and_obj_array_.end());
409template<
class ObjType>
414template<
class ObjType>
418 return key_to_idx_map_.size();
422template<
class ObjType>
426 return key_and_obj_array_.size();
433template<
class ObjType>
438 key_to_idx_map_t::const_iterator
itr = key_to_idx_map_.find(key);
439 if (
itr != key_to_idx_map_.end()) {
440 return itr->second.idx;
442 return getInvalidOrdinal();
446template <
typename ObjType>
447template <
typename U,
typename>
452 typename key_to_idx_map_t::iterator
obj_idx_itr = key_to_idx_map_.find(key);
456 key_and_obj_array_[
obj_idx].second = std::forward<U>(obj);
460 key_and_obj_array_.emplace_back(key, std::forward<U>(obj));
462 key_to_idx_map_[key] =
new_idx;
467template<
class ObjType>
476template<
class ObjType>
479 typename key_to_idx_map_t::iterator
itr = key_to_idx_map_.find(key);
480 if (
itr == key_to_idx_map_.end()) {
481 throwInvalidKeyError(getInvalidOrdinal(), key);
484 key_to_idx_map_.erase(
itr);
485 key_and_obj_array_[idx] = key_and_obj_t::makeInvalid();
492template<
class ObjType>
496 InvalidOrdinalIndexError,
497 "Error, the ordinal index " << idx <<
" is invalid"
498 <<
" because it falls outside of the range of valid objects"
499 <<
" [0,"<<numStorage()-1<<
"]!");
503template<
class ObjType>
504typename StringIndexedOrderedValueObjectContainer<ObjType>::key_and_obj_t&
505StringIndexedOrderedValueObjectContainer<ObjType>::getNonconstKeyAndObject(
const Ordinal idx)
507 assertOrdinalIndex(idx);
508 key_and_obj_t &key_and_obj = key_and_obj_array_[idx];
510 InvalidOrdinalIndexError,
511 "Error, the ordinal index " << idx <<
" is invalid"
512 <<
" because the object has been deleted!");
517template<
class ObjType>
518const typename StringIndexedOrderedValueObjectContainer<ObjType>::key_and_obj_t&
519StringIndexedOrderedValueObjectContainer<ObjType>::getKeyAndObject(
const Ordinal idx)
const
521 assertOrdinalIndex(idx);
522 const key_and_obj_t &key_and_obj = key_and_obj_array_[idx];
524 InvalidOrdinalIndexError,
525 "Error, the ordinal index " << idx <<
" is invalid"
526 <<
" because the object has been deleted!");
531template<
class ObjType>
533StringIndexedOrderedValueObjectContainer<ObjType>::throwInvalidKeyError(
534 const Ordinal idx,
const std::string &key)
const
537 "Error, the key '" << key <<
"' does not exist!");
541template<
class ObjType>
543StringIndexedOrderedValueObjectContainer<ObjType>::assertKeyGetOrdinal(
const std::string &key)
const
545 const Ordinal idx = getObjOrdinalIndex(key);
546 throwInvalidKeyError(idx, key);
Templated array class derived from the STL std::vector.
Base exception class for Teuchos.
Smart reference counting pointer class for automatic garbage collection.
Thrown if an invalid string is passed in.
Thrown if an invalid ordinal index is passed in.
A simple aggregate type to bind a key string and and objects value.
KeyObjectPair(const KeyObjectPair &kop)
Copy-constructor.
const std::string & first
KeyObjectPair & operator=(const KeyObjectPair &kop)
Copy-assignment operator.
KeyObjectPair(KeyObjectPair &&kop)
Move-constructor.
KeyObjectPair(const std::string &key_in, U &&obj_in, bool isActive_in=true)
static KeyObjectPair< ObjType > makeInvalid()
A safe ordinal index type that default initializes to a special value.
StringIndexedOrderedValueObjectContainerBase::Ordinal Ordinal
OrdinalIndex(const Ordinal idx_in)
Predicate for selecting active object entries in filtered iterator.
Base types for StringIndexedOrderedValueObjectContainer.
virtual ~StringIndexedOrderedValueObjectContainerBase()
Destructor.
static Ordinal getInvalidOrdinal()
Return the value for invalid ordinal.
Teuchos_Ordinal Ordinal
Ordinal used for the index.
String indexed ordered value-type object container class.
ConstIterator end() const
Ptr< const ObjType > getObjPtr(const std::string &key) const
Get a const semi-persisting association with the stored object indexed by string key.
Ordinal setObj(const std::string &key, U &&obj)
Set (or reset) object by value and return its ordinal index.
Ordinal getObjOrdinalIndex(const std::string &key) const
Get the ordinal index given the string key.
FilteredIterator< typename key_and_obj_array_t::const_iterator, SelectActive< ObjType > > ConstIterator
The const iterator type.
Ordinal numObjects() const
FilteredIterator< typename key_and_obj_array_t::iterator, SelectActive< ObjType > > Iterator
The non-const iterator type.
void removeObj(const Ordinal &idx)
Remove an object given its ordinal index.
Ordinal numStorage() const
Ptr< ObjType > getNonconstObjPtr(const std::string &key)
Get a nonconst semi-persisting association with the stored object indexed by string key.
ConstIterator begin() const
Ptr< ObjType > getNonconstObjPtr(const Ordinal &idx)
Get a nonconst semi-persisting association with the stored object indexed by ordinal.
StringIndexedOrderedValueObjectContainerBase::Ordinal Ordinal
Ordinal used for the index.
Ptr< const ObjType > getObjPtr(const Ordinal &idx) const
Get a const semi-persisting association with the stored object indexed by ordinal.
void removeObj(const std::string &key)
Remove an object given its string key.
StringIndexedOrderedValueObjectContainer()
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...