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> &,
228 [](
auto &&...elems) {
229 return std::vector<AttributeBase::Ptr>{
230 std::forward<decltype(elems)>(elems)...};
242 public std::enable_shared_from_this<Attribute<T>> {
253 *
mData = initialValue;
260 virtual void set(T value) = 0;
285 std::stringstream ss;
300 operator const T &() {
return this->
get(); }
315 std::dynamic_pointer_cast<Attribute<T>>(copyFrom.
getPtr());
316 if (copyFromTyped.
getPtr() ==
nullptr) {
319 this->
set(**copyFromTyped);
327 const std::type_info &
getType()
override {
return typeid(T); }
353 auto derivedAttribute = std::make_shared<AttributeDynamic<U>>();
355 derivedAttribute->addTask(
362 derivedAttribute->addTask(
368 return derivedAttribute;
375 template <
typename U = T,
376 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
381 [](std::shared_ptr<Real> &dependent,
383 *dependent = (**dependency).real();
386 [](std::shared_ptr<Real> &dependent,
389 currentValue.real(*dependent);
390 dependency->set(currentValue);
399 template <
typename U = T,
400 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
405 [](std::shared_ptr<Real> &dependent,
407 *dependent = (**dependency).imag();
410 [](std::shared_ptr<Real> &dependent,
413 currentValue.imag(*dependent);
414 dependency->set(currentValue);
423 template <
typename U = T,
424 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
429 [](std::shared_ptr<Real> &dependent,
434 [](std::shared_ptr<Real> &dependent,
446 template <
typename U = T,
447 std::enable_if_t<std::is_same_v<Complex, U>,
bool> =
true>
452 [](std::shared_ptr<Real> &dependent,
457 [](std::shared_ptr<Real> &dependent,
470 template <
typename U = T, std::enable_if_t<std::is_same_v<Real, U> ||
471 std::is_same_v<Complex, U>,
478 *dependent = scale * (**dependency);
482 dependency->set((*dependent) / scale);
494 template <
class U,
class V = T,
495 std::enable_if_t<std::is_same_v<CPS::MatrixVar<U>, V>,
bool> =
true>
502 [row, column](std::shared_ptr<U> &dependent,
504 *dependent = (**dependency)(row, column);
507 [row, column](std::shared_ptr<U> &dependent,
510 currentValue(row, column) = *dependent;
511 dependency->set(currentValue);
529 virtual void set(T value)
override { *this->mData = value; };
531 virtual T &
get()
override {
return *this->mData; };
533 virtual bool isStatic()
const override {
return true; }
539 virtual std::shared_ptr<T>
asRawPointer()
override {
return this->mData; }
542 deps->insert(this->shared_from_this());
617 [](std::shared_ptr<T> &dependent,
619 dependent = dependency->asRawPointer();
622 if (reference->isStatic()) {
635 task->executeUpdate(this->mData);
640 virtual void set(T value)
override {
641 *this->mData = value;
643 task->executeUpdate(this->mData);
647 virtual T &
get()
override {
649 task->executeUpdate(this->mData);
654 virtual bool isStatic()
const override {
return false; }
662 deps->insert(this->shared_from_this());
667 newDeps.insert(taskDeps.begin(), taskDeps.end());
672 newDeps.insert(taskDeps.begin(), taskDeps.end());
675 for (
auto dependency : newDeps) {
676 dependency->appendDependencies(deps);
693template <
typename T>
struct hash<
CPS::AttributePointer<T>> {
695 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