|
Boost Users : |
From: abir basak (abirbasak_at_[hidden])
Date: 2007-02-23 02:35:56
I am facing problem related to iterator_range.
It's type is not propagating properly, when I return such thing from a
function. (compiler VS 7.1 ,Windows )
The code below shows it.
This is an extension of a vector, which returns range.
typedef std::pair<std::size_t,std::size_t> pair_t;
typedef std::vector<std::size_t> index_t;
template<typename T>
class vector_e : private std::vector<T>{
public:
typedef vector_e<T> self_type;
typedef typename std::vector<T>::iterator iterator;
typedef typename std::vector<T>::const_iterator const_iterator;
typedef typename std::vector<T>::pointer pointer;
typedef typename std::vector<T>::const_pointer const_pointer;
typedef typename std::vector<T>::reference reference;
typedef typename std::vector<T>::const_reference const_reference;
typedef typename std::vector<T>::difference_type difference_type;
typedef typename std::vector<T>::size_type size_type;
//typedef sub_range_t<self_type> range;
//typedef sub_range_t<const self_type> const_range;
typedef typename std::vector<T>::size_type size_type;
typedef typename boost::permutation_iterator<typename iterator,typename
index_t::const_iterator> index_iterator;
typedef typename boost::permutation_iterator<typename
const_iterator,typename index_t::const_iterator> const_index_iterator;
//typedef sub_range_t<self_type,index_iterator,const_index_iterator>
index_range;
//typedef
sub_range_t<self_type,const_index_iterator,const_index_iterator>
const_index_range;
typedef boost::iterator_range<index_iterator> index_range;
typedef boost::iterator_range<const_index_iterator> const_index_range;
typedef boost::sub_range<self_type> range;
typedef boost::sub_range<const self_type> const_range;
vector_e() : std::vector<T>(){}
using std::vector<T>::begin;
using std::vector<T>::end;
using std::vector<T>::operator [];
using std::vector<T>::insert;
const_iterator const_begin()const{
return begin();
}
const_iterator const_end()const{
return end();
}
index_iterator begin_i(const index_t& i){
return boost::make_permutation_iterator(begin(),i.begin());
}
const_index_iterator begin_i(const index_t& i)const{
return boost::make_permutation_iterator(begin(),i.begin());
}
index_iterator end_i(const index_t& i){
return boost::make_permutation_iterator(begin(),i.end());
}
const_index_iterator end_i(const index_t& i)const{
return boost::make_permutation_iterator(begin(),i.end());
}
range get_range(const pair_t& r){
return boost::make_iterator_range(begin()+r.first,begin()+r.second);
}
const_range get_range(const pair_t& r)const{
return boost::make_iterator_range(begin()+r.first,begin()+r.second);
}
index_range get_range(const index_t& i){
index_iterator b = boost::make_permutation_iterator(begin(),i.begin());
index_iterator e = boost::make_permutation_iterator(begin(),i.end());
return boost::make_iterator_range(b,e);
}
const_index_range get_range(const index_t& i)const{
const_index_iterator b =
boost::make_permutation_iterator(begin(),i.begin());
const_index_iterator e =
boost::make_permutation_iterator(begin(),i.end());
return boost::make_iterator_range(b,e);
}
};
Now, to use it like this,
typedef vector_e<trace> trace_buffer;
typedef
boost::permutation_iterator<trace_buffer::iterator,index_t::iterator>
index_iterator;
typedef boost::sub_range<trace_buffer> trace_range;
typedef boost::iterator_range<index_iterator> trace_index_range;
trace_buffer traces;
struct character{
index_t index;
trace_index_range get_traces(){
index_iterator b =
boost::make_permutation_iterator(traces.begin(),index.begin());
index_iterator e =
boost::make_permutation_iterator(traces.begin(),index.end());
//return boost::make_iterator_range(b,e);
return traces.get_range(index);///This doesn't work, while previous
commented line works !
}
};
Thus to say, I am unable to forward a call to iterator_range from one
function to another preserving the type.
(Previously the same problem was there with sub_range with 1.33.1
download. Now that one is solved with a later cvs version ) .
Any help is appreciated ....
thanks'
abir
-- Abir Basak, Member IEEE Software Engineer, Read Ink Technologies B. Tech, IIT Kharagpur email: abir_at_[hidden] homepage: www.abirbasak.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net