Changed implementation of WeightedRips to store simplex values (max distance between simplices' vertices) as an invisible layer on top of each simplex object, so that the data() field of WeightedRips has been freed for use by the users again.
#ifndef __PYTHON_FILTRATION_H__
#define __PYTHON_FILTRATION_H__
#include <topology/filtration.h>
#include <boost/python.hpp>
#include "simplex.h"
namespace bp = boost::python;
namespace dionysus {
namespace python {
// Random access iterator into python's list (using integer indices)
class ListRandomAccessIterator:
public boost::iterator_adaptor<ListRandomAccessIterator, // Derived
boost::counting_iterator<unsigned>, // Base
SimplexObject, // Value
boost::use_default,
SimplexObject>
{
public:
typedef ListRandomAccessIterator Self;
typedef boost::iterator_adaptor<ListRandomAccessIterator,
boost::counting_iterator<unsigned>,
SimplexObject,
boost::use_default,
SimplexObject> Parent;
ListRandomAccessIterator() {}
ListRandomAccessIterator(bp::list l, unsigned i):
Parent(i), l_(l) {}
private:
friend class boost::iterator_core_access;
friend class FiltrationPythonIterator;
Parent::reference dereference() const { return bp::object(l_[*(this->base())]); }
bp::list l_;
};
// ComplexTraits describing complexes of type list
struct ListTraits
{
typedef bp::list Complex;
typedef SimplexObject Simplex;
typedef ListRandomAccessIterator Index;
typedef std::less<Index> IndexComparison;
typedef BinarySearchMap<SimplexVD, Index,
SimplexVD::VertexComparison> SimplexIndexMap;
static SimplexIndexMap simplex_index_map(const Complex& l) { return SimplexIndexMap(begin(l), end(l)); }
static SimplexIndexMap simplex_index_map(Index bg, Index end) { return SimplexIndexMap(bg, end); }
static unsigned size(const Complex& l) { return bp::len(l); }
static Index begin(const Complex& l) { return Index(l, 0); }
static Index end(const Complex& l) { return Index(l, size(l)); }
};
typedef Filtration<bp::list, unsigned, ListTraits> ListFiltration;
// Filtration python iterator interface
class FiltrationPythonIterator:
public boost::iterator_adaptor<FiltrationPythonIterator, // Derived
ListFiltration::Index, // Base
unsigned> // Value
{
public:
typedef FiltrationPythonIterator Self;
typedef boost::iterator_adaptor<Self,
ListFiltration::Index,
unsigned> Parent;
FiltrationPythonIterator(ListFiltration::Index i):
Parent(i) {}
private:
friend class boost::iterator_core_access;
Parent::reference dereference() const
{
// FIXME: I hate the const_cast here, how do I get rid of it?
return const_cast<unsigned&>(this->base()->base().base());
}
};
} } // namespace dionysus::python
#endif