Brian Silverman | 60e3e2a | 2018-08-04 23:57:12 -0700 | [diff] [blame^] | 1 | [/ |
| 2 | Copyright 2000 Beman Dawes & John Maddock. |
| 3 | |
| 4 | Distributed under the Boost Software License, Version 1.0. |
| 5 | |
| 6 | See accompanying file LICENSE_1_0.txt |
| 7 | or copy at http://boost.org/LICENSE_1_0.txt |
| 8 | ] |
| 9 | |
| 10 | [article Compressed_Pair |
| 11 | [quickbook 1.5] |
| 12 | [authors [Cleary, Steve]] |
| 13 | [authors [Dawes, Beman]] |
| 14 | [authors [Hinnant, Howard]] |
| 15 | [authors [Maddock, John]] |
| 16 | [copyright 2000 Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock] |
| 17 | [license |
| 18 | Distributed under the Boost Software License, Version 1.0. |
| 19 | (See accompanying file LICENSE_1_0.txt or copy at |
| 20 | [@http://www.boost.org/LICENSE_1_0.txt]) |
| 21 | ] |
| 22 | ] |
| 23 | |
| 24 | [section Overview] |
| 25 | |
| 26 | All of the contents of `<boost/compressed_pair.hpp>` are defined inside |
| 27 | `namespace boost`. |
| 28 | |
| 29 | The class `compressed_pair` is very similar to `std::pair`, but if either of |
| 30 | the template arguments are empty classes, then the ['empty base-class |
| 31 | optimisation] is applied to compress the size of the pair. |
| 32 | |
| 33 | [endsect] |
| 34 | |
| 35 | [section Synopsis] |
| 36 | |
| 37 | template <class T1, class T2> |
| 38 | class compressed_pair |
| 39 | { |
| 40 | public: |
| 41 | typedef T1 first_type; |
| 42 | typedef T2 second_type; |
| 43 | typedef typename call_traits<first_type>::param_type first_param_type; |
| 44 | typedef typename call_traits<second_type>::param_type second_param_type; |
| 45 | typedef typename call_traits<first_type>::reference first_reference; |
| 46 | typedef typename call_traits<second_type>::reference second_reference; |
| 47 | typedef typename call_traits<first_type>::const_reference first_const_reference; |
| 48 | typedef typename call_traits<second_type>::const_reference second_const_reference; |
| 49 | |
| 50 | compressed_pair() : base() {} |
| 51 | compressed_pair(first_param_type x, second_param_type y); |
| 52 | explicit compressed_pair(first_param_type x); |
| 53 | explicit compressed_pair(second_param_type y); |
| 54 | |
| 55 | compressed_pair& operator=(const compressed_pair&); |
| 56 | |
| 57 | first_reference first(); |
| 58 | first_const_reference first() const; |
| 59 | |
| 60 | second_reference second(); |
| 61 | second_const_reference second() const; |
| 62 | |
| 63 | void swap(compressed_pair& y); |
| 64 | }; |
| 65 | |
| 66 | The two members of the pair can be accessed using the member functions |
| 67 | `first()` and `second()`. Note that not all member functions can be |
| 68 | instantiated for all template parameter types. In particular |
| 69 | `compressed_pair` can be instantiated for reference and array types, |
| 70 | however in these cases the range of constructors that can be used are |
| 71 | limited. If types `T1` and `T2` are the same type, then there is only |
| 72 | one version of the single-argument constructor, and this constructor |
| 73 | initialises both values in the pair to the passed value. |
| 74 | |
| 75 | Note that if either member is a POD type, then that member is not |
| 76 | zero-initialized by the `compressed_pair` default constructor: it's up |
| 77 | to you to supply an initial value for these types if you want them to have |
| 78 | a default value. |
| 79 | |
| 80 | Note that `compressed_pair` can not be instantiated if either of the |
| 81 | template arguments is a union type, unless there is compiler support for |
| 82 | `boost::is_union`, or if `boost::is_union` is specialised for the union |
| 83 | type. |
| 84 | |
| 85 | Finally, a word of caution for Visual C++ 6 users: if either argument is an |
| 86 | empty type, then assigning to that member will produce memory corruption, |
| 87 | unless the empty type has a "do nothing" assignment operator defined. This |
| 88 | is due to a bug in the way VC6 generates implicit assignment operators. |
| 89 | |
| 90 | [endsect] |
| 91 | |
| 92 | [section Acknowledgments] |
| 93 | |
| 94 | Based on contributions by Steve Cleary, Beman Dawes, Howard Hinnant and |
| 95 | John Maddock. |
| 96 | |
| 97 | Maintained by [@mailto:john@johnmaddock.co.uk John Maddock]. |
| 98 | |
| 99 | [endsect] |