24 class dimension_impl {
27 using wptr = std::weak_ptr<dimension_impl>;
28 using sptr = std::shared_ptr<dimension_impl>;
31 for (
auto dependency: expr_.dependencies_) {
32 dependency->dependents_.erase(self);
53 const std::unordered_map<std::string,
dimension<S>>& parameters
60 const std::unordered_map<std::string,
dimension<S>>& global_parameters
64 return not expr_.empty();
70 for (
auto dependency: expr_.dependencies_) {
71 dependency->dependents_.erase(self);
81 explicit dimension_impl(
const std::shared_ptr<context<T>> ctx)
85 if (expression == expr_) {
89 for (
const auto& param: expr_.parameters_) {
90 if (context_->contains(param.name)) {
91 auto& param_dim = context_->operator[](param.name);
92 param_dim.impl_->dependents_.erase(self);
95 for (
auto dependency: expr_.dependencies_) {
96 dependency->dependents_.erase(self);
101 for (
const auto& param: expr_.parameters_) {
102 if (context_->contains(param.name)) {
103 auto& param_dim = context_->operator[](param.name);
104 param_dim.impl_->dependents_.insert(self);
107 for (
auto dependency: expr_.dependencies_) {
108 dependency->dependents_.insert(self);
112 void set_context(
const std::shared_ptr<context<T>>& ctx,
const std::string& name =
"") {
113 std::shared_ptr<context<T>> new_ctx = ctx;
114 for (
const auto& param: expr_.parameters_) {
115 if (context_->contains(param.name)) {
116 auto& param_dim = context_->operator[](param.name);
117 param_dim.impl_->dependents_.erase(self);
121 context_.swap(new_ctx);
124 for (
const auto& param: expr_.parameters_) {
125 if (context_->contains(param.name)) {
126 auto& param_dim = context_->operator[](param.name);
127 param_dim.impl_->dependents_.insert(self);
132 void mark_unknown() {
134 for (
auto dependent: dependents_) {
135 if (dependent.expired()) {
136 dependents_.erase(dependent);
138 if (!dependent.lock()->unknown_) {
139 dependent.lock()->mark_unknown();
153 bool is_unknown()
const {
160 bool unknown_ =
true;
162 std::unordered_set<wptr> dependents_{};
163 std::shared_ptr<context<T>> context_;
friend bool find_cycle(cycle_t< S > &cycle, typename dimension_impl< S >::sptr start, typename dimension_impl< S >::sptr head, const std::unordered_map< std::string, dimension< S > > &global_parameters)