20 #ifndef KJB_L_CPP_INDEX_H
21 #define KJB_L_CPP_INDEX_H
24 #include <l/l_debug.h>
27 #include <boost/concept_check.hpp>
28 #include <boost/static_assert.hpp>
29 #include <boost/type_traits.hpp>
89 ranges_.push_back(
new Single_element(index));
99 ranges_.push_back(
new Single_element(index));
116 init_from_str(std::string(str));
123 for(
size_t i = 0;
i < src.
ranges_.size();
i++)
147 size_t my_size =
size();
149 std::vector<size_t> result(my_size);
151 for(
size_t i = 0;
i < my_size;
i++)
176 template <
class Int_type>
181 BOOST_STATIC_ASSERT((boost::is_convertible<Int_type, size_t>::value));
183 ranges_.push_back(
new Listing_element(v));
186 template <
class Int_type>
191 BOOST_STATIC_ASSERT((boost::is_convertible<Int_type, size_t>::value));
192 ranges_.push_back(
new Listing_element(v));
199 ranges_.push_back(
new Interval_element(first, end, interval));
207 ranges_.push_back(
new Interval_element(first, end, interval));
212 for(
size_t i = 0;
i < other.
ranges_.size();
i++)
255 for(; range_i <
ranges_.size(); range_i++)
257 const size_t range_size =
ranges_[range_i]->size();
277 KJB_THROW_2(
Runtime_error,
"Can't know the size of an \"all\" range. Determining the size is the responsibility of the caller.");
297 virtual ~Range_element() {}
299 virtual size_t size()
const = 0;
300 virtual Range_element* clone()
const = 0;
301 virtual size_t max()
const = 0;
305 class Single_element :
public Range_element
308 Single_element(
size_t i) : value_(i) {}
316 virtual size_t size()
const {
return 1; }
319 virtual Range_element* clone()
const
321 return new Single_element(*
this);
324 virtual size_t max()
const {
return value_; }
331 class Listing_element :
public Range_element
334 Listing_element(Int_vector v);
336 Listing_element(std::vector<size_t> v) :
337 indices_(v.begin(), v.end())
340 Listing_element(std::list<size_t> v) :
341 indices_(v.begin(), v.end())
344 virtual Range_element* clone()
const
346 return new Listing_element(*
this);
353 virtual size_t size()
const
355 return indices_.size();
358 virtual size_t max()
const
360 return *std::max_element(indices_.begin(), indices_.end());
363 std::vector<size_t> indices_;
370 class Interval_element :
public Range_element
372 static const int UNDEFINED_END_INDEX = INT_MAX;
375 Interval_element(
int begin,
int end,
int interval) :
381 size_ = compute_size();
384 Interval_element(
int begin, End_type,
int interval) :
386 end_(UNDEFINED_END_INDEX),
390 size_ = compute_size();
393 virtual Range_element* clone()
const
395 return new Interval_element(begin_, end_, interval_);
400 int result = begin_ + i * interval_;
415 virtual size_t size()
const
417 if(end_ == UNDEFINED_END_INDEX)
418 KJB_THROW_2(Runtime_error,
"Can't get size of interval with unknown end. Calling context must handle this.");
423 virtual size_t max()
const
425 if(end_ == UNDEFINED_END_INDEX)
426 KJB_THROW_2(Runtime_error,
"Can't get max of interval with unknown end. Calling context must handle this.");
428 KJB(UNTESTED_CODE());
429 return begin_ + interval_ * (
size() - 1);
433 size_t compute_size()
const
435 int diff = end_ - begin_;
436 return diff / interval_ + 1;
446 class Matlab_range :
public Interval_element
449 Matlab_range(
const std::string& str) :
450 Interval_element(0, 0, 1)
458 replace(tmp.begin(), tmp.end(),
':',
' ');
461 istringstream iss(tmp);
465 iss.exceptions(istringstream::failbit);
471 if(i >= 3)
KJB_THROW_2(Runtime_error,
"Parse error: token count exceeded 3.");
480 KJB_THROW_2(Runtime_error,
"Parse error: no tokens found.");
493 interval_ = values[1];
503 KJB_THROW_2(Illegal_argument,
"Parse error: interval_ must be != 0.");
509 KJB_THROW_2(Illegal_argument,
"Parse error: sign(interval) != sign(end - begin).");
514 KJB_THROW_2(Illegal_argument,
"Parse error: sign(interval) != sign(end - begin).");
518 size_ = compute_size();
521 virtual Range_element* clone()
const
523 return new Matlab_range(*
this);
529 void init_from_str(
const std::string& str)
542 replace(tmp.begin(), tmp.end(),
',',
' ');
543 replace(tmp.begin(), tmp.end(),
';',
' ');
546 istringstream iss(tmp);
548 vector<string> tokens;
549 copy(istream_iterator<string>(iss),
550 istream_iterator<string>(),
551 back_inserter<std::vector<string> >(tokens));
554 ranges_.reserve(tokens.size());
555 for(
size_t i = 0; i < tokens.size(); i++)
557 ranges_.push_back(
new Matlab_range(tokens[i]));
Object thrown when an index argument exceeds the size of a container.
Definition: l_exception.h:399
size_t max() const
Definition: l_index.h:219
Index_range(size_t index)
Definition: l_index.h:85
Index_range(size_t first, size_t end, size_t interval=1)
Definition: l_index.h:195
#define KJB(x)
Definition: l_util.h:9
size_t size() const
Definition: l_index.h:273
Index_range(const char *str)
Definition: l_index.h:112
#define KJB_THROW(ex)
Definition: l_exception.h:46
bool all() const
Definition: l_index.h:290
~Index_range()
Definition: l_index.h:235
Index_range(std::list< Int_type > v)
Definition: l_index.h:187
std::istream & operator>>(std::istream &ist, Detection_type &type)
Stream in an detection.
Definition: d_type.cpp:91
Index_range & operator=(const Index_range &other)
Definition: l_index.h:129
Index_range & concat(Index_range &other)
Definition: l_index.h:210
Index_range()
Definition: l_index.h:77
static const End_type END
Definition: l_index.h:72
This class implements vectors, in the linear-algebra sense, restricted to integer-valued elements...
Definition: l_int_vector.h:83
std::vector< size_t > expand() const
Definition: l_index.h:145
#define KJB_THROW_2(ex, msg)
Definition: l_exception.h:48
Index_range(bool all_elements)
Definition: l_index.h:243
void swap(kjb::Gsl_Multimin_fdf &m1, kjb::Gsl_Multimin_fdf &m2)
Swap two wrapped multimin objects.
Definition: gsl_multimin.h:693
Index_range(const std::string &str)
Definition: l_index.h:105
Index_range(const Index_range &src)
Definition: l_index.h:119
size_t operator[](size_t i) const
Definition: l_index.h:248
static const Index_range ALL
Definition: l_index.h:69
Index_range(int index)
Definition: l_index.h:95
Index_range(typename std::vector< Int_type > v)
Definition: l_index.h:177
get the indices of edges in each direction for i
Definition: APPgetLargeConnectedEdges.m:48
std::vector< Range_element * > ranges_
Definition: l_index.h:563
void swap(Index_range &other)
Definition: l_index.h:159
Support for error handling exception classes in libKJB.
Definition for the Int_vector class, a thin wrapper on the KJB Int_vector struct and its related func...
Index_range(size_t first, End_type end, size_t interval=1)
Definition: l_index.h:203
Object thrown when computation fails somehow during execution.
Definition: l_exception.h:321
bool all_
Definition: l_index.h:564