rendered paste body#ifndef __CALENDAR_H__#define __CALENDAR_H__#include <list>#include <map>#include <string>#include <stdexcept>//#include "vector.h"namespace lab2 {typedef std::list<std::string> strlist; template<typename T> class Calendar { public: enum format {list,cal,iCalendar}; Calendar<T>() { m_Date = T(); }; template<typename U> Calendar<T>(const Calendar<U> &c) { operator=(c); } bool set_date(int year,int month,int day){ try { m_Date = T(year,month,day); }catch(std::out_of_range e) { return false; } return true; }; bool add_event(const std::string &event) { return add_event(event,m_Date.day(),m_Date.month(),m_Date.year()); }; bool add_event(const std::string &event, int day) { return add_event(event,day,m_Date.month(),m_Date.year()); }; bool add_event(const std::string &event, int day,int month){ return add_event(event,day,month,m_Date.year()); }; bool add_event(const std::string &event, int day, int month,int year){ T newDate; try { newDate = T(year,month,day); }catch(std::out_of_range e) { return false; } //adds a newDate or returns an iterator to it typename std::map<T,strlist>::iterator i = events.insert(make_pair(newDate,strlist())).first; strlist::iterator eI; for(eI = i->second.begin();eI != i->second.end();eI++) { if(*eI == event) return false; } i->second.push_back(event); return true; }; bool remove_event(const std::string &event,int day = -1, int month = -1, int year = -1) { T evdate; if(day == -1) day = m_Date.day(); if(month == -1) month = m_Date.month(); if(year == -1) year = m_Date.year(); try { evdate = T(year,month,day); }catch(std::out_of_range e) { return false; } typename std::map<T,strlist>::iterator i = events.find(evdate); if( i == events.end()) return false; else { strlist::iterator eI; for(eI = i->second.begin(); eI != i->second.end();eI++) { if(*eI == event) { i->second.erase(eI); return true; } } } return false; }; /* Tries to move an event It removes the event from d1, then creates a new event in d2. If the event already is in d2, it will not be duplicated */ bool move_event(const T &d1,const T &d2,const std::string &ev) { if(!remove_event(ev,d1.day(),d1.month(),d1.year()) ) return false; if(!add_event(ev,d2.day(),d2.month(),d2.year())) return false; return true; }; bool set_format(Calendar::format f) { m_format = f; return true; }; template<typename U> Calendar<T>& operator=(const Calendar<U>& calendar) { m_Date = calendar.m_Date; typename std::map<U,strlist>::const_iterator i; for(i = calendar.events.begin(); i != calendar.events.end(); i++) { events.insert(*i); } return *this; }; template<typename U> friend std::ostream& operator<<(std::ostream &of,const Calendar<U> &c); enum format m_format; std::map<T,strlist> events; T m_Date; }; template<typename U> std::ostream &operator<<(std::ostream &of, const Calendar<U> &c){ typename std::map<U,strlist>::const_iterator i; //print "heaaders" if(c.m_format == Calendar<U>::iCalendar) { of << std::string("BEGIN:VCALENDAR\n"); of << "VERSION:2.0\n";// of << "PRODID:-\\iCal Exporter\\Johan\n"; } else if(c.m_format == Calendar<U>::cal) for(i = c.events.begin(); i != c.events.end();i++) { if(i->first > c.m_Date) { strlist::const_iterator strit; for(strit = i->second.begin();strit != i->second.end();strit++){ if(c.m_format == Calendar<U>::list || c.m_format == Calendar<U>::cal) { of << i->first << " : " << *strit << "\n"; } else if(c.m_format == Calendar<U>::iCalendar) {/* of << "BEGIN:VEVENT\n"; //set padding! of << "DSTART: " << i->first.year() << i.first.month() << i.first.day() << "T080000\n"; of << "DEND: " << i->first.year() << i.first.month() << i.first.day() << "T090000\n"; of << "SUMMARY: " << *strit << "\n"; of << "END:VEVENT\n"; */ } } } } //footer if(c.m_format == Calendar<U>::iCalendar) {// of << "END:VCALENDAR\n"; } return of; } };#endif