49#ifndef DOXYGEN_SHOULD_SKIP_THIS
63 GUM_CONSTRUCTOR(IdCondSetIterator);
67 INLINE IdCondSetIterator::IdCondSetIterator(
const IdCondSetIterator& from) :
68 _seq_(from._seq_), _index_(from._index_) {
69 GUM_CONS_CPY(IdCondSetIterator);
73 INLINE IdCondSetIterator::IdCondSetIterator(IdCondSetIterator&& from) :
74 _seq_(from._seq_), _index_(from._index_) {
75 GUM_CONS_MOV(IdCondSetIterator);
79 INLINE IdCondSetIterator::~IdCondSetIterator() { GUM_DESTRUCTOR(IdCondSetIterator); }
82 INLINE
void IdCondSetIterator::_gotoEnd_() {
83 if (_seq_ !=
nullptr) _index_ = _seq_->size();
84 else _index_ = std::size_t(0);
88 INLINE IdCondSetIterator& IdCondSetIterator::operator=(
const IdCondSetIterator& from) {
90 _index_ = from._index_;
95 INLINE IdCondSetIterator& IdCondSetIterator::operator=(IdCondSetIterator&& from) {
97 _index_ = from._index_;
102 INLINE NodeId IdCondSetIterator::operator*()
const {
return _seq_->operator[](_index_); }
105 INLINE
bool IdCondSetIterator::operator!=(
const IdCondSetIterator& from)
const {
106 return (_index_ != from._index_) || (_seq_ != from._seq_);
110 INLINE
bool IdCondSetIterator::operator==(
const IdCondSetIterator& from)
const {
115 INLINE IdCondSetIterator& IdCondSetIterator::operator++() {
121 INLINE IdCondSetIterator& IdCondSetIterator::operator+=(
const std::size_t i) {
127 INLINE IdCondSetIterator IdCondSetIterator::operator+(
const std::size_t i) {
128 IdCondSetIterator res(*
this);
134 INLINE std::size_t IdCondSetIterator::pos()
const {
135 if (_seq_ ==
nullptr)
137 "The IdCondSet is empty, so its iterators have no position")
138 if (_index_ >= _seq_->size())
140 "the IdCondSet iterator has no position because it reached "
150 INLINE IdCondSet::IdCondSet() : _end_safe_(*this) { GUM_CONSTRUCTOR(IdCondSet); }
153 INLINE IdCondSet::IdCondSet(
const std::vector< NodeId >& ids,
155 const bool ordered_ids) : _end_safe_(*this) {
156 _ids_.resize(ids.size());
161 std::vector< NodeId > vect(ids);
162 std::sort(vect.begin(), vect.end());
163 for (
const auto id: vect)
166 for (
const auto id: ids)
170 if (!rhs_ids) _nb_lhs_ids_ = _ids_.size();
173 _end_safe_._gotoEnd_();
175 GUM_CONSTRUCTOR(IdCondSet);
179 INLINE IdCondSet::IdCondSet(NodeId var1,
180 const std::vector< NodeId >& rhs_ids,
181 const bool ordered_rhs_ids) :
182 _nb_lhs_ids_(
std::size_t(1)), _end_safe_(*this) {
183 _ids_.resize(rhs_ids.size() + std::size_t(1));
188 if (!ordered_rhs_ids) {
189 std::vector< NodeId > vect(rhs_ids);
190 std::sort(vect.begin(), vect.end());
191 for (
const auto id: vect)
194 for (
const auto id: rhs_ids)
199 _end_safe_._gotoEnd_();
201 GUM_CONSTRUCTOR(IdCondSet);
205 INLINE IdCondSet::IdCondSet(NodeId var1,
207 const std::vector< NodeId >& rhs_ids,
208 const bool ordered_lhs_vars,
209 const bool ordered_rhs_ids) :
210 _nb_lhs_ids_(
std::size_t(2)), _end_safe_(*this) {
211 _ids_.resize(rhs_ids.size() + std::size_t(2));
215 if (!ordered_lhs_vars && (var1 > var2)) std::swap(var1, var2);
221 if (!ordered_rhs_ids) {
222 std::vector< NodeId > vect(rhs_ids);
223 std::sort(vect.begin(), vect.end());
224 for (
const auto id: vect)
227 for (
const auto id: rhs_ids)
232 _end_safe_._gotoEnd_();
234 GUM_CONSTRUCTOR(IdCondSet);
238 INLINE IdCondSet::IdCondSet(NodeId var1,
241 const std::vector< NodeId >& rhs_ids,
242 const bool ordered_lhs_vars,
243 const bool ordered_rhs_ids) :
244 _nb_lhs_ids_(
std::size_t(3)), _end_safe_(*this) {
245 _ids_.resize(rhs_ids.size() + std::size_t(3));
249 if (!ordered_lhs_vars) {
250 if (var1 > var2) std::swap(var1, var2);
251 if (var1 > var3) std::swap(var1, var3);
252 if (var2 > var3) std::swap(var2, var3);
260 if (!ordered_rhs_ids) {
261 std::vector< NodeId > vect(rhs_ids);
262 std::sort(vect.begin(), vect.end());
263 for (
const auto id: vect)
266 for (
const auto id: rhs_ids)
271 _end_safe_._gotoEnd_();
273 GUM_CONSTRUCTOR(IdCondSet);
277 INLINE IdCondSet::IdCondSet(
const IdCondSet& from) :
278 _ids_(from._ids_), _nb_lhs_ids_(from._nb_lhs_ids_), _end_safe_(*this) {
279 _end_safe_._gotoEnd_();
280 GUM_CONS_CPY(IdCondSet);
284 INLINE IdCondSet::IdCondSet(IdCondSet&& from) :
285 _ids_(
std::move(from._ids_)), _nb_lhs_ids_(from._nb_lhs_ids_), _end_safe_(*this) {
286 _end_safe_._gotoEnd_();
287 GUM_CONS_MOV(IdCondSet);
291 INLINE IdCondSet* IdCondSet::clone()
const {
return new IdCondSet(*
this); }
294 INLINE IdCondSet::~IdCondSet() { GUM_DESTRUCTOR(IdCondSet); }
297 INLINE IdCondSet& IdCondSet::operator=(
const IdCondSet& from) {
300 _nb_lhs_ids_ = from._nb_lhs_ids_;
301 _end_safe_._gotoEnd_();
307 INLINE IdCondSet& IdCondSet::operator=(IdCondSet&& from) {
309 _ids_ = std::move(from._ids_);
310 _nb_lhs_ids_ = from._nb_lhs_ids_;
311 _end_safe_._gotoEnd_();
317 INLINE NodeId IdCondSet::operator[](
const std::size_t index)
const {
318 return _ids_.atPos(index);
322 INLINE
bool IdCondSet::operator==(
const IdCondSet& from)
const {
323 if (_nb_lhs_ids_ != from._nb_lhs_ids_)
return false;
325 const std::size_t size = _ids_.size();
327 if (size != from._ids_.size())
return false;
329 for (std::size_t i = std::size_t(0); i < size; ++i) {
330 if (_ids_[i] != from._ids_[i])
return false;
337 INLINE
bool IdCondSet::operator!=(
const IdCondSet& from)
const {
return !
operator==(from); }
340 INLINE
typename IdCondSet::iterator_safe IdCondSet::beginSafe()
const {
341 return IdCondSetIterator(*
this);
345 INLINE
const typename IdCondSet::iterator_safe& IdCondSet::endSafe()
const {
350 INLINE
typename IdCondSet::iterator IdCondSet::begin()
const {
351 return IdCondSetIterator(*
this);
355 INLINE
const typename IdCondSet::iterator& IdCondSet::end()
const {
return _end_safe_; }
358 INLINE
const Sequence< NodeId >& IdCondSet::ids()
const {
return _ids_; }
361 INLINE std::size_t IdCondSet::nbLHSIds()
const {
return _nb_lhs_ids_; }
364 INLINE std::size_t IdCondSet::nbRHSIds()
const {
return _ids_.size() - _nb_lhs_ids_; }
367 INLINE
void IdCondSet::clear() {
369 _nb_lhs_ids_ = std::size_t(0);
370 _end_safe_._gotoEnd_();
374 INLINE std::size_t IdCondSet::size()
const {
return _ids_.size(); }
377 INLINE std::size_t IdCondSet::pos(
const NodeId
id)
const {
return _ids_.pos(
id); }
380 INLINE
bool IdCondSet::exists(
const NodeId
id)
const {
return _ids_.exists(
id); }
383 INLINE
bool IdCondSet::hasConditioningSet()
const {
return _nb_lhs_ids_ != _ids_.size(); }
386 INLINE
bool IdCondSet::empty()
const {
return _ids_.empty(); }
391 INLINE Size HashFunc< learning::IdCondSet >::operator()(
const learning::IdCondSet& key)
const {
392 return (castToSize(key) * HashFuncConst::gold) & this->hash_mask_;
Exception : generic error on iterator.
IdCondSetIterator()
default constructor
A class for storing a pair of sets of NodeIds, the second one corresponding to a conditional set.
#define GUM_ERROR(type, msg)
A class used by learning caches to represent uniquely sets of variables.
include the inlined functions if necessary
gum is the global namespace for all aGrUM entities
bool operator==(const TiXmlString &a, const TiXmlString &b)
bool operator!=(const TiXmlString &a, const TiXmlString &b)