diff --git a/include/core/sensor/spec_state_sensor.h b/include/core/sensor/spec_state_sensor.h index c8ea62affc3009528ea7c3b271200a4a2810f24e..c1391a5349c12f7f8a893de3d3e97b5252b2f1b4 100644 --- a/include/core/sensor/spec_state_sensor.h +++ b/include/core/sensor/spec_state_sensor.h @@ -53,13 +53,7 @@ class SpecStateSensor : public SpecState std::string print(const std::string& _spaces = "") const override; }; -class SpecSensorComposite : public SpecCompositeTemplate<SpecStateSensor> -{ - public: - using SpecCompositeTemplate::SpecCompositeTemplate; - - SpecComposite getSpecComposite() const; -}; +typedef TemplateComposite<SpecStateSensor> SpecSensorComposite; inline bool SpecStateSensor::isDynamic() const { return dynamic_; } diff --git a/include/core/state_block/spec_composite.h b/include/core/state_block/spec_composite.h index f53b296fdc215ef0b088d06c0d6c2503c6c540cf..f0bda4d634c2d1e19b6bffa0be90d17abba61fda 100644 --- a/include/core/state_block/spec_composite.h +++ b/include/core/state_block/spec_composite.h @@ -65,27 +65,38 @@ class SpecState virtual std::string print(const std::string& _spaces = "") const; }; -template <typename SPEC> -class SpecCompositeTemplate : public std::unordered_map<char, SPEC> +template <typename T> +class TemplateComposite : public std::unordered_map<char, T> { public: - using unordered_map<char, SPEC>::unordered_map; + using unordered_map<char, T>::unordered_map; - SpecCompositeTemplate(const YAML::Node& _n); - virtual ~SpecCompositeTemplate() = default; + TemplateComposite(const YAML::Node& _n); + virtual ~TemplateComposite() = default; VectorComposite getState() const; - void emplace(char _key, const SPEC& _spec); + template <typename OTHER_T> + TemplateComposite<OTHER_T> cast() const + { + TemplateComposite<OTHER_T> casted_composite; + for (auto pair : *this) + { + casted_composite.emplace(pair.first, static_cast<OTHER_T>(pair.second)); + } + return casted_composite; + } + + void emplace(char _key, const T& _spec); std::string print() const; }; -typedef SpecCompositeTemplate<SpecState> SpecComposite; +typedef TemplateComposite<SpecState> SpecComposite; -template <typename SPEC> -SpecCompositeTemplate<SPEC>::SpecCompositeTemplate(const YAML::Node& _n) +template <typename T> +TemplateComposite<T>::TemplateComposite(const YAML::Node& _n) { if (not _n.IsMap()) { @@ -93,18 +104,18 @@ SpecCompositeTemplate<SPEC>::SpecCompositeTemplate(const YAML::Node& _n) } for (auto spec_pair : _n) { - this->emplace(spec_pair.first.as<char>(), SPEC(spec_pair.second)); + this->emplace(spec_pair.first.as<char>(), T(spec_pair.second)); } } -template <typename SPEC> -void SpecCompositeTemplate<SPEC>::emplace(char _key, const SPEC& _spec) +template <typename T> +void TemplateComposite<T>::emplace(char _key, const T& _spec) { this->insert({_key,_spec}); } -template <typename SPEC> -VectorComposite SpecCompositeTemplate<SPEC>::getState() const +template <typename T> +VectorComposite TemplateComposite<T>::getState() const { VectorComposite states; for (auto spec_pair : *this) @@ -114,8 +125,14 @@ VectorComposite SpecCompositeTemplate<SPEC>::getState() const return states; } -template <typename SPEC> -std::string SpecCompositeTemplate<SPEC>::print() const +// template <typename T, typename OTHER_T> +// TemplateComposite<OTHER_T> TemplateComposite<T>::cast() const +// { +// return TemplateComposite<OTHER_T>(); +// } + +template <typename T> +std::string TemplateComposite<T>::print() const { std::string output; diff --git a/src/sensor/sensor_base.cpp b/src/sensor/sensor_base.cpp index bdcfc17b0a5c94b48705d9e876ee1a469286b998..b2a5f8ee65c25fe2479e35b768de29419282328f 100644 --- a/src/sensor/sensor_base.cpp +++ b/src/sensor/sensor_base.cpp @@ -73,6 +73,10 @@ SensorBase::SensorBase(const std::string& _type, if (prior.isDynamic()) setDriftStd(key, prior.getDriftStd()); } + + WOLF_INFO(_priors.print()); + auto base_prior = _priors.cast<SpecState>(); + WOLF_INFO(base_prior.print()); } SensorBase::~SensorBase() diff --git a/src/sensor/spec_state_sensor.cpp b/src/sensor/spec_state_sensor.cpp index 281338cc66a9f0f12bfa58839935a99762f6643a..524d6003233a4031608d799ea6748c395d5a2e7e 100644 --- a/src/sensor/spec_state_sensor.cpp +++ b/src/sensor/spec_state_sensor.cpp @@ -27,19 +27,6 @@ namespace wolf { -SpecComposite SpecSensorComposite::getSpecComposite() const -{ - SpecComposite spec_composite; - for (auto spec_sensor_pair : *this) - { - spec_composite.emplace(spec_sensor_pair.first, SpecState(spec_sensor_pair.second.getType(), - spec_sensor_pair.second.getState(), - spec_sensor_pair.second.getMode(), - spec_sensor_pair.second.getNoiseStd())); - } - return spec_composite; -} - SpecStateSensor::SpecStateSensor(const std::string& _type, const Eigen::VectorXd& _state, const std::string& _mode, diff --git a/src/state_block/has_state_blocks.cpp b/src/state_block/has_state_blocks.cpp index 67f6a6fa7a5204c3e827113cafea638644de6a1f..2f59aa27eef3604d78b79e90fa22cfa33bc1a581 100644 --- a/src/state_block/has_state_blocks.cpp +++ b/src/state_block/has_state_blocks.cpp @@ -57,10 +57,13 @@ HasStateBlocks::HasStateBlocks(const SpecComposite& _specs) StateBlockPtr HasStateBlocks::addStateBlock(const char& _sb_key, const StateBlockPtr& _sb, ProblemPtr _problem) { - assert(state_block_map_.count(_sb_key) == 0 && state_block_const_map_.count(_sb_key) == 0 && "Trying to add a state block with an existing type! Use setStateBlock instead."); + assert(state_block_map_.count(_sb_key) == 0 and + state_block_const_map_.count(_sb_key) == 0 and + "Trying to add a state block with an existing type! Use setStateBlock instead."); + state_block_map_.emplace(_sb_key, _sb); state_block_const_map_.emplace(_sb_key, _sb); - if (!isInStructure(_sb_key)) + if (not isInStructure(_sb_key)) appendToStructure(_sb_key); // conditionally register to problem