AirSched Logo  0.1.4
C++ Simulated Airline Schedule Manager Library
BookingRequestParser.hpp
Go to the documentation of this file.
00001 // //////////////////////////////////////////////////////////////////////
00002 // Import section
00003 // //////////////////////////////////////////////////////////////////////
00004 // STL
00005 #include <string>
00006 #include <vector>
00007 
00008 namespace airsched {
00009   
00011   struct Place_T {
00012     // Attributes
00013     std::string _name;
00014     std::string _code;
00016     Place_T () : _name (""), _code ("") {}
00017     /* Display. */  
00018     void display() const {
00019       std::cout << "Place: " << _name << " (" << _code << ")" << std::endl;
00020     }
00021   };
00022 
00024   typedef std::vector<Place_T> PlaceList_T;
00025 
00027   struct Date_T {
00028     // Attributes
00029     boost::gregorian::date _date;
00030     unsigned int _reldays;
00031     unsigned int _day;
00032     unsigned int _month;
00033     unsigned int _year;
00035     Date_T () : _reldays (14), _day(1), _month(1), _year(1970) {}
00036     /* Display. */  
00037     void display() const {
00038       std::cout << "Date: " << _date << " (" << _day << "/" << _month
00039                 << "/" << _year << "), i.e. in " << _reldays << " days"
00040                 << std::endl;
00041     }
00043     boost::gregorian::date getDate() const {
00044       return boost::gregorian::date (_year, _month, _day);
00045     }
00046   };
00047 
00049   typedef std::vector<Date_T> DateList_T;
00050 
00052   struct Airline_T {
00053     // Attributes
00054     bool _isPreferred;
00055     std::string _name;
00056     std::string _code;
00058     Airline_T () : _isPreferred (true), _name(""), _code("") {}
00059     /* Display. */  
00060     void display() const {
00061       const std::string isPreferredStr = (_isPreferred)?"+":"-";
00062       std::cout << "Airline: " << isPreferredStr << _name << " (" << _code << ")"
00063                 << std::endl;
00064     }
00065   };
00066 
00068   typedef std::vector<Airline_T> AirlineList_T;
00069 
00071   struct Passenger_T {
00072     // Attributes
00073     typedef enum { ADULT = 0, CHILD, PET, LAST_VALUE } PassengerType_T;
00074     static const std::string _labels[LAST_VALUE];
00075     PassengerType_T _type;
00076     unsigned short _number;
00078     Passenger_T () : _type(ADULT), _number(1) {}
00079     /* Display. */  
00080     void display() const {
00081       std::cout << "Passenger: " << _number << " (" << _labels[_type] << ")"
00082                 << std::endl;
00083     }
00084   };
00085 
00087   const std::string Passenger_T::_labels[Passenger_T::LAST_VALUE] =
00088     { "Adult", "Child", "Pet" };
00089 
00091   typedef std::vector<Passenger_T> PassengerList_T;
00092 
00094   struct SearchString_T {
00095     // Attributes
00096     PlaceList_T _placeList;
00097     DateList_T _dateList;
00098     AirlineList_T _airlineList;
00099     PassengerList_T _passengerList;
00100   
00102     SearchString_T () {}
00103 
00104     /* Display. */  
00105     void display() const {
00106       std::cout << std::endl;
00107     
00108       for (PlaceList_T::const_iterator itPlace = _placeList.begin();
00109            itPlace != _placeList.end(); ++itPlace) {
00110         const Place_T& lPlace = *itPlace;
00111         lPlace.display();
00112       }
00113 
00114       for (DateList_T::const_iterator itDate = _dateList.begin();
00115            itDate != _dateList.end(); ++itDate) {
00116         const Date_T& lDate = *itDate;
00117         lDate.display();
00118       }
00119 
00120       for (AirlineList_T::const_iterator itAirline = _airlineList.begin();
00121            itAirline != _airlineList.end(); ++itAirline) {
00122         const Airline_T& lAirline = *itAirline;
00123         lAirline.display();
00124       }
00125 
00126       for (PassengerList_T::const_iterator itPassenger = _passengerList.begin();
00127            itPassenger != _passengerList.end(); ++itPassenger) {
00128         const Passenger_T& lPassenger = *itPassenger;
00129         lPassenger.display();
00130       }
00131 
00132       std::cout << "-- Staging --" << std::endl;
00133       _tmpPlace.display();
00134     }
00135 
00136     // //// Staging ////
00137     Place_T _tmpPlace;
00138     Date_T _tmpDate;
00139     Airline_T _tmpAirline;
00140     Passenger_T _tmpPassenger;
00141   };
00142 
00144   //
00145   //  The booking request grammar (using subrules)
00146   //
00148 
00174   SearchString_T parseBookingRequest (const std::string& iSearchString);
00175 
00176 }