GLAMERDOC++
Gravitational Lensing Code Library
|
A container that can hold mixed objects all derived from a base class and retains the ability to access derived class functions/members. More...
#include <utilities_slsim.h>
Public Member Functions | |
MixedVector () | |
default constructor | |
~MixedVector () | |
destroy the vector and all contained items | |
MixedVector< BaseT > & | operator= (MixedVector< BaseT > rhs) |
assign one MixedVector to another | |
template<typename SubclassT > | |
void | copy_back (const SubclassT &obj) |
add a copy of an object of type SubclassT to the vector, in contrast push_back() deos not copy and will take possession of the object | |
void | pop_back () |
pop element from back of vector | |
template<typename SubclassT > | |
void | pop_back () |
erase the last element of a specific type | |
void | clear () |
clear all elements | |
template<typename SubclassT > | |
void | clear () |
clear all elements of a given type | |
BaseT * | data () |
direct access to underlying array | |
const BaseT * | data () const |
direct access to underlying array (const) | |
template<typename SubclassT > | |
bool | type (std::size_t i) |
Checks if element i is of the derived type SubclassT. | |
BaseT & | operator[] (std::size_t i) |
Indexing operator for all elements. | |
const BaseT & | operator[] (std::size_t i) const |
Indexing operator for all elements (const). | |
BaseT & | get (std::size_t i) |
indexed access | |
const BaseT & | get (std::size_t i) const |
indexed access (const) | |
template<typename SubclassT > | |
SubclassT & | get (std::size_t i) |
indexed access for type SubclassT | |
template<typename SubclassT > | |
const SubclassT & | get (std::size_t i) const |
indexed access for type SubclassT (const) | |
BaseT & | at (std::size_t i) |
indexed access with bounds checking | |
const BaseT & | at (std::size_t i) const |
indexed access with bounds checking (const) | |
template<typename SubclassT > | |
SubclassT & | at (std::size_t i) |
Templated indexing operator for elements of a specific derived class. The index runs 0 ... size<SubclassT>() - 1 Does bounds checking. | |
template<typename SubclassT > | |
const SubclassT & | at (std::size_t i) const |
Templated indexing operator for elements of a specific derived class (const). | |
std::size_t | size () const |
number of all elements | |
template<typename SubclassT > | |
std::size_t | size () const |
number of elements of a specific type | |
bool | empty () const |
check if vector of items is empty | |
template<typename SubclassT > | |
bool | empty () const |
check if vector of items of type SubclassT is empty | |
iterator | begin () |
get iterator to first of all items | |
iterator | end () |
get iterator to last of all items | |
template<typename SubclassT > | |
iterator< SubclassT > | begin () |
get iterator to first of items of type SubclassT | |
template<typename SubclassT > | |
iterator< SubclassT > | end () |
get iterator to last of items of type SubclassT | |
Friends | |
void | swap (MixedVector< BaseT > &a, MixedVector< BaseT > &b) |
swap two MixedVectors | |
A container that can hold mixed objects all derived from a base class and retains the ability to access derived class functions/members.
The indexing operator is overridden to return a reference to the base class and a templated index<>() function provides a reference to elements with derived class type information.
example: InputParams params(paramfile); params.put("gauss_r2",1,"non"); SourceGaussian source1(params); SourceUniform source2(params); Utilities::MixedVector<Source> mvector; mvector.push_back(source1); mvector.push_back(source1); mvector.push_back(source2); mvector.push_back(source2); std::cout << "Number of Uniform Sources " << mvector.size<SourceUniform>() << " Number of Gausssian Sources " << mvector.size<SourceGaussian>() << std::endl; // change derived class attribute mvector.get<SourceGaussian>(0).source_gauss_r2 = 0.5; std::cout << "A base class attribute " << mvector[2].getTotalFlux() << " A derived class attribute " << mvector.get<SourceGaussian>(0).source_gauss_r2 << " " << mvector.get<SourceGaussian>(1).source_gauss_r2 << std::endl; // iterate all sources for(Utilities::MixedVector<Source>::iterator<> it = mvector.begin(); it != mvector.end(); ++it) std::cout << "A base class attribute " << it->getTotalFlux() << std::endl; // iterate SersicSources for(Utilities::MixedVector<Source>::iterator<SersicSource> it = mvector.begin<SersicSource>(); it != mvector.end<SersicSource>(); ++it) std::cout << "A derived class attribute " << it->getSersicIndex() << std::endl; *