50 typedef ContainerT value_type;
51 typedef typename value_type::const_iterator iterator;
55 m_ts( ts ), m_iter(iter), m_iter_begin(begin), m_iter_end(end)
63 operator++() {
if ( m_iter != m_iter_end ) ++m_iter;
return *
this; }
67 operator++(
int) {
if ( m_iter != m_iter_end ) m_iter++;
return *
this; }
71 operator--() {
if ( m_iter != m_iter_begin ) --m_iter;
return *
this; }
75 operator--(
int) {
if ( m_iter != m_iter_begin ) m_iter--;
return *
this; }
81 return rhs.get_calendar() == get_calendar() &&
82 rhs.get_date_int() == get_date_int();
89 return ! ( *
this == rhs );
96 return m_ts.get_observation( m_iter->first );
103 return m_ts.get_observation( m_iter->first );
108 get_date()
const {
return get_calendar()( get_date_int() ); }
114 if ( m_iter != m_iter_end )
115 return m_iter->first;
126 tm.tm_sec = tm.tm_min = tm.tm_hour = 0;
127 tm.tm_year = d.year() - 1900;
128 tm.tm_mon = d.month();
129 tm.tm_mday = d.day();
130 struct timespec spec {0,0};
131 spec.tv_sec = mktime( &tm );
138 get_calendar()
const {
return m_ts.get_calendar(); }
143 iterator m_iter_begin;
159 m_ignore_missing_values(
false), m_ignore_same_values(
true),
160 m_fill_forward(
true) { }
164 m_ignore_missing_values( ignore_missing_value ),
165 m_ignore_same_values(ignore_same_value),
166 m_fill_forward(
true ) { }
169 bool fill_forward ) :
171 m_ignore_missing_values( ignore_missing_value ),
172 m_ignore_same_values(ignore_same_value),
173 m_fill_forward( fill_forward ) { }
179 set_observation( date_int_type d,
const observation & val ) = 0;
188 set_observation( get_calendar()(d), val );
193 virtual void set_observation( date_int_type d,
const Date & ) = 0;
194 virtual void set_observation(
date d,
const Date & ) = 0;
198 get_calendar()
const {
return m_calendar; }
201 set_ignore_missing_values(
bool b )
202 { m_ignore_missing_values = b; }
205 get_ignore_missing_values( )
const
206 {
return m_ignore_missing_values; }
209 set_ignore_same_values(
bool b )
210 { m_ignore_same_values = b; }
213 get_ignore_same_values()
const
214 {
return m_ignore_same_values; }
217 get_fill_forward()
const
218 {
return m_fill_forward; }
221 set_fill_forward(
bool b )
222 { m_fill_forward = b; }
227 void set_observation( date_int_type d,
float f )
229 void set_observation(
date d,
float f )
230 { set_observation(get_calendar()( d ),
static_cast<const observation &
>(
Float(f) )); }
233 void set_observation( date_int_type d,
double f )
235 void set_observation(
date d,
double f )
236 { set_observation( get_calendar()( d ),
static_cast<const observation &
>(
Double(f) )); }
239 void set_observation( date_int_type d,
const std::string &f )
241 void set_observation(
date d,
const std::string &f )
242 { set_observation(get_calendar()( d ),
static_cast<const observation &
>(
String(f) ) ); }
245 void set_observation( date_int_type d,
const char *f )
247 void set_observation(
date d,
const char *f )
248 { set_observation( get_calendar()( d ),
static_cast<const observation &
>(
String(f) )); }
251 void set_observation( date_int_type d,
int f )
252 { set_observation(d,
static_cast<const observation &
>(
Int(f) )); }
253 void set_observation(
date d,
int f )
254 { set_observation( get_calendar()( d ),
static_cast<const observation &
>(
Int(f) )); }
257 void set_observation( date_int_type d,
bool f )
259 void set_observation(
date d,
bool f )
260 { set_observation( get_calendar()( d ),
static_cast<const observation &
>(
Bool(f) ) ); }
263 void set_observation( date_int_type d,
265 { set_observation(d,
static_cast<const observation &
>(
Int(f) ) ); }
267 { set_observation( get_calendar()( d ),
static_cast<const observation &
>(
Int(f) ) ); }
271 bool m_ignore_missing_values;
272 bool m_ignore_same_values;
286 private std::map<date_int_type, typename T::value_type, std::less<date_int_type> >
289 typedef T value_type;
290 typedef typename std::map<date_int_type, typename T::value_type, std::less<date_int_type> >
292 typedef typename map_type::pointer pointer;
293 typedef typename map_type::reference reference;
294 typedef typename map_type::difference_type difference_type;
295 typedef std::random_access_iterator_tag iterator_category;
297 typedef typename map_type::iterator iterator;
298 typedef typename map_type::const_iterator const_iterator;
304 bool fill_forward ) :
305 sparse_series( cal, ignore_same_value, ignore_missing_value, fill_forward ), map_type() { }
307 template <
typename Iter>
311 template <
typename Iter>
313 Iter begin, Iter end ) :
314 sparse_series( cal, ignore_same_value, ignore_missing_value ), map_type( begin, end ){ }
333 get_observation( date_int_type d )
const
336 if ( ! is_empty() && get_fill_forward() )
338 const_iterator it = this->map_type::upper_bound(d);
339 if ( it != real_begin() )
342 m_return_value = it->second;
343 return m_return_value;
346 return Int::HAS_NO_DATA;
348 else if ( ! is_empty() && ! get_fill_forward() )
350 const_iterator it = this->map_type::find(d);
351 if ( it != real_end() )
353 m_return_value = it->second;
354 return m_return_value;
357 return Int::HAS_NO_DATA;
360 return Int::HAS_NO_DATA;
364 void set_observation(
const date_int_type d,
const typename T::value_type & val );
365 void set_observation(
const date d,
const typename T::value_type & val );
370 set_observation_( date_int_type d,
const T &v )
372 std::pair<iterator,bool> result = this->map_type::insert(
typename map_type::value_type(d, v.value()) );
373 if ( ! result.second )
375 this->map_type::erase( result.first );
376 this->map_type::insert(
typename map_type::value_type(d, v.value()) );
378 clean_missing_values();
385 set_observation_( get_calendar()(d), T(val) );
389 set_observation( date_int_type d,
const observation &val )
391 set_observation_( d, T(val) );
393 virtual void set_observation( date_int_type d,
const Date &v )
395 set_observation_( d, T(v) );
397 virtual void set_observation(
date d,
const Date &v )
399 set_observation_( get_calendar()(d), T(v) );
402 virtual const observation & operator[ ](
const date_int_type d )
const ;
403 virtual observation & operator[ ](
const date_int_type d );
407 virtual std::ostream &print( std::ostream & )
const;
410 get_first_date_int()
const
412 if ( is_empty() )
return 0;
413 const_iterator it = real_begin();
return it->first;
417 get_last_date_int()
const
419 if ( is_empty() )
return 0;
420 const_iterator it = real_end(); it--;
return it->first;
426 return this->map_type::empty();
434 if ( ! get_ignore_same_values( ) )
437 std::vector<date_int_type> getRidOfEm;
438 typename T::value_type prev = real_begin()->second;
440 for( const_iterator it = real_begin(); it != real_end(); it++)
442 if (it == real_begin())
446 else if(it->second == prev)
448 getRidOfEm.push_back(it->first);
452 for ( std::vector<date_int_type>::iterator it = getRidOfEm.begin();
453 it != getRidOfEm.end(); it++ )
454 this->map_type::erase(*it);
458 clean_missing_values()
460 if ( ! get_ignore_missing_values( ) )
463 std::vector<date_int_type> deleteThem;
465 for ( const_iterator it = real_begin(); it != real_end(); it++)
466 if ( ! T(it->second).is_normal() )
467 deleteThem.push_back( it->first );
469 for ( std::vector<date_int_type>::iterator it = deleteThem.begin(); it != deleteThem.end(); it++ )
470 this->map_type::erase(*it);
472 iterator real_begin() {
return this->map_type::begin(); }
473 iterator real_end() {
return this->map_type::end(); }
474 const_iterator real_begin()
const {
return this->map_type::begin(); }
475 const_iterator real_end()
const {
return this->map_type::end(); }
479 mutable value_type m_return_value;
575 private std::map<timespec, typename T::value_type, std::less<timespec> >
578 typedef T value_type;
579 typedef typename std::map<timespec, typename T::value_type, std::less<timespec> >
581 typedef typename map_type::pointer pointer;
582 typedef typename map_type::reference reference;
583 typedef typename map_type::difference_type difference_type;
584 typedef std::random_access_iterator_tag iterator_category;
586 typedef typename map_type::iterator iterator;
587 typedef typename map_type::const_iterator const_iterator;
593 bool fill_forward ) :
594 sparse_series( cal, ignore_same_value, ignore_missing_value, fill_forward ), map_type() { }
596 template <
typename Iter>
600 template <
typename Iter>
602 Iter begin, Iter end ) :
603 sparse_series( cal, ignore_same_value, ignore_missing_value ), map_type( begin, end ){ }
622 get_observation( date_int_type d )
const
625 if ( ! is_empty() && get_fill_forward() )
627 const_iterator it = this->map_type::upper_bound(d);
628 if ( it != real_begin() )
631 m_return_value = it->second;
632 return m_return_value;
635 return Int::HAS_NO_DATA;
637 else if ( ! is_empty() && ! get_fill_forward() )
639 const_iterator it = this->map_type::find(d);
640 if ( it != real_end() )
642 m_return_value = it->second;
643 return m_return_value;
646 return Int::HAS_NO_DATA;
649 return Int::HAS_NO_DATA;
653 void set_observation(
const date_int_type d,
const typename T::value_type & val );
654 void set_observation(
const date d,
const typename T::value_type & val );
659 set_observation_( date_int_type d,
const T &v )
661 std::pair<iterator,bool> result = this->map_type::insert(
typename map_type::value_type(d, v.value()) );
662 if ( ! result.second )
664 this->map_type::erase( result.first );
665 this->map_type::insert(
typename map_type::value_type(d, v.value()) );
667 clean_missing_values();
674 set_observation_( get_calendar()(d), T(val) );
678 set_observation( date_int_type d,
const observation &val )
680 set_observation_( d, T(val) );
682 virtual void set_observation( date_int_type d,
const Date &v )
684 set_observation_( d, T(v) );
686 virtual void set_observation(
date d,
const Date &v )
688 set_observation_( get_calendar()(d), T(v) );
691 virtual const observation & operator[ ](
const date_int_type d )
const ;
692 virtual observation & operator[ ](
const date_int_type d );
696 virtual std::ostream &print( std::ostream & )
const;
699 get_first_date_int()
const
701 if ( is_empty() )
return 0;
702 const_iterator it = real_begin();
return it->first;
706 get_last_date_int()
const
708 if ( is_empty() )
return 0;
709 const_iterator it = real_end(); it--;
return it->first;
715 return this->map_type::empty();
723 if ( ! get_ignore_same_values( ) )
726 std::vector<date_int_type> getRidOfEm;
727 typename T::value_type prev;
729 for( const_iterator it = real_begin(); it != real_end(); it++)
731 if (it == real_begin())
735 else if(it->second == prev)
737 getRidOfEm.push_back(it->first);
741 for ( std::vector<date_int_type>::iterator it = getRidOfEm.begin();
742 it != getRidOfEm.end(); it++ )
743 this->map_type::erase(*it);
747 clean_missing_values()
749 if ( ! get_ignore_missing_values( ) )
752 std::vector<date_int_type> deleteThem;
754 for ( const_iterator it = real_begin(); it != real_end(); it++)
755 if ( ! T(it->second).is_normal() )
756 deleteThem.push_back( it->first );
758 for ( std::vector<date_int_type>::iterator it = deleteThem.begin(); it != deleteThem.end(); it++ )
759 this->map_type::erase(*it);
761 iterator real_begin() {
return this->map_type::begin(); }
762 iterator real_end() {
return this->map_type::end(); }
763 const_iterator real_begin()
const {
return this->map_type::begin(); }
764 const_iterator real_end()
const {
return this->map_type::end(); }
768 mutable value_type m_return_value;