13#include <dpsim-models/Config.h>
34template <
class T>
class Attribute;
36template <
class T>
class AttributeStatic;
38template <
class T>
class AttributeDynamic;
63 this->mPtr = r.getPtr();
69 this->mPtr = r.getPtr();
85 T *
operator->() const noexcept {
return mPtr.operator->(); }
87 T *
get()
const {
return mPtr.get(); }
89 std::shared_ptr<T>
getPtr()
const {
return mPtr; }
91 bool isNull()
const {
return mPtr ==
nullptr; }
94 std::shared_ptr<T> mPtr;
124 typedef std::set<Ptr, AttributeCmp<AttributeBase>>
Set;
125 typedef std::map<String, Ptr>
Map;
182 typedef std::shared_ptr<AttributeUpdateTaskBase<DependentType>>
Ptr;
194template <
class DependentType,
class... DependencyTypes>
198 AttributeUpdateTask<DependentType, DependencyTypes...>> {
202 std::function<void(std::shared_ptr<DependentType> &,
229 [](
auto &&...elems) {
230 return std::vector<AttributeBase::Ptr>{
231 std::forward<decltype(elems)>(elems)...};
243 public std::enable_shared_from_this<Attribute<T>> {
254 *
mData = initialValue;
261 virtual void set(T value) = 0;
286 std::stringstream ss;
301 operator const T &() {
return this->
get(); }
316 std::dynamic_pointer_cast<Attribute<T>>(copyFrom.
getPtr());
317 if (copyFromTyped.
getPtr() ==
nullptr) {
320 this->
set(**copyFromTyped);
328 const std::type_info &
getType()
override {
return typeid(T); }
354 auto derivedAttribute = std::make_shared<AttributeDynamic<U>>();
356 derivedAttribute->addTask(
363 derivedAttribute->addTask(
369 return derivedAttribute;
376 template <
typename U = T,
377 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
382 [](std::shared_ptr<Real> &dependent,
384 *dependent = (**dependency).real();
387 [](std::shared_ptr<Real> &dependent,
390 currentValue.real(*dependent);
391 dependency->set(currentValue);
400 template <
typename U = T,
401 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
406 [](std::shared_ptr<Real> &dependent,
408 *dependent = (**dependency).imag();
411 [](std::shared_ptr<Real> &dependent,
414 currentValue.imag(*dependent);
415 dependency->set(currentValue);
424 template <
typename U = T,
425 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
430 [](std::shared_ptr<Real> &dependent,
435 [](std::shared_ptr<Real> &dependent,
447 template <
typename U = T,
448 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
453 [](std::shared_ptr<Real> &dependent,
458 [](std::shared_ptr<Real> &dependent,
471 template <
typename U = T, std::enable_if_t<std::is_same_v<Real, U> ||
472 std::is_same_v<Complex, U>,
479 *dependent = scale * (**dependency);
483 dependency->set((*dependent) / scale);
495 template <
class U,
class V = T,
496 std::enable_if_t<std::is_same_v<CPS::MatrixVar<U>, V>,
bool> =
true>
503 [row, column](std::shared_ptr<U> &dependent,
505 *dependent = (**dependency)(row, column);
508 [row, column](std::shared_ptr<U> &dependent,
511 currentValue(row, column) = *dependent;
512 dependency->set(currentValue);
530 virtual void set(T value)
override { *this->mData = value; };
532 virtual T &
get()
override {
return *this->mData; };
534 virtual bool isStatic()
const override {
return true; }
540 virtual std::shared_ptr<T>
asRawPointer()
override {
return this->mData; }
543 deps->insert(this->shared_from_this());
618 [](std::shared_ptr<T> &dependent,
620 dependent = dependency->asRawPointer();
623 if (reference->isStatic()) {
636 task->executeUpdate(this->mData);
641 virtual void set(T value)
override {
642 *this->mData = value;
644 task->executeUpdate(this->mData);
648 virtual T &
get()
override {
650 task->executeUpdate(this->mData);
655 virtual bool isStatic()
const override {
return false; }
663 deps->insert(this->shared_from_this());
668 newDeps.insert(taskDeps.begin(), taskDeps.end());
673 newDeps.insert(taskDeps.begin(), taskDeps.end());
676 for (
auto dependency : newDeps) {
677 dependency->appendDependencies(deps);
694template <
typename T>
struct hash<
CPS::AttributePointer<T>> {
696 return std::hash<std::shared_ptr<T>>()(x.
getPtr());
virtual bool isStatic() const =0
virtual const std::type_info & getType()=0
Get the type of this attribute.
virtual ~AttributeBase()=default
virtual bool copyValue(AttributeBase::Ptr copyFrom)=0
Copy the attribute value of copyFrom onto this attribute.
virtual String toString()=0
virtual AttributeBase::Set getDependencies() final
virtual void appendDependencies(AttributeBase::Set *deps)=0
virtual AttributeBase::Ptr cloneValueOntoNewAttribute()=0
Generates a new attribute of the same type and copies the current value in the heap....
AttributePointer< AttributeBase > Ptr
std::set< Ptr, AttributeCmp< AttributeBase > > Set
std::map< String, Ptr > Map
AttributeDynamic(T initialValue=T())
void addTask(UpdateTaskKind kind, typename AttributeUpdateTaskBase< T >::Ptr task)
std::vector< typename AttributeUpdateTaskBase< T >::Ptr > updateTasksOnGet
virtual void setReference(typename Attribute< T >::Ptr reference) override
virtual void appendDependencies(AttributeBase::Set *deps) override
std::vector< typename AttributeUpdateTaskBase< T >::Ptr > updateTasksOnSet
std::vector< typename AttributeUpdateTaskBase< T >::Ptr > updateTasksOnce
void clearTasks(UpdateTaskKind kind)
virtual void set(T value) override
virtual std::shared_ptr< T > asRawPointer() override
virtual bool isStatic() const override
virtual T & get() override
const std::type_info & getType() override
Get the type of this attribute.
T & operator*()
User-defined dereference operator.
AttributePointer< Attribute< T > > deriveScaled(T scale)
Attribute(T initialValue=T())
AttributePointer< Attribute< Real > > deriveImag()
AttributePointer< Attribute< Real > > derivePhase()
AttributePointer< Attribute< U > > deriveCoeff(typename CPS::MatrixVar< U >::Index row, typename CPS::MatrixVar< U >::Index column)
virtual std::shared_ptr< T > asRawPointer()=0
AttributePointer< Attribute< Real > > deriveReal()
virtual void setReference(Attribute< T >::Ptr reference)=0
virtual void set(T value)=0
String toString() override
Fallback method for all attribute types not covered by the specifications in Attribute....
AttributeBase::Ptr cloneValueOntoNewAttribute() override
Generates a new attribute of the same type and copies the current value in the heap....
AttributePointer< Attribute< Real > > deriveMag()
bool copyValue(AttributeBase::Ptr copyFrom) override
Copy the attribute value of copyFrom onto this attribute.
std::shared_ptr< T > mData
AttributePointer< Attribute< T > > Ptr
Attribute< U >::Ptr derive(typename AttributeUpdateTask< U, T >::Actor getter=typename AttributeUpdateTask< U, T >::Actor(), typename AttributeUpdateTask< U, T >::Actor setter=typename AttributeUpdateTask< U, T >::Actor())
AttributePointer(std::nullptr_t ptr)
AttributePointer(std::shared_ptr< T > ptr)
AttributePointer & operator=(const AttributePointer< U > &r) noexcept
T & operator*() const noexcept
AttributePointer(std::shared_ptr< U > ptr)
AttributePointer & operator=(AttributePointer< U > &&r)
T * operator->() const noexcept
AttributePointer & operator=(AttributePointer &&r)
std::shared_ptr< T > getPtr() const
AttributePointer(const AttributePointer &r)=default
AttributePointer(AttributePointer< U > ptr)
AttributePointer & operator=(const AttributePointer &r) noexcept
virtual void set(T value) override
virtual std::shared_ptr< T > asRawPointer() override
virtual void appendDependencies(AttributeBase::Set *deps) override
AttributeStatic(T initialValue=T())
virtual void setReference(typename Attribute< T >::Ptr reference) override
virtual bool isStatic() const override
virtual T & get() override
virtual ~AttributeUpdateTaskBase()=default
virtual AttributeBase::List getDependencies()=0
virtual void executeUpdate(std::shared_ptr< DependentType > &dependent)=0
std::shared_ptr< AttributeUpdateTaskBase< DependentType > > Ptr
virtual void executeUpdate(std::shared_ptr< DependentType > &dependent) override
AttributeUpdateTask(UpdateTaskKind kind, Actor &actorFunction, typename Attribute< DependencyTypes >::Ptr... dependencies)
std::tuple< typename Attribute< DependencyTypes >::Ptr... > mDependencies
virtual AttributeBase::List getDependencies() override
std::function< void(std::shared_ptr< DependentType > &, typename Attribute< DependencyTypes >::Ptr...)> Actor
static Complex polar(Real abs, Real phase)
static Real phase(Complex value)
static Real abs(Complex value)
static std::shared_ptr< T > make(Args &&...args)
@ UPDATE_ON_SIMULATION_STEP
Eigen::Matrix< VarType, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor > MatrixVar
std::complex< Real > Complex
bool operator()(CPS::AttributePointer< T > a, CPS::AttributePointer< T > b) const
bool operator()(CPS::AttributePointer< T > a, CPS::AttributePointer< T > b) const
size_t operator()(CPS::AttributePointer< T > const &x) const