range1.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. // Copyright 2002 The Trustees of Indiana University.
  2. // Use, modification and distribution is subject to the Boost Software
  3. // License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
  4. // http://www.boost.org/LICENSE_1_0.txt)
  5. // Boost.MultiArray Library
  6. // Authors: Ronald Garcia
  7. // Jeremy Siek
  8. // Andrew Lumsdaine
  9. // See http://www.boost.org/libs/multi_array for documentation.
  10. //
  11. // range1.cpp - test of index_range
  12. //
  13. #include <boost/multi_array/index_range.hpp>
  14. #include <boost/core/lightweight_test.hpp>
  15. #include <boost/array.hpp>
  16. #include <cstddef>
  17. int
  18. main()
  19. {
  20. typedef boost::detail::multi_array::index_range<int,std::size_t> range;
  21. {
  22. // typical range creation and extraction
  23. range r1(-3,5);
  24. BOOST_TEST(r1.start() == -3);
  25. BOOST_TEST(r1.finish() == 5);
  26. BOOST_TEST(r1.stride() == 1);
  27. BOOST_TEST(r1.size(0) == 8);
  28. BOOST_TEST(!r1.is_degenerate());
  29. BOOST_TEST(r1.get_start(0) == -3);
  30. BOOST_TEST(r1.get_finish(100) == 5);
  31. }
  32. {
  33. range r2(-3,5,2);
  34. BOOST_TEST(r2.start() == -3);
  35. BOOST_TEST(r2.finish() == 5);
  36. BOOST_TEST(r2.stride() == 2);
  37. BOOST_TEST(r2.size(0) == 4);
  38. BOOST_TEST(!r2.is_degenerate());
  39. }
  40. {
  41. // degenerate creation
  42. range r3(5);
  43. BOOST_TEST(r3.start() == 5);
  44. BOOST_TEST(r3.finish() == 6);
  45. BOOST_TEST(r3.stride() == 1);
  46. BOOST_TEST(r3.size(0) == 1);
  47. BOOST_TEST(r3.is_degenerate());
  48. }
  49. {
  50. // default range creation
  51. range r4;
  52. BOOST_TEST(r4.get_start(0) == 0);
  53. BOOST_TEST(r4.get_finish(100) == 100);
  54. BOOST_TEST(r4.stride() == 1);
  55. BOOST_TEST(r4.size(0) == 0);
  56. }
  57. {
  58. // create a range using the setter methods
  59. range r5 = range().stride(2).start(-3).finish(7);
  60. BOOST_TEST(r5.start() == -3);
  61. BOOST_TEST(r5.stride() == 2);
  62. BOOST_TEST(r5.finish() == 7);
  63. BOOST_TEST(r5.size(0) == 5);
  64. }
  65. // try out all the comparison operators
  66. {
  67. range r6 = -3 <= range().stride(2) < 7;
  68. BOOST_TEST(r6.start() == -3);
  69. BOOST_TEST(r6.stride() == 2);
  70. BOOST_TEST(r6.finish() == 7);
  71. BOOST_TEST(r6.size(0) == 5);
  72. }
  73. {
  74. range r7 = -3 < range() <= 7;
  75. BOOST_TEST(r7.start() == -2);
  76. BOOST_TEST(r7.stride() == 1);
  77. BOOST_TEST(r7.finish() == 8);
  78. BOOST_TEST(r7.size(0) == 10);
  79. }
  80. // arithmetic operators
  81. {
  82. range r8 = range(0,5) + 2;
  83. BOOST_TEST(r8.start() == 2);
  84. BOOST_TEST(r8.stride() == 1);
  85. BOOST_TEST(r8.finish() == 7);
  86. BOOST_TEST(r8.size(0) == 5);
  87. }
  88. {
  89. range r9 = range(0,5) - 2;
  90. BOOST_TEST(r9.start() == -2);
  91. BOOST_TEST(r9.stride() == 1);
  92. BOOST_TEST(r9.finish() == 3);
  93. BOOST_TEST(r9.size(0) == 5);
  94. }
  95. return boost::report_errors();
  96. }