Class: Syskit::Models::CompositionSpecialization
- Defined in:
- lib/syskit/models/composition_specialization.rb
Overview
Representation of a composition specialization
Defined Under Namespace
Modules: Extension
Instance Attribute Summary collapse
-
#compatibilities ⇒ Object
readonly
Cache of compatibilities: this is a cache of other Specialization objects that can be applied at the same time that this one.
-
#composition_model ⇒ Object
The composition model that can be used to instanciate this specialization.
-
#root_name ⇒ String
The name of the composition model that is being specialized.
-
#specialization_blocks ⇒ Object
readonly
The set of blocks that have been passed to the corresponding specialize calls.
-
#specialized_children ⇒ {String=>[Model<Component>,Model<DataService>]}
readonly
The specialization constraints, as a map from child name to set of models (data services or components).
Class Method Summary collapse
-
.merge(*specs) ⇒ CompositionSpecialization
Create a new composition specialization object which is the merge of all the given specs.
Instance Method Summary collapse
-
#add(new_spec, new_blocks) ⇒ Object
Add new specializations and blocks to
self
without checking for compatibility. -
#compatible_with?(spec) ⇒ Boolean
Returns true if
spec
is compatible withself
. -
#empty? ⇒ Boolean
True if this does not specialize on anything.
- #find_specialization(child_name, model) ⇒ Object
-
#has_specialization?(child_name, model) ⇒ Boolean
Returns true if
self
specializes onchild_name
in a way that is compatible withmodel
. -
#initialize(spec = Hash.new, block = nil) ⇒ CompositionSpecialization
constructor
A new instance of CompositionSpecialization.
- #initialize_copy(old) ⇒ Object
-
#merge(other_spec) ⇒ Object
Merge the specialization specification of
other_spec
intoself
. -
#strong_match?(selection) ⇒ Boolean
Tests if this specialization could be used for the given selection.
- #to_s ⇒ Object
-
#weak_match?(selection) ⇒ Boolean
Tests if this specialization could be used for the given selection, ignoring selections that do not have a corresponding entry in the specialization.
Constructor Details
#initialize(spec = Hash.new, block = nil) ⇒ CompositionSpecialization
Returns a new instance of CompositionSpecialization
98 99 100 101 102 103 104 105 |
# File 'lib/syskit/models/composition_specialization.rb', line 98 def initialize(spec = Hash.new, block = nil) @specialized_children = spec @specialization_blocks = Array.new if block @specialization_blocks << block end @compatibilities = Set.new end |
Instance Attribute Details
#compatibilities ⇒ Object (readonly)
Cache of compatibilities: this is a cache of other Specialization objects that can be applied at the same time that this one.
Two compositions are compatible if their specialization sets are either disjoints (they don't specialize on the same children) or if it is possible that a component provides both the required models.
84 85 86 |
# File 'lib/syskit/models/composition_specialization.rb', line 84 def compatibilities @compatibilities end |
#composition_model ⇒ Object
The composition model that can be used to instanciate this specialization. This is a subclass of the composition that this specialization specializes.
96 97 98 |
# File 'lib/syskit/models/composition_specialization.rb', line 96 def composition_model @composition_model end |
#root_name ⇒ String
The name of the composition model that is being specialized.
It is only used for display purposes
91 92 93 |
# File 'lib/syskit/models/composition_specialization.rb', line 91 def root_name @root_name end |
#specialization_blocks ⇒ Object (readonly)
The set of blocks that have been passed to the corresponding specialize calls. These blocks are going to be evaluated in the task model that will be created (on demand) to create tasks of this specialization
74 75 76 |
# File 'lib/syskit/models/composition_specialization.rb', line 74 def specialization_blocks @specialization_blocks end |
#specialized_children ⇒ {String=>[Model<Component>,Model<DataService>]} (readonly)
The specialization constraints, as a map from child name to set of models (data services or components)
68 69 70 |
# File 'lib/syskit/models/composition_specialization.rb', line 68 def specialized_children @specialized_children end |
Class Method Details
.merge(*specs) ⇒ CompositionSpecialization
Create a new composition specialization object which is the merge of all the given specs
167 168 169 170 171 172 173 |
# File 'lib/syskit/models/composition_specialization.rb', line 167 def self.merge(*specs) composite_spec = CompositionSpecialization.new specs.each do |spec| composite_spec.merge(spec) end composite_spec end |
Instance Method Details
#add(new_spec, new_blocks) ⇒ Object
Add new specializations and blocks to self
without checking
for compatibility
152 153 154 155 156 157 158 159 160 161 |
# File 'lib/syskit/models/composition_specialization.rb', line 152 def add(new_spec, new_blocks) specialized_children.merge!(new_spec) do |child_name, models_a, models_b| Models.merge_model_lists(models_a, models_b) end if new_blocks.respond_to?(:to_ary) specialization_blocks.concat(new_blocks) elsif new_blocks specialization_blocks << new_blocks end end |
#compatible_with?(spec) ⇒ Boolean
Returns true if spec
is compatible with self
See #compatibilities for more information on compatible specializations
128 129 130 |
# File 'lib/syskit/models/composition_specialization.rb', line 128 def compatible_with?(spec) empty? || spec == self || spec.empty? || compatibilities.include?(spec) end |
#empty? ⇒ Boolean
True if this does not specialize on anything
114 115 116 |
# File 'lib/syskit/models/composition_specialization.rb', line 114 def empty? specialized_children.empty? end |
#find_specialization(child_name, model) ⇒ Object
132 133 134 135 136 137 138 139 140 |
# File 'lib/syskit/models/composition_specialization.rb', line 132 def find_specialization(child_name, model) if selected_models = specialized_children[child_name] if matches = selected_models.find_all { |m| m.fullfills?(model) } if !matches.empty? return matches end end end end |
#has_specialization?(child_name, model) ⇒ Boolean
Returns true if self
specializes on child_name
in
a way that is compatible with model
144 145 146 147 148 |
# File 'lib/syskit/models/composition_specialization.rb', line 144 def has_specialization?(child_name, model) if selected_models = specialized_children[child_name] selected_models.any? { |m| m.fullfills?(model) } end end |
#initialize_copy(old) ⇒ Object
107 108 109 110 111 |
# File 'lib/syskit/models/composition_specialization.rb', line 107 def initialize_copy(old) @specialized_children = old.specialized_children.dup @specialization_blocks = old.specialization_blocks.dup @compatibilities = old.compatibilities.dup end |
#merge(other_spec) ⇒ Object
Merge the specialization specification of other_spec
into
self
177 178 179 180 181 182 183 184 185 186 187 188 |
# File 'lib/syskit/models/composition_specialization.rb', line 177 def merge(other_spec) @compatibilities = if empty? other_spec.compatibilities.dup else compatibilities & other_spec.compatibilities.dup end @compatibilities << other_spec add(other_spec.specialized_children, other_spec.specialization_blocks) self end |
#strong_match?(selection) ⇒ Boolean
Tests if this specialization could be used for the given selection. All the children in the selection must have a corresponding entry in the specialization for this to return true
231 232 233 234 235 236 237 |
# File 'lib/syskit/models/composition_specialization.rb', line 231 def strong_match?(selection) specialized_children.all? do |child_name, child_models| if this_selection = selection[child_name] this_selection.fullfills?(child_models) end end end |
#to_s ⇒ Object
118 119 120 121 122 |
# File 'lib/syskit/models/composition_specialization.rb', line 118 def to_s root_name.to_s + "/" + specialized_children.map do |child_name, child_models| "#{child_name}.is_a?(#{child_models.map(&:short_name).join(",")})" end.join(",") end |
#weak_match?(selection) ⇒ Boolean
Tests if this specialization could be used for the given selection, ignoring selections that do not have a corresponding entry in the specialization
204 205 206 207 208 209 210 211 212 213 214 |
# File 'lib/syskit/models/composition_specialization.rb', line 204 def weak_match?(selection) has_match = false result = specialized_children.all? do |child_name, child_models| if this_selection = selection[child_name] has_match = true this_selection.fullfills?(child_models) else true end end has_match && result end |