Squashed 'third_party/boostorg/utility/' content from commit ebe4429

Change-Id: I8e6ee78273db31df18f99d29034f855ccc064551
git-subtree-dir: third_party/boostorg/utility
git-subtree-split: ebe44296ca698e333a09e8268ea8ccedb3886c4d
diff --git a/doc/compressed_pair.qbk b/doc/compressed_pair.qbk
new file mode 100644
index 0000000..eac4266
--- /dev/null
+++ b/doc/compressed_pair.qbk
@@ -0,0 +1,99 @@
+[/
+  Copyright 2000 Beman Dawes & John Maddock.
+
+  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
+]
+
+[article Compressed_Pair
+    [quickbook 1.5]
+    [authors [Cleary, Steve]]
+    [authors [Dawes, Beman]]
+    [authors [Hinnant, Howard]]
+    [authors [Maddock, John]]
+    [copyright 2000 Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock]
+    [license
+        Distributed under the Boost Software License, Version 1.0.
+        (See accompanying file LICENSE_1_0.txt or copy at
+        [@http://www.boost.org/LICENSE_1_0.txt])
+    ]
+]
+
+[section Overview]
+
+All of the contents of `<boost/compressed_pair.hpp>` are defined inside
+`namespace boost`.
+
+The class `compressed_pair` is very similar to `std::pair`, but if either of
+the template arguments are empty classes, then the ['empty base-class
+optimisation] is applied to compress the size of the pair.
+
+[endsect]
+
+[section Synopsis]
+
+    template <class T1, class T2>
+    class compressed_pair
+    {
+    public:
+        typedef T1                                                 first_type;
+        typedef T2                                                 second_type;
+        typedef typename call_traits<first_type>::param_type       first_param_type;
+        typedef typename call_traits<second_type>::param_type      second_param_type;
+        typedef typename call_traits<first_type>::reference        first_reference;
+        typedef typename call_traits<second_type>::reference       second_reference;
+        typedef typename call_traits<first_type>::const_reference  first_const_reference;
+        typedef typename call_traits<second_type>::const_reference second_const_reference;
+
+                 compressed_pair() : base() {}
+                 compressed_pair(first_param_type x, second_param_type y);
+        explicit compressed_pair(first_param_type x);
+        explicit compressed_pair(second_param_type y);
+
+        compressed_pair& operator=(const compressed_pair&);
+
+        first_reference       first();
+        first_const_reference first() const;
+
+        second_reference       second();
+        second_const_reference second() const;
+
+        void swap(compressed_pair& y);
+    };
+
+The two members of the pair can be accessed using the member functions
+`first()` and `second()`. Note that not all member functions can be
+instantiated for all template parameter types. In particular
+`compressed_pair` can be instantiated for reference and array types,
+however in these cases the range of constructors that can be used are
+limited. If types `T1` and `T2` are the same type, then there is only
+one version of the single-argument constructor, and this constructor
+initialises both values in the pair to the passed value.
+
+Note that if either member is a POD type, then that member is not
+zero-initialized by the `compressed_pair` default constructor: it's up
+to you to supply an initial value for these types if you want them to have
+a default value.
+
+Note that `compressed_pair` can not be instantiated if either of the
+template arguments is a union type, unless there is compiler support for
+`boost::is_union`, or if `boost::is_union` is specialised for the union
+type.
+
+Finally, a word of caution for Visual C++ 6 users: if either argument is an
+empty type, then assigning to that member will produce memory corruption,
+unless the empty type has a "do nothing" assignment operator defined. This
+is due to a bug in the way VC6 generates implicit assignment operators.
+
+[endsect]
+
+[section Acknowledgments]
+
+Based on contributions by Steve Cleary, Beman Dawes, Howard Hinnant and
+John Maddock.
+
+Maintained by [@mailto:john@johnmaddock.co.uk John Maddock].
+
+[endsect]