Squashed 'third_party/boostorg/core/' content from commit e128f4e

Change-Id: Ieb2dc8269dd1750337cfc876826ea7af75f12d63
git-subtree-dir: third_party/boostorg/core
git-subtree-split: e128f4e1b8904d47561700892843f07d5d1160db
diff --git a/doc/lightweight_test.qbk b/doc/lightweight_test.qbk
new file mode 100644
index 0000000..8884239
--- /dev/null
+++ b/doc/lightweight_test.qbk
@@ -0,0 +1,308 @@
+[/
+  Copyright 2010, 2011 Beman Dawes
+  Copyright 2013 Ion Gaztanaga
+  Copyright 2014, 2017 Peter Dimov
+  Copyright 2017 Kohei Takahashi
+
+  Distributed under the Boost Software License, Version 1.0.
+
+  See accompanying file LICENSE_1_0.txt
+  or copy at http://boost.org/LICENSE_1_0.txt
+]
+
+[section:lightweight_test lightweight_test]
+
+[simplesect Authors]
+
+* Peter Dimov
+* Beman Dawes
+
+[endsimplesect]
+
+[section Header <boost/core/lightweight_test.hpp>]
+
+The header `<boost/core/lightweight_test.hpp>` is a
+lightweight test framework. It's useful for writing
+Boost regression tests for components that are dependencies
+of Boost.Test.
+
+When using `lightweight_test.hpp`, *do not forget* to
+`return boost::report_errors()` from `main`.
+
+[section Synopsis]
+
+``
+#define BOOST_TEST(expression) /*unspecified*/
+#define BOOST_TEST_NOT(expression) /*unspecified*/
+#define BOOST_ERROR(message) /*unspecified*/
+#define BOOST_TEST_EQ(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_NE(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_LT(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_LE(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_GT(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_GE(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_CSTR_EQ(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_CSTR_NE(expr1, expr2) /*unspecified*/
+#define BOOST_TEST_ALL_EQ(begin1, end1, begin2, end2) /* unspecified */
+#define BOOST_TEST_ALL_WITH(begin1, end1, begin2, end2, predicate) /* unspecified */
+#define BOOST_TEST_THROWS(expr, excep) /*unspecified*/
+
+namespace boost
+{
+    int report_errors();
+}
+``
+
+[endsect]
+
+[section BOOST_TEST]
+
+``
+BOOST_TEST(expression)
+``
+
+If expression is false increases the error count and outputs a
+message containing `expression`.
+
+[endsect]
+
+[section BOOST_TEST_NOT]
+
+``
+BOOST_TEST_NOT(expression)
+``
+
+If expression is true increases the error count and outputs a
+message containing `!(expression)`.
+
+[endsect]
+
+[section BOOST_ERROR]
+
+``
+BOOST_ERROR(message)
+``
+
+Increases error count and outputs a message containing
+`message`.
+
+[endsect]
+
+[section BOOST_TEST_EQ]
+
+``
+BOOST_TEST_EQ(expr1, expr2)
+``
+
+If `expr1 == expr2` is not true increases the error count and outputs a
+message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_NE]
+
+``
+BOOST_TEST_NE(expr1, expr2)
+``
+
+If `expr1 != expr2` is not true increases the error count and outputs a
+message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_LT]
+
+``
+BOOST_TEST_LT(expr1, expr2)
+``
+
+If `expr1 < expr2` is not true increases the error count and outputs a
+message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_LE]
+
+``
+BOOST_TEST_LE(expr1, expr2)
+``
+
+If `expr1 <= expr2` is not true increases the error count and outputs a
+message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_GT]
+
+``
+BOOST_TEST_GT(expr1, expr2)
+``
+
+If `expr1 > expr2` is not true increases the error count and outputs a
+message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_GE]
+
+``
+BOOST_TEST_GE(expr1, expr2)
+``
+
+If `expr1 >= expr2` is not true increases the error count and outputs a
+message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_CSTR_EQ]
+
+``
+BOOST_TEST_CSTR_EQ(expr1, expr2)
+``
+
+Specialization of `BOOST_TEST_EQ` which interprets `expr1` and `expr2` as pointers to null-terminated byte strings (C strings). If `std::strcmp(expr1, expr2) != 0`, increase the error count and output a message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_CSTR_NE]
+
+``
+BOOST_TEST_CSTR_NE(expr1, expr2)
+``
+
+Specialization of `BOOST_TEST_NE` which interprets `expr1` and `expr2` as pointers to null-terminated byte strings (C strings). If `std::strcmp(expr1, expr2) == 0`, increase the error count and output a message containing both expressions.
+
+[endsect]
+
+[section BOOST_TEST_ALL_EQ]
+
+``
+BOOST_TEST_ALL_EQ(begin1, end1, begin2, end2)
+``
+
+Compares the content of two sequences. If they have different sizes, or if any pairwise element differs, increases the error count and outputs a message containing at most 8 differing elements.
+
+[endsect]
+
+[section BOOST_TEST_ALL_WITH]
+
+``
+BOOST_TEST_ALL_WITH(begin1, end1, begin2, end2, predicate)
+``
+
+Compares the content of two sequences. If they have different sizes, or if any pairwise element do not fulfill the binary predicate, increases the error count and outputs a message containing at most 8 differing elements.
+
+[endsect]
+
+[section BOOST_TEST_THROWS]
+
+``
+BOOST_TEST_THROWS(expr, excep)
+``
+
+If `BOOST_NO_EXCEPTIONS` is *not* defined and if `expr` does not
+throw an exception of type `excep`, increases the error count
+and outputs a message containing the expression.
+
+If `BOOST_NO_EXCEPTIONS` is defined, this macro expands to
+nothing and `expr` is not evaluated.
+
+[endsect]
+
+[section report_errors]
+
+``
+int boost::report_errors()
+``
+
+Return the error count from `main`.
+
+[endsect]
+
+[section Example]
+
+``
+#include <boost/core/lightweight_test.hpp>
+
+int sqr( int x )
+{
+    return x * x;
+}
+
+int main()
+{
+    BOOST_TEST( sqr(2) == 4 );
+    BOOST_TEST_EQ( sqr(-3), 9 );
+
+    return boost::report_errors();
+}
+``
+
+[endsect]
+
+[endsect]
+
+[section Header <boost/core/lightweight_test_trait.hpp>]
+
+The header `<boost/core/lightweight_test_trait.hpp>` defines
+a couple of extra macros for testing compile-time traits that
+return a boolean value.
+
+[section Synopsis]
+
+``
+#define BOOST_TEST_TRAIT_TRUE((Trait)) /*unspecified*/
+#define BOOST_TEST_TRAIT_FALSE((Trait)) /*unspecified*/
+``
+
+[endsect]
+
+[section BOOST_TEST_TRAIT_TRUE]
+
+``
+BOOST_TEST_TRAIT_TRUE((Trait))
+``
+
+If `Trait::value != true` increases the error count and outputs a
+message containing `Trait`. Note the double set of parentheses; these
+enable `Trait` to contain a comma, which is common for templates.
+
+[endsect]
+
+[section BOOST_TEST_TRAIT_FALSE]
+
+``
+BOOST_TEST_TRAIT_FALSE((Trait))
+``
+
+If `Trait::value != false` increases the error count and outputs a
+message containing `Trait`. Note the double set of parentheses.
+
+[endsect]
+
+[section Example]
+
+``
+#include <boost/core/lightweight_test_trait.hpp>
+#include <boost/core/is_same.hpp>
+
+template<class T, class U> struct X
+{
+    typedef T type;
+};
+
+using boost::core::is_same;
+
+int main()
+{
+    BOOST_TEST_TRAIT_TRUE(( is_same<X<int, long>::type, int> ));
+
+    return boost::report_errors();
+}
+``
+
+[endsect]
+
+[endsect]
+
+[endsect]