int main (void) {
  #define IS_SORTED ::boost::detail::is_sorted
  #define IS_SORTED_UNTIL ::boost::detail::is_sorted_until
  using boost::array;
  using boost::report_errors;

  std::cout << std::boolalpha;

  array<int, 10> a = { { 0, 1, 2,  3,  4, 5, 6,  7,  8,   9  } };
  array<int, 10> b = { { 0, 1, 1,  2,  5, 8, 13, 34, 55,  89 } };
  array<int, 10> c = { { 0, 1, -1, 2, -3, 5, -8, 13, -21, 34 } };

  tracking_less<int> lt;
  tracking_less_equal<int> lte;
  tracking_greater<int> gt;
  tracking_greater_equal<int> gte;

  BOOST_TEST_EQ(IS_SORTED_UNTIL(a.begin(), a.end()),          a.end());
  BOOST_TEST_EQ(IS_SORTED_UNTIL(a.begin(), a.end(), lt),      a.end());
  BOOST_TEST_EQ(IS_SORTED_UNTIL(a.begin(), a.end(), lte),     a.end());
  BOOST_TEST_EQ(*IS_SORTED_UNTIL(a.rbegin(), a.rend(), gt),   *a.rend());
  BOOST_TEST_EQ(*IS_SORTED_UNTIL(a.rbegin(), a.rend(), gte),  *a.rend());
  
  BOOST_TEST_EQ(IS_SORTED(a.begin(), a.end()),        true);
  BOOST_TEST_EQ(IS_SORTED(a.begin(), a.end(), lt),    true);
  BOOST_TEST_EQ(IS_SORTED(a.begin(), a.end(), lte),   true);
  BOOST_TEST_EQ(IS_SORTED(a.rbegin(), a.rend(), gt),  true);
  BOOST_TEST_EQ(IS_SORTED(a.rbegin(), a.rend(), gte), true);

  BOOST_TEST_EQ(IS_SORTED_UNTIL(b.begin(), b.end()),          b.end());
  BOOST_TEST_EQ(IS_SORTED_UNTIL(b.begin(), b.end(), lt),      b.end());
  BOOST_TEST_EQ(IS_SORTED_UNTIL(b.begin(), b.end(), lte),     &b[2]);
  BOOST_TEST_EQ(*IS_SORTED_UNTIL(b.rbegin(), b.rend(), gt),   *b.rend());
  BOOST_TEST_EQ(*IS_SORTED_UNTIL(b.rbegin(), b.rend(), gte),  b[2]);
  
  BOOST_TEST_EQ(IS_SORTED(b.begin(), b.end()),        true); 
  BOOST_TEST_EQ(IS_SORTED(b.begin(), b.end(), lt),    true); 
  BOOST_TEST_EQ(IS_SORTED(b.begin(), b.end(), lte),   false); 
  BOOST_TEST_EQ(IS_SORTED(b.rbegin(), b.rend(), gt),  true);
  BOOST_TEST_EQ(IS_SORTED(b.rbegin(), b.rend(), gte), false); 

  BOOST_TEST_EQ(IS_SORTED_UNTIL(c.begin(), c.end()),          &c[2]);
  BOOST_TEST_EQ(IS_SORTED_UNTIL(c.begin(), c.end(), lt),      &c[2]);
  BOOST_TEST_EQ(IS_SORTED_UNTIL(c.begin(), c.end(), lte),     &c[2]);
  BOOST_TEST_EQ(*IS_SORTED_UNTIL(c.rbegin(), c.rend(), gt),   c[7]);
  BOOST_TEST_EQ(*IS_SORTED_UNTIL(c.rbegin(), c.rend(), gte),  c[7]);
  
  BOOST_TEST_EQ(IS_SORTED(c.begin(), c.end()),        false);
  BOOST_TEST_EQ(IS_SORTED(c.begin(), c.end(), lt),    false);
  BOOST_TEST_EQ(IS_SORTED(c.begin(), c.end(), lte),   false);
  BOOST_TEST_EQ(IS_SORTED(c.rbegin(), c.rend(), gt),  false);
  BOOST_TEST_EQ(IS_SORTED(c.rbegin(), c.rend(), gte), false);

  return report_errors();
}