M1Series
#ifndef M1SERIES_H
#define M1SERIES_H
#include <iostream>
#include <map>
#include <string>
#include <vector>
// Boost
#include <boost/date_time/posix_time/posix_time.hpp>
#include "Bar.h"
#include "FileDriver.h"
#include "M1SeriesException.h"
class M1Series : public std::map<boost::posix_time::ptime, Bar>
{
typedef std::map<boost::posix_time::ptime, Bar> ThisMap;
public:
M1Series(const std::string& name);
virtual ~M1Series();
//! Returns data series name.
std::string name(void) const { return _name; }
//! Returns true if data was loaded from a file. False otherwise.
bool isLoaded(void) const { return _isLoaded; }
std::size_t load( FileDriver& driver, const std::string& filename); // load all records returned by the driver
std::size_t load( FileDriver& driver, const std::string& filename,
const boost::posix_time::ptime& begin,
const boost::posix_time::ptime& end
); // load date range
//! Returns the first element data.
boost::posix_time::ptime first(void) const throw(M1SeriesException);
//! Returns the first element data.
boost::posix_time::ptime last(void) const throw(M1SeriesException);
//! Returns the loaded period.
boost::posix_time::time_period period(void) const throw(M1SeriesException);
//! Returns the loaded period in date_duration format.
boost::posix_time::time_duration duration(void) const throw(M1SeriesException);
protected:
private:
std::string _name;
bool _isLoaded;
};
#endif // M1SERIES_H
#include "M1Series.h"
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
M1Series::M1Series(const std::string& name):
_name(name),
_isLoaded(false)
{
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
M1Series::~M1Series()
{
//dtor
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
std::size_t M1Series::load(FileDriver& driver, const std::string& filename)
{
ThisMap::clear();
if( !driver.open(filename) )
return 0;
Bar rec;
while( !driver.eof() ) {
try {
if( driver.next(rec) == false )
continue;
if( ThisMap::insert(ThisMap::value_type(rec.key, rec)).second == false ) {
std::cerr << "Duplicate record " << rec.key << std::endl;
continue;
}
} catch( DriverException& e ) {
std::cerr << e.what() << std::endl;
continue;
}
} // while not EOF
driver.close();
_isLoaded = true;
return std::map<boost::posix_time::ptime, Bar>::size();
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
std::size_t M1Series::load(FileDriver& driver, const std::string& filename, const boost::posix_time::ptime& begin, const boost::posix_time::ptime& end)
{
ThisMap::clear();
if( !driver.open(filename) )
return 0;
Bar rec;
while( !driver.eof() ) {
try {
if( driver.next(rec) == false ) // EOF
continue;
if( rec.key < begin || rec.key > end )
continue; // out of range
if( ThisMap::insert(ThisMap::value_type(rec.key, rec)).second == false ) {
std::cerr << "Duplicate record " << rec.key << std::endl;
continue;
}
} catch( DriverException& e ) {
std::cerr << e.what() << std::endl;
continue;
}
} // while not EOF
driver.close();
_isLoaded = true;
return ThisMap::size();
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
boost::posix_time::ptime M1Series::last(void) const throw(M1SeriesException)
{
if( empty() )
throw M1SeriesException("Null series");
return boost::posix_time::ptime(ThisMap::rbegin()->first);
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
boost::posix_time::ptime M1Series::first(void) const throw(M1SeriesException)
{
if( empty() )
throw M1SeriesException("Null series");
return boost::posix_time::ptime(ThisMap::begin()->first);
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
boost::posix_time::time_period M1Series::period(void) const throw(M1SeriesException)
{
if( empty() )
throw M1SeriesException("Null series");
return boost::posix_time::time_period(ThisMap::begin()->first, ThisMap::rbegin()->first);
}
//////////////////////////////////////////////////////////////////////////////////////
//
//////////////////////////////////////////////////////////////////////////////////////
boost::posix_time::time_duration M1Series::duration(void) const throw(M1SeriesException)
{
if( empty() )
throw M1SeriesException("Null series");
return boost::posix_time::time_duration(ThisMap::rbegin()->first - ThisMap::begin()->first);
}