51#ifndef DOXYGEN_SHOULD_SKIP_THIS
65 GUM_CONSTRUCTOR(IdCondSetIterator);
69 INLINE IdCondSetIterator::IdCondSetIterator(
const IdCondSetIterator& from) :
70 _seq_(from._seq_), _index_(from._index_) {
71 GUM_CONS_CPY(IdCondSetIterator);
75 INLINE IdCondSetIterator::IdCondSetIterator(IdCondSetIterator&& from) :
76 _seq_(from._seq_), _index_(from._index_) {
77 GUM_CONS_MOV(IdCondSetIterator);
81 INLINE IdCondSetIterator::~IdCondSetIterator() { GUM_DESTRUCTOR(IdCondSetIterator); }
84 INLINE
void IdCondSetIterator::_gotoEnd_() {
85 if (_seq_ !=
nullptr) _index_ = _seq_->size();
86 else _index_ = std::size_t(0);
90 INLINE IdCondSetIterator& IdCondSetIterator::operator=(
const IdCondSetIterator& from) =
default;
93 INLINE IdCondSetIterator& IdCondSetIterator::operator=(IdCondSetIterator&& from) {
95 _index_ = from._index_;
100 INLINE NodeId IdCondSetIterator::operator*()
const {
return _seq_->operator[](_index_); }
103 INLINE
bool IdCondSetIterator::operator!=(
const IdCondSetIterator& from)
const {
104 return (_index_ != from._index_) || (_seq_ != from._seq_);
108 INLINE
bool IdCondSetIterator::operator==(
const IdCondSetIterator& from)
const {
113 INLINE IdCondSetIterator& IdCondSetIterator::operator++() {
119 INLINE IdCondSetIterator& IdCondSetIterator::operator+=(
const std::size_t i) {
125 INLINE IdCondSetIterator IdCondSetIterator::operator+(
const std::size_t i) {
126 IdCondSetIterator res(*
this);
132 INLINE std::size_t IdCondSetIterator::pos()
const {
133 if (_seq_ ==
nullptr)
135 "The IdCondSet is empty, so its iterators have no position")
136 if (_index_ >= _seq_->size())
138 "the IdCondSet iterator has no position because it reached "
148 INLINE IdCondSet::IdCondSet() : _end_safe_(*this) { GUM_CONSTRUCTOR(IdCondSet); }
153 INLINE IdCondSet::IdCondSet(NodeId var1,
154 const std::vector< NodeId >& rhs_ids,
155 const bool ordered_rhs_ids) :
156 _nb_lhs_ids_(
std::size_t(1)), _end_safe_(*this) {
157 _ids_.resize(rhs_ids.size() + std::size_t(1));
162 if (!ordered_rhs_ids) {
163 std::vector< NodeId > vect(rhs_ids);
164 std::sort(vect.begin(), vect.end());
165 for (
const auto id: vect)
168 for (
const auto id: rhs_ids)
173 _end_safe_._gotoEnd_();
175 GUM_CONSTRUCTOR(IdCondSet);
183 INLINE IdCondSet::IdCondSet(
const IdCondSet& from) :
184 _ids_(from._ids_), _nb_lhs_ids_(from._nb_lhs_ids_), _end_safe_(*this) {
185 _end_safe_._gotoEnd_();
186 GUM_CONS_CPY(IdCondSet);
190 INLINE IdCondSet::IdCondSet(IdCondSet&& from) :
191 _ids_(
std::move(from._ids_)), _nb_lhs_ids_(from._nb_lhs_ids_), _end_safe_(*this) {
192 _end_safe_._gotoEnd_();
193 GUM_CONS_MOV(IdCondSet);
197 INLINE IdCondSet* IdCondSet::clone()
const {
return new IdCondSet(*
this); }
200 INLINE IdCondSet::~IdCondSet() { GUM_DESTRUCTOR(IdCondSet); }
203 INLINE IdCondSet& IdCondSet::operator=(
const IdCondSet& from) {
206 _nb_lhs_ids_ = from._nb_lhs_ids_;
207 _end_safe_._gotoEnd_();
213 INLINE IdCondSet& IdCondSet::operator=(IdCondSet&& from) {
215 _ids_ = std::move(from._ids_);
216 _nb_lhs_ids_ = from._nb_lhs_ids_;
217 _end_safe_._gotoEnd_();
223 INLINE NodeId IdCondSet::operator[](
const std::size_t index)
const {
224 return _ids_.atPos(index);
228 INLINE
bool IdCondSet::operator==(
const IdCondSet& from)
const {
229 if (_nb_lhs_ids_ != from._nb_lhs_ids_)
return false;
231 const std::size_t size = _ids_.size();
233 if (size != from._ids_.size())
return false;
235 for (std::size_t i = std::size_t(0); i < size; ++i) {
236 if (_ids_[i] != from._ids_[i])
return false;
243 INLINE
typename IdCondSet::iterator_safe IdCondSet::beginSafe()
const {
244 return IdCondSetIterator(*
this);
248 INLINE
const typename IdCondSet::iterator_safe& IdCondSet::endSafe()
const {
253 INLINE
typename IdCondSet::iterator IdCondSet::begin()
const {
254 return IdCondSetIterator(*
this);
258 INLINE
const typename IdCondSet::iterator& IdCondSet::end()
const {
return _end_safe_; }
261 INLINE
const Sequence< NodeId >& IdCondSet::ids()
const {
return _ids_; }
264 INLINE std::size_t IdCondSet::nbLHSIds()
const {
return _nb_lhs_ids_; }
267 INLINE std::size_t IdCondSet::nbRHSIds()
const {
return _ids_.size() - _nb_lhs_ids_; }
270 INLINE
void IdCondSet::clear() {
272 _nb_lhs_ids_ = std::size_t(0);
273 _end_safe_._gotoEnd_();
277 INLINE std::size_t IdCondSet::size()
const {
return _ids_.size(); }
280 INLINE std::size_t IdCondSet::pos(
const NodeId
id)
const {
return _ids_.pos(
id); }
283 INLINE
bool IdCondSet::exists(
const NodeId
id)
const {
return _ids_.exists(
id); }
286 INLINE
bool IdCondSet::hasConditioningSet()
const {
return _nb_lhs_ids_ != _ids_.size(); }
289 INLINE
bool IdCondSet::empty()
const {
return _ids_.empty(); }
294 INLINE Size HashFunc< learning::IdCondSet >::operator()(
const learning::IdCondSet& key)
const {
295 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)