interval_container.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*-----------------------------------------------------------------------------+
  2. Interval Container Library
  3. Author: Joachim Faulhaber
  4. Copyright (c) 2007-2009: Joachim Faulhaber
  5. Copyright (c) 1999-2006: Cortex Software GmbH, Kantstrasse 57, Berlin
  6. +------------------------------------------------------------------------------+
  7. Distributed under the Boost Software License, Version 1.0.
  8. (See accompanying file LICENCE.txt or copy at
  9. http://www.boost.org/LICENSE_1_0.txt)
  10. +-----------------------------------------------------------------------------*/
  11. /** Example interval_container.cpp \file interval_container.cpp
  12. \brief Demonstrates basic characteristics of interval container objects.
  13. \include interval_container_/interval_container.cpp
  14. */
  15. //[example_interval_container
  16. #include <iostream>
  17. #include <boost/icl/interval_set.hpp>
  18. #include <boost/icl/separate_interval_set.hpp>
  19. #include <boost/icl/split_interval_set.hpp>
  20. #include <boost/icl/split_interval_map.hpp>
  21. #include "../toytime.hpp"
  22. using namespace std;
  23. using namespace boost::icl;
  24. void interval_container_basics()
  25. {
  26. interval<Time>::type night_and_day(Time(monday, 20,00), Time(tuesday, 20,00));
  27. interval<Time>::type day_and_night(Time(tuesday, 7,00), Time(wednesday, 7,00));
  28. interval<Time>::type next_morning(Time(wednesday, 7,00), Time(wednesday,10,00));
  29. interval<Time>::type next_evening(Time(wednesday,18,00), Time(wednesday,21,00));
  30. // An interval set of type interval_set joins intervals that that overlap or touch each other.
  31. interval_set<Time> joinedTimes;
  32. joinedTimes.insert(night_and_day);
  33. joinedTimes.insert(day_and_night); //overlapping in 'day' [07:00, 20.00)
  34. joinedTimes.insert(next_morning); //touching
  35. joinedTimes.insert(next_evening); //disjoint
  36. cout << "Joined times :" << joinedTimes << endl;
  37. // A separate interval set of type separate_interval_set joins intervals that that
  38. // overlap but it preserves interval borders that just touch each other. You may
  39. // represent time grids like the months of a year as a split_interval_set.
  40. separate_interval_set<Time> separateTimes;
  41. separateTimes.insert(night_and_day);
  42. separateTimes.insert(day_and_night); //overlapping in 'day' [07:00, 20.00)
  43. separateTimes.insert(next_morning); //touching
  44. separateTimes.insert(next_evening); //disjoint
  45. cout << "Separate times:" << separateTimes << endl;
  46. // A split interval set of type split_interval_set preserves all interval
  47. // borders. On insertion of overlapping intervals the intervals in the
  48. // set are split up at the interval borders of the inserted interval.
  49. split_interval_set<Time> splitTimes;
  50. splitTimes += night_and_day;
  51. splitTimes += day_and_night; //overlapping in 'day' [07:00, 20:00)
  52. splitTimes += next_morning; //touching
  53. splitTimes += next_evening; //disjoint
  54. cout << "Split times :\n" << splitTimes << endl;
  55. // A split interval map splits up inserted intervals on overlap and aggregates the
  56. // associated quantities via the operator +=
  57. split_interval_map<Time, int> overlapCounter;
  58. overlapCounter += make_pair(night_and_day,1);
  59. overlapCounter += make_pair(day_and_night,1); //overlapping in 'day' [07:00, 20.00)
  60. overlapCounter += make_pair(next_morning, 1); //touching
  61. overlapCounter += make_pair(next_evening, 1); //disjoint
  62. cout << "Split times overlap counted:\n" << overlapCounter << endl;
  63. // An interval map joins touching intervals, if associated values are equal
  64. interval_map<Time, int> joiningOverlapCounter;
  65. joiningOverlapCounter = overlapCounter;
  66. cout << "Times overlap counted:\n" << joiningOverlapCounter << endl;
  67. }
  68. int main()
  69. {
  70. cout << ">>Interval Container Library: Sample interval_container.cpp <<\n";
  71. cout << "--------------------------------------------------------------\n";
  72. interval_container_basics();
  73. return 0;
  74. }
  75. // Program output:
  76. /* ----------------------------------------------------------------------------
  77. >>Interval Container Library: Sample interval_container.cpp <<
  78. --------------------------------------------------------------
  79. Joined times :[mon:20:00,wed:10:00)[wed:18:00,wed:21:00)
  80. Separate times:[mon:20:00,wed:07:00)[wed:07:00,wed:10:00)[wed:18:00,wed:21:00)
  81. Split times :
  82. [mon:20:00,tue:07:00)[tue:07:00,tue:20:00)[tue:20:00,wed:07:00)
  83. [wed:07:00,wed:10:00)[wed:18:00,wed:21:00)
  84. Split times overlap counted:
  85. {([mon:20:00,tue:07:00)->1)([tue:07:00,tue:20:00)->2)([tue:20:00,wed:07:00)->1)
  86. ([wed:07:00,wed:10:00)->1)([wed:18:00,wed:21:00)->1)}
  87. Times overlap counted:
  88. {([mon:20:00,tue:07:00)->1)([tue:07:00,tue:20:00)->2)([tue:20:00,wed:10:00)->1)
  89. ([wed:18:00,wed:21:00)->1)}
  90. -----------------------------------------------------------------------------*/
  91. //]