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);

}