ex_boost_party.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. /*-----------------------------------------------------------------------------+
  2. Copyright (c) 2008-2009: Joachim Faulhaber
  3. +------------------------------------------------------------------------------+
  4. Distributed under the Boost Software License, Version 1.0.
  5. (See accompanying file LICENCE.txt or copy at
  6. http://www.boost.org/LICENSE_1_0.txt)
  7. +-----------------------------------------------------------------------------*/
  8. #define BOOST_TEST_MODULE icl::example_boost_party unit test
  9. #include <libs/icl/test/disable_test_warnings.hpp>
  10. #include "../unit_test_unwarned.hpp"
  11. //#include <boost/icl/set.hpp> // Needed for implicit calls of operator << on
  12. //JODO CLANG // GuestSets via test macros.
  13. //------------------------------------------------------------------------------
  14. // begin example code. return value added to function boost_party
  15. //------------------------------------------------------------------------------
  16. #include <boost/icl/ptime.hpp>
  17. #include <iostream>
  18. #include <boost/icl/interval_map.hpp>
  19. using namespace std;
  20. using namespace boost::posix_time;
  21. using namespace boost::icl;
  22. // Type set<string> collects the names of party guests. Since std::set is
  23. // a model of the itl's set concept, the concept provides an operator +=
  24. // that performs a set union on overlap of intervals.
  25. typedef std::set<string> GuestSetT;
  26. interval_map<ptime, GuestSetT> boost_party()
  27. {
  28. GuestSetT mary_harry;
  29. mary_harry.insert("Mary");
  30. mary_harry.insert("Harry");
  31. GuestSetT diana_susan;
  32. diana_susan.insert("Diana");
  33. diana_susan.insert("Susan");
  34. GuestSetT peter;
  35. peter.insert("Peter");
  36. // A party is an interval map that maps time intervals to sets of guests
  37. interval_map<ptime, GuestSetT> party;
  38. party.add( // add and element
  39. make_pair(
  40. interval<ptime>::right_open(
  41. time_from_string("2008-05-20 19:30"),
  42. time_from_string("2008-05-20 23:00")),
  43. mary_harry));
  44. party += // element addition can also be done via operator +=
  45. make_pair(
  46. interval<ptime>::right_open(
  47. time_from_string("2008-05-20 20:10"),
  48. time_from_string("2008-05-21 00:00")),
  49. diana_susan);
  50. party +=
  51. make_pair(
  52. interval<ptime>::right_open(
  53. time_from_string("2008-05-20 22:15"),
  54. time_from_string("2008-05-21 00:30")),
  55. peter);
  56. interval_map<ptime, GuestSetT>::iterator it = party.begin();
  57. cout << "----- History of party guests -------------------------\n";
  58. while(it != party.end())
  59. {
  60. interval<ptime>::type when = it->first;
  61. // Who is at the party within the time interval 'when' ?
  62. GuestSetT who = (*it++).second;
  63. cout << when << ": " << who << endl;
  64. }
  65. return party;
  66. }
  67. //------------------------------------------------------------------------------
  68. // end example code
  69. //------------------------------------------------------------------------------
  70. typedef interval_map<ptime, GuestSetT> PartyHistory;
  71. typedef PartyHistory::segment_type SegmentT;
  72. SegmentT episode(const char* from, const char* to, GuestSetT guests)
  73. {
  74. return make_pair( interval<ptime>
  75. ::right_open( time_from_string(from)
  76. , time_from_string(to) )
  77. , guests);
  78. }
  79. PartyHistory check_party()
  80. {
  81. GuestSetT mary_harry;
  82. mary_harry.insert("Mary");
  83. mary_harry.insert("Harry");
  84. GuestSetT diana_susan;
  85. diana_susan.insert("Diana");
  86. diana_susan.insert("Susan");
  87. GuestSetT peter;
  88. peter.insert("Peter");
  89. GuestSetT Diana_Harry_Mary_Susan = mary_harry + diana_susan;
  90. GuestSetT Diana_Harry_Mary_Peter_Susan = Diana_Harry_Mary_Susan + peter;
  91. GuestSetT Diana_Peter_Susan = Diana_Harry_Mary_Peter_Susan - mary_harry;
  92. PartyHistory party;
  93. party += episode("2008-05-20 19:30", "2008-05-20 20:10", mary_harry);
  94. party += episode("2008-05-20 20:10", "2008-05-20 22:15", Diana_Harry_Mary_Susan);
  95. party += episode("2008-05-20 22:15", "2008-05-20 23:00", Diana_Harry_Mary_Peter_Susan);
  96. party += episode("2008-05-20 23:00", "2008-05-21 00:00", Diana_Peter_Susan);
  97. party += episode("2008-05-21 00:00", "2008-05-21 00:30", peter);
  98. return party;
  99. }
  100. BOOST_AUTO_TEST_CASE(icl_example_boost_party)
  101. {
  102. PartyHistory party1 = boost_party();
  103. PartyHistory party2 = check_party();
  104. bool party_equality = (party1==party2);
  105. BOOST_CHECK(party_equality);
  106. //BOOST_CHECK_EQUAL(boost_party(), check_party());
  107. }