native.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. // Copyright (C) 2006-2009, 2012 Alexander Nasonov
  2. // Copyright (C) 2012 Lorenzo Caminiti
  3. // Distributed under the Boost Software License, Version 1.0
  4. // (see accompanying file LICENSE_1_0.txt or a copy at
  5. // http://www.boost.org/LICENSE_1_0.txt)
  6. // Home at http://www.boost.org/libs/scope_exit
  7. #include <boost/scope_exit.hpp>
  8. #include <boost/config.hpp>
  9. #include <boost/typeof/typeof.hpp>
  10. #include <boost/typeof/std/string.hpp>
  11. #include <boost/detail/lightweight_test.hpp>
  12. #include <iostream>
  13. #include <ostream>
  14. #include <string>
  15. std::string g_str;
  16. template<int Dummy = 0>
  17. struct Holder {
  18. static long g_long;
  19. };
  20. template<int Dummy> long Holder<Dummy>::g_long;
  21. void test_non_local(void) {
  22. // ... and one local variable as well:
  23. int i = 0;
  24. BOOST_SCOPE_EXIT(void) {
  25. BOOST_TEST(Holder<>::g_long == 3);
  26. } BOOST_SCOPE_EXIT_END
  27. BOOST_SCOPE_EXIT( (i) ) {
  28. BOOST_TEST(i == 0);
  29. BOOST_TEST(Holder<>::g_long == 3);
  30. BOOST_TEST(g_str == "try: g_str");
  31. } BOOST_SCOPE_EXIT_END
  32. BOOST_SCOPE_EXIT( (&i) ) {
  33. BOOST_TEST(i == 3);
  34. BOOST_TEST(Holder<>::g_long == 3);
  35. BOOST_TEST(g_str == "try: g_str");
  36. } BOOST_SCOPE_EXIT_END
  37. {
  38. g_str = "";
  39. Holder<>::g_long = 1;
  40. BOOST_SCOPE_EXIT( (&i) ) {
  41. i = 1;
  42. g_str = "g_str";
  43. } BOOST_SCOPE_EXIT_END
  44. BOOST_SCOPE_EXIT( (&i) ) {
  45. try {
  46. i = 2;
  47. Holder<>::g_long = 2;
  48. throw 0;
  49. } catch(...) {}
  50. } BOOST_SCOPE_EXIT_END
  51. BOOST_TEST(i == 0);
  52. BOOST_TEST(g_str == "");
  53. BOOST_TEST(Holder<>::g_long == 1);
  54. }
  55. BOOST_TEST(Holder<>::g_long == 2);
  56. BOOST_TEST(g_str == "g_str");
  57. BOOST_TEST(i == 1); // Check that first declared is executed last.
  58. BOOST_SCOPE_EXIT( (&i) ) {
  59. BOOST_TEST(i == 3);
  60. BOOST_TEST(Holder<>::g_long == 3);
  61. BOOST_TEST(g_str == "try: g_str");
  62. } BOOST_SCOPE_EXIT_END
  63. BOOST_SCOPE_EXIT( (i) ) {
  64. BOOST_TEST(i == 1);
  65. BOOST_TEST(Holder<>::g_long == 3);
  66. BOOST_TEST(g_str == "try: g_str");
  67. } BOOST_SCOPE_EXIT_END
  68. try {
  69. BOOST_SCOPE_EXIT( (&i) ) {
  70. i = 3;
  71. g_str = "try: g_str";
  72. } BOOST_SCOPE_EXIT_END
  73. BOOST_SCOPE_EXIT( (&i) ) {
  74. i = 4;
  75. Holder<>::g_long = 3;
  76. } BOOST_SCOPE_EXIT_END
  77. BOOST_TEST(i == 1);
  78. BOOST_TEST(g_str == "g_str");
  79. BOOST_TEST(Holder<>::g_long == 2);
  80. throw 0;
  81. } catch(int) {
  82. BOOST_TEST(Holder<>::g_long == 3);
  83. BOOST_TEST(g_str == "try: g_str");
  84. BOOST_TEST(i == 3); // Check that first declared is executed last.
  85. }
  86. }
  87. bool foo(void) { return true; }
  88. bool foo2(void) { return false; }
  89. void test_types(void) {
  90. bool (*pf)(void) = 0;
  91. bool (&rf)(void) = foo;
  92. bool results[2] = {};
  93. {
  94. BOOST_SCOPE_EXIT( (&results) (&pf) (&rf) ) {
  95. results[0] = pf();
  96. results[1] = rf();
  97. }
  98. BOOST_SCOPE_EXIT_END
  99. pf = &foo;
  100. BOOST_TEST(results[0] == false);
  101. BOOST_TEST(results[1] == false);
  102. }
  103. BOOST_TEST(results[0] == true);
  104. BOOST_TEST(results[1] == true);
  105. {
  106. BOOST_SCOPE_EXIT( (&results) (pf) ) {
  107. results[0] = !pf();
  108. results[1] = !pf();
  109. pf = &foo2; // modify a copy
  110. }
  111. BOOST_SCOPE_EXIT_END
  112. pf = 0;
  113. BOOST_TEST(results[0] == true);
  114. BOOST_TEST(results[1] == true);
  115. }
  116. BOOST_TEST(pf == 0);
  117. BOOST_TEST(results[0] == false);
  118. BOOST_TEST(results[1] == false);
  119. }
  120. void test_capture_all(void) {
  121. #ifndef BOOST_NO_CXX11_LAMBDAS
  122. int i = 0, j = 1;
  123. {
  124. BOOST_SCOPE_EXIT_ALL(=) {
  125. i = j = 1; // modify copies
  126. };
  127. }
  128. BOOST_TEST(i == 0);
  129. BOOST_TEST(j == 1);
  130. {
  131. BOOST_SCOPE_EXIT_ALL(&) {
  132. i = 1;
  133. j = 2;
  134. };
  135. BOOST_TEST(i == 0);
  136. BOOST_TEST(j == 1);
  137. }
  138. BOOST_TEST(i == 1);
  139. BOOST_TEST(j == 2);
  140. {
  141. BOOST_SCOPE_EXIT_ALL(=, &j) {
  142. i = 2; // modify a copy
  143. j = 3;
  144. };
  145. BOOST_TEST(i == 1);
  146. BOOST_TEST(j == 2);
  147. }
  148. BOOST_TEST(i == 1);
  149. BOOST_TEST(j == 3);
  150. #endif // lambdas
  151. }
  152. int main(void) {
  153. test_non_local();
  154. test_types();
  155. test_capture_all();
  156. return boost::report_errors();
  157. }