ordering_test.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. // Boost.Signals2 library
  2. // Copyright Douglas Gregor 2002-2004. Use, modification and
  3. // distribution is subject to the Boost Software License, Version
  4. // 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // For more information, see http://www.boost.org
  7. #include <boost/test/minimal.hpp>
  8. #include <boost/signals2.hpp>
  9. #include <iostream>
  10. #include <vector>
  11. #include <algorithm>
  12. #include <cstdlib>
  13. #include <ctime>
  14. #include <functional>
  15. std::vector<int> valuesOutput;
  16. bool ungrouped1 = false;
  17. bool ungrouped2 = false;
  18. bool ungrouped3 = false;
  19. struct emit_int {
  20. emit_int(int v) : value(v) {}
  21. void operator()() const
  22. {
  23. BOOST_CHECK(value == 42 || (!ungrouped1 && !ungrouped2 && !ungrouped3));
  24. valuesOutput.push_back(value);
  25. std::cout << value << ' ';
  26. }
  27. private:
  28. int value;
  29. };
  30. struct write_ungrouped1 {
  31. void operator()() const
  32. {
  33. BOOST_CHECK(!ungrouped1);
  34. ungrouped1 = true;
  35. std::cout << "(Ungrouped #1)" << ' ';
  36. }
  37. };
  38. struct write_ungrouped2 {
  39. void operator()() const
  40. {
  41. BOOST_CHECK(!ungrouped2);
  42. ungrouped2 = true;
  43. std::cout << "(Ungrouped #2)" << ' ';
  44. }
  45. };
  46. struct write_ungrouped3 {
  47. void operator()() const
  48. {
  49. BOOST_CHECK(!ungrouped3);
  50. ungrouped3 = true;
  51. std::cout << "(Ungrouped #3)" << ' ';
  52. }
  53. };
  54. int return_argument(int x)
  55. {
  56. return x;
  57. }
  58. void test_group_compare()
  59. {
  60. boost::signals2::signal
  61. <
  62. int (),
  63. boost::signals2::last_value<int>,
  64. int,
  65. std::greater< int >
  66. > sig;
  67. sig.connect( 1, boost::bind( &return_argument, 1) );
  68. sig.connect( 2, boost::bind( &return_argument, 2) );
  69. BOOST_CHECK(sig() == 1);
  70. }
  71. int test_main(int, char* [])
  72. {
  73. using namespace std;
  74. srand(time(0));
  75. std::vector<int> sortedValues;
  76. boost::signals2::signal<void ()> sig;
  77. sig.connect(write_ungrouped1());
  78. for (int i = 0; i < 100; ++i) {
  79. #ifdef BOOST_NO_STDC_NAMESPACE
  80. int v = rand() % 100;
  81. #else
  82. int v = std::rand() % 100;
  83. #endif
  84. sortedValues.push_back(v);
  85. sig.connect(v, emit_int(v));
  86. if (i == 50) {
  87. sig.connect(write_ungrouped2());
  88. }
  89. }
  90. sig.connect(write_ungrouped3());
  91. std::sort(sortedValues.begin(), sortedValues.end());
  92. // 17 at beginning, 42 at end
  93. sortedValues.insert(sortedValues.begin(), 17);
  94. sig.connect(emit_int(17), boost::signals2::at_front);
  95. sortedValues.push_back(42);
  96. sig.connect(emit_int(42));
  97. sig();
  98. std::cout << std::endl;
  99. BOOST_CHECK(valuesOutput == sortedValues);
  100. BOOST_CHECK(ungrouped1);
  101. BOOST_CHECK(ungrouped2);
  102. BOOST_CHECK(ungrouped3);
  103. test_group_compare();
  104. return 0;
  105. }