40 template <
typename T,
typename U,
bool UIsObject = false>
84 template <
typename FunctionType>
86 FunctionType fun,
size_t e1,
size_t e2,
const T& T1,
const T& T2)
88 detail::applyFunction<T, U, UIsObject, FunctionType>(
89 *
this, fun, e1, e2, T1, T2);
103 template <
typename FunctionType>
112 template <
typename FunctionType>
115 typename std::set<T>::const_iterator it =
elements.begin();
116 for (
size_t i = 0; i <
elements.size(); ++i, ++it)
118 typename std::set<T>::const_iterator jt =
elements.begin();
119 for (
size_t j = 0; j <
elements.size(); ++j, ++jt)
127 template <
typename FunctionType>
130 typename std::set<T>::const_iterator it =
elements.begin();
131 for (
size_t i = 0; i <
elements.size(); ++i, ++it)
134 typename std::set<T>::const_iterator jt = it;
136 for (
size_t j = i + 1; j <
elements.size(); ++j, ++jt)
179 typename std::set<T>::const_iterator b =
elements.begin(),
181 typename std::set<T>::const_iterator it1 =
std::find(b, e, t1),
183 if (it1 == e || it2 == e)
return false;
195 typename std::set<T>::const_iterator b =
elements.begin(),
197 typename std::set<T>::const_iterator it1 =
std::find(b, e, t1),
199 if (it1 == e || it2 == e)
throw std::domain_error(
"Element not found");
212 typename std::set<T>::const_iterator b =
elements.begin(),
214 typename std::set<T>::const_iterator it1 =
std::find(b, e, t1),
216 if (it1 == e || it2 == e)
throw std::domain_error(
"Element not found");
219 static_cast<size_t>(
distance(b, it2)));
243 typename std::set<T>::const_iterator it =
elements.begin();
286 typename std::set<T>::const_iterator b =
elements.begin(),
288 typename std::set<T>::const_iterator it =
std::find(b, e, t);
289 if (it == e)
throw std::domain_error(
"Element not found");
300 typename std::set<T>::const_iterator b =
elements.begin(),
302 typename std::set<T>::const_iterator it =
std::find(b, e, t);
303 if (it == e)
throw std::domain_error(
"Element not found");
312 std::copy(access.
begin(), access.
end(), vec.begin());
316 typename std::set<T>::const_iterator b =
elements.begin(),
318 typename std::set<T>::const_iterator it =
std::find(b, e, t);
319 if (it == e)
throw std::domain_error(
"Element not found");
329 typename std::set<T>::const_iterator b =
elements.begin(),
331 typename std::set<T>::const_iterator it =
std::find(b, e, t);
332 if (it == e)
throw std::domain_error(
"Element not found");
343 typename std::set<T>::const_iterator b =
elements.begin(),
345 typename std::set<T>::const_iterator it =
std::find(b, e, t);
346 if (it == e)
throw std::domain_error(
"Element not found");
355 std::copy(access.
begin(), access.
end(), vec.begin());
359 typename std::set<T>::const_iterator b =
elements.begin(),
361 typename std::set<T>::const_iterator it =
std::find(b, e, t);
362 if (it == e)
throw std::domain_error(
"Element not found");
371 typename std::set<T>::const_iterator it =
elements.begin();
384 typename std::set<T>::const_iterator b =
elements.begin(),
386 typename std::set<T>::const_iterator it =
std::find(e, b, el);
387 if (it == e)
return false;
397 std::set<size_t> positions;
398 for (
typename std::set<T>::const_iterator it = vals.begin();
399 it != vals.end(); ++it)
401 typename std::set<T>::iterator elsIt =
407 return positions.size();
411 relation.removeRowsAndCols(poss, poss);
412 for (std::set<size_t>::const_reverse_iterator it = poss.rbegin();
413 it != poss.rend(); ++it)
415 typename std::set<T>::const_iterator it2 =
elements.begin();
416 std::advance(it2, *it);
428 std::pair<typename std::set<T>::iterator,
bool> ins =
433 std::multiset<size_t> newEls;
435 relation.insertRowsAndCols(newEls, newEls);
436 return std::make_pair(
true, dist);
439 return std::make_pair(
false, dist);
445 template <
typename FunctionType>
449 size_t pos = ins.second;
450 for (
size_t i = 0; i <
elements.size(); ++i)
464 if (els.empty())
return 0;
472 std::vector<size_t> added;
474 added.reserve(els.size());
475 for (
typename std::set<T>::const_iterator it = els.begin();
476 it != els.end(); ++it)
478 std::pair<typename std::set<T>::iterator,
bool> ins =
483 added.push_back(dist);
484 for (std::vector<size_t>::iterator it2 = added.begin();
485 it2 != added.end(); ++it2)
486 if (*it2 >= dist) ++(*it2);
492 std::sort(added.begin(), added.end());
493 for (
size_t j = 1; j < added.size(); ++j) added[j] -= j;
494 std::multiset<size_t> poss(added.begin(), added.end());
495 relation.insertRowsAndCols(poss, poss);
502 template <
typename FunctionType>
505 if (els.empty())
return 0;
507 std::set<size_t> poss;
510 typename std::set<T>::const_iterator
begin =
elements.begin(),
512 for (
typename std::set<T>::const_iterator it = els.begin();
513 it != els.end(); ++it)
516 std::set<size_t> nPoss;
517 std::set<size_t>::const_iterator
begin = poss.begin(),
end = poss.end();
518 for (
size_t i = 0; i <
elements.size(); ++i)
520 vector<const T*> proxy;
521 proxy.reserve(poss.size());
522 for (std::set<size_t>::const_iterator it =
begin; it !=
end; ++it)
525 proxy.push_back(&e1);
527 for (
typename std::set<T>::const_iterator it2 =
elements.begin();
531 for (std::set<size_t>::const_iterator it = nPoss.begin();
532 it != nPoss.end(); ++it)
535 typename std::vector<const T*>::const_iterator itV = proxy.begin();
536 for (std::set<size_t>::const_iterator it2 = poss.begin();
537 it2 != poss.end(); ++it2, ++itV)
550 relation.setSize(newEls.size(), newEls.size());
561 template <
typename T,
typename U,
bool UIsObject,
typename FunctionType>
564 const T& T1,
const T& T2)
571 template <
typename T,
typename U,
bool UIsObject>
575 size_t e1,
size_t e2,
const T& T1,
const T& T2)
CMatrixRowAccessor< U > AccessorForFirstElement
Accessor type to every value related to any element A, i.e., f(A,x).
A vector-like wrapper for a const Matrix for accessing the elements of a given column with a [] opera...
void applyFunction(CBinaryRelation< T, U, UIsObject > &o, FunctionType fun, size_t e1, size_t e2, const T &T1, const T &T2)
U & getRelationValue(size_t e1, size_t e2)
Get a reference to a relation value given its indices, which allows both querying and setting the val...
const_iterator end() const
Gets an iterator to the ending point of the elements set.
This template is a trick to switch the type of a variable using a boolean variable in the template...
void setRelationValue(size_t e1, size_t e2, const U &newVal)
Manually set a relationship value, given the indices.
ConstAccessorForFirstElement getRelationFrom(size_t i) const
Gets a constant accessor for every value related to an element A given its index, i...
const_iterator find(const KEY &key) const
#define ASSERT_BELOW_(__A, __B)
void removeElementsAt(const std::set< size_t > &poss)
std::pair< bool, size_t > insertElement(const T &el, FunctionType fun)
Inserts an element and initializes its relationship values, even if it was already present...
typename std::set< T >::const_reverse_iterator const_reverse_iterator
Constant reverse iterator through the set elements.
void(*)(const T &, const T &, U &) FunctionByReferencePass
Function type which obtains the relation value by reference pass.
size_t insertElements(const std::set< T > &els)
Inserts a set of elements into the relation.
const_iterator end() const
const_iterator begin() const
This class models a binary relation through the elements of any given set.
std::pair< bool, size_t > insertElement(const T &el)
Inserts an element.
AccessorForFirstElement getRelationFrom(size_t i)
Gets an accessor for every value related to an element A given its index, i.e., every f(A...
void applyFunction(FunctionType fun, size_t e1, size_t e2, const T &T1, const T &T2)
Template used to make the function interface independent from the function type.
const_iterator begin() const
Gets an iterator to the starting point of the elements set.
void getRelationTo(size_t i, vector< U > &vec)
void getRelationFrom(size_t i, vector< U > &vec)
#define ASSERT_(f)
Defines an assertion mechanism.
size_t removeElements(const std::set< T > &vals)
Removes a set of elements.
A vector-like wrapper for a const Matrix for accessing the elements of a given row with a [] operator...
size_t insertElements(const std::set< T > &els, FunctionType fun)
Inserts a set of elements into the relation, initializing the actual relation with a given function...
std::set< T > elements
Actual set of elements.
ConstAccessorForSecondElement getRelationTo(size_t i) const
Gets a constant accessor for every value related to an element B given its index, i...
CConstMatrixColumnAccessor< U > ConstAccessorForSecondElement
Const accessor type to every value related to any element B, i.e., f(x,B).
U & getRelationValue(const T &t1, const T &t2)
Get a reference to a relation value given the elements, which allows both querying and setting...
MatrixType relation
Matrix storing the relation.
ConstAccessorForSecondElement getRelationTo(const T &t) const
Gets an iterable constant accessor for every value related to an alement B, i.e., every f(x...
void initializeWith(FunctionType fun)
Initialize the whole relation with a given function.
const_reverse_iterator rend() const
Gets a reverse iterator to the starting point of the elements set.
U(*)(T, T) SimpleFunctionByReturnValue
Simple function type, used to initialize chunks of the matrix.
A vector-like wrapper for a Matrix for accessing the elements of a given row with a [] operator...
void setElements(const std::set< T > &newEls)
Completely resets the relation, using a new set of elements.
void getRelationFrom(const T &t, vector< U > &vec)
void getRelationTo(const T &t, vector< U > &vec)
CBinaryRelation(const std::set< T > &els, FunctionType fun)
Constructor which initializes the relation using a given function.
void removeElementAt(size_t i)
Removes an element at a concrete position.
bool removeElement(const T &el)
Removes an element.
AccessorForSecondElement getRelationTo(size_t i)
Gets an accessor for every value related to an element B given its index, i.e., every f(x...
U(*)(const T &, const T &) FunctionByReturnValue
Function type which obtains the relation value by a return value.
const_iterator begin() const
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries.
CBinaryRelation(const std::set< T > &els)
Default constructor, doesn't initialize the relation.
const U & getRelationValue(size_t e1, size_t e2) const
Get a relation value, given the indices.
typename std::set< T >::const_iterator const_iterator
Constant iterator through the set elements.
void initializeSymmetricallyWith(FunctionType fun)
Initialize the whole relation with a given function, assuming that the relation is symmetrical...
size_t size() const
Returns the amount of elements present in the relation.
CMatrixColumnAccessor< U > AccessorForSecondElement
Accessor type to every value related to any element B, i.e., f(x,B).
ConstAccessorForFirstElement getRelationFrom(const T &t) const
Gets an iterable constant accessor for every value related to an element A, i.e., every f(A...
const_iterator end() const
typename detail::MatrixWrapper< U, UIsObject >::MatrixType MatrixType
Matrix type used to store the actual relation.
bool setRelationValue(const T &t1, const T &t2, const U &newVal)
Manually set a relationship value, given the elements.
AccessorForSecondElement getRelationTo(const T &t)
Gets an iterable accessor for every value related to an element B, i.e., every f(x,B).
T operator[](size_t i) const
Operator for direct access to a element given its index.
A vector-like wrapper for a Matrix for accessing the elements of a given column with a [] operator...
U & operator()(size_t e1, size_t e2)
const U & operator()(size_t e1, size_t e2) const
const_reverse_iterator rbegin() const
Gets a reverse iterator to the ending point of the elements set.
AccessorForFirstElement getRelationFrom(const T &t)
Gets an iterable accessor for every value related to an element A, i.e., every f(A,x).
U getRelationValue(const T &t1, const T &t2) const
Get a relation value, given the elements.
double distance(const TPoint2D &p1, const TPoint2D &p2)
Gets the distance between two points in a 2D space.
CConstMatrixRowAccessor< U > ConstAccessorForFirstElement
Const accessor type to every value related to any element A, i.e., f(A,x).