aboutsummaryrefslogtreecommitdiff
path: root/include/EASTL/bonus/compressed_pair.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/EASTL/bonus/compressed_pair.h')
-rw-r--r--include/EASTL/bonus/compressed_pair.h460
1 files changed, 0 insertions, 460 deletions
diff --git a/include/EASTL/bonus/compressed_pair.h b/include/EASTL/bonus/compressed_pair.h
deleted file mode 100644
index 379642b..0000000
--- a/include/EASTL/bonus/compressed_pair.h
+++ /dev/null
@@ -1,460 +0,0 @@
-/////////////////////////////////////////////////////////////////////////////
-// Copyright (c) Electronic Arts Inc. All rights reserved.
-/////////////////////////////////////////////////////////////////////////////
-
-///////////////////////////////////////////////////////////////////////////////
-// The compressed pair class is very similar to std::pair, but if either of the
-// template arguments are empty classes, then the "empty base-class optimization"
-// is applied to compress the size of the pair.
-//
-// The design for compressed_pair here is very similar to that found in template
-// metaprogramming libraries such as Boost, GCC, and Metrowerks, given that
-// these libraries have established this interface as a defacto standard for
-// solving this problem. Also, these are described in various books on the
-// topic of template metaprogramming, such as "Modern C++ Design".
-//
-// template <typename T1, typename 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 compressed_pair can not be instantiated if either of the template
-// arguments is a union type, unless there is compiler support for is_union,
-// or if is_union is specialised for the union type.
-///////////////////////////////////////////////////////////////////////////////
-
-
-#ifndef EASTL_COMPRESSED_PAIR_H
-#define EASTL_COMPRESSED_PAIR_H
-
-
-#include <EASTL/internal/config.h>
-#include <EASTL/type_traits.h>
-#include <EASTL/bonus/call_traits.h>
-
-#if defined(EA_PRAGMA_ONCE_SUPPORTED)
- #pragma once // Some compilers (e.g. VC++) benefit significantly from using this. We've measured 3-4% build speed improvements in apps as a result.
-#endif
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1900) // VS2015 or later
- EA_DISABLE_VC_WARNING(4626 5027) // warning C4626: 'eastl::compressed_pair_imp<T1,T2,0>': assignment operator was implicitly defined as deleted because a base class assignment operator is inaccessible or deleted
-#endif
-
-namespace eastl
-{
-
- template <typename T1, typename T2>
- class compressed_pair;
-
-
- template <typename T1, typename T2, bool isSame, bool firstEmpty, bool secondEmpty>
- struct compressed_pair_switch;
-
- template <typename T1, typename T2>
- struct compressed_pair_switch<T1, T2, false, false, false>{ static const int value = 0; };
-
- template <typename T1, typename T2>
- struct compressed_pair_switch<T1, T2, false, true, false> { static const int value = 1; };
-
- template <typename T1, typename T2>
- struct compressed_pair_switch<T1, T2, false, false, true> { static const int value = 2; };
-
- template <typename T1, typename T2>
- struct compressed_pair_switch<T1, T2, false, true, true> { static const int value = 3; };
-
- template <typename T1, typename T2>
- struct compressed_pair_switch<T1, T2, true, true, true> { static const int value = 4; };
-
- template <typename T1, typename T2>
- struct compressed_pair_switch<T1, T2, true, false, false> { static const int value = 5; };
-
- template <typename T1, typename T2, int version>
- class compressed_pair_imp;
-
-
-
- template <typename T>
- inline void cp_swap(T& t1, T& t2)
- {
- T tTemp = t1;
- t1 = t2;
- t2 = tTemp;
- }
-
-
- // Derive from neither
- template <typename T1, typename T2>
- class compressed_pair_imp<T1, T2, 0>
- {
- 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_imp() {}
-
- compressed_pair_imp(first_param_type x, second_param_type y)
- : mFirst(x), mSecond(y) {}
-
- compressed_pair_imp(first_param_type x)
- : mFirst(x) {}
-
- compressed_pair_imp(second_param_type y)
- : mSecond(y) {}
-
- first_reference first() { return mFirst; }
- first_const_reference first() const { return mFirst; }
-
- second_reference second() { return mSecond; }
- second_const_reference second() const { return mSecond; }
-
- void swap(compressed_pair<T1, T2>& y)
- {
- cp_swap(mFirst, y.first());
- cp_swap(mSecond, y.second());
- }
-
- private:
- first_type mFirst;
- second_type mSecond;
- };
-
-
- // Derive from T1
- template <typename T1, typename T2>
- class compressed_pair_imp<T1, T2, 1> : private T1
- {
- 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_imp() {}
-
- compressed_pair_imp(first_param_type x, second_param_type y)
- : first_type(x), mSecond(y) {}
-
- compressed_pair_imp(first_param_type x)
- : first_type(x) {}
-
- compressed_pair_imp(second_param_type y)
- : mSecond(y) {}
-
- first_reference first() { return *this; }
- first_const_reference first() const { return *this; }
-
- second_reference second() { return mSecond; }
- second_const_reference second() const { return mSecond; }
-
- void swap(compressed_pair<T1,T2>& y)
- {
- // No need to swap empty base class
- cp_swap(mSecond, y.second());
- }
-
- private:
- second_type mSecond;
- };
-
-
-
- // Derive from T2
- template <typename T1, typename T2>
- class compressed_pair_imp<T1, T2, 2> : private T2
- {
- 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_imp() {}
-
- compressed_pair_imp(first_param_type x, second_param_type y)
- : second_type(y), mFirst(x) {}
-
- compressed_pair_imp(first_param_type x)
- : mFirst(x) {}
-
- compressed_pair_imp(second_param_type y)
- : second_type(y) {}
-
- first_reference first() { return mFirst; }
- first_const_reference first() const { return mFirst; }
-
- second_reference second() { return *this; }
- second_const_reference second() const { return *this; }
-
- void swap(compressed_pair<T1,T2>& y)
- {
- // No need to swap empty base class
- cp_swap(mFirst, y.first());
- }
-
- private:
- first_type mFirst;
- };
-
-
-
- // Derive from T1 and T2
- template <typename T1, typename T2>
- class compressed_pair_imp<T1, T2, 3> : private T1, private T2
- {
- 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_imp() {}
-
- compressed_pair_imp(first_param_type x, second_param_type y)
- : first_type(x), second_type(y) {}
-
- compressed_pair_imp(first_param_type x)
- : first_type(x) {}
-
- compressed_pair_imp(second_param_type y)
- : second_type(y) {}
-
- first_reference first() { return *this; }
- first_const_reference first() const { return *this; }
-
- second_reference second() { return *this; }
- second_const_reference second() const { return *this; }
-
- // No need to swap empty bases
- void swap(compressed_pair<T1, T2>&)
- { }
- };
-
-
- // T1 == T2, T1 and T2 are both empty
- // Note does not actually store an instance of T2 at all;
- // but reuses T1 base class for both first() and second().
- template <typename T1, typename T2>
- class compressed_pair_imp<T1, T2, 4> : private T1
- {
- 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_imp() {}
-
- compressed_pair_imp(first_param_type x, second_param_type)
- : first_type(x) {}
-
- compressed_pair_imp(first_param_type x)
- : first_type(x) {}
-
- first_reference first() { return *this; }
- first_const_reference first() const { return *this; }
-
- second_reference second() { return *this; }
- second_const_reference second() const { return *this; }
-
- void swap(compressed_pair<T1, T2>&) { }
- };
-
-
- // T1 == T2 and are not empty
- template <typename T1, typename T2>
- class compressed_pair_imp<T1, T2, 5>
- {
- 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_imp() {}
-
- compressed_pair_imp(first_param_type x, second_param_type y)
- : mFirst(x), mSecond(y) {}
-
- compressed_pair_imp(first_param_type x)
- : mFirst(x), mSecond(x) {}
-
- first_reference first() { return mFirst; }
- first_const_reference first() const { return mFirst; }
-
- second_reference second() { return mSecond; }
- second_const_reference second() const { return mSecond; }
-
- void swap(compressed_pair<T1, T2>& y)
- {
- cp_swap(mFirst, y.first());
- cp_swap(mSecond, y.second());
- }
-
- private:
- first_type mFirst;
- second_type mSecond;
- };
-
-
-
- template <typename T1, typename T2>
- class compressed_pair
- : private compressed_pair_imp<T1, T2,
- compressed_pair_switch<
- T1,
- T2,
- is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
- is_empty<T1>::value,
- is_empty<T2>::value>::value>
- {
- private:
- typedef compressed_pair_imp<T1, T2,
- compressed_pair_switch<
- T1,
- T2,
- is_same<typename remove_cv<T1>::type, typename remove_cv<T2>::type>::value,
- is_empty<T1>::value,
- is_empty<T2>::value>::value> base;
- 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) : base(x, y) {}
- explicit compressed_pair(first_param_type x) : base(x) {}
- explicit compressed_pair(second_param_type y) : base(y) {}
-
- first_reference first() { return base::first(); }
- first_const_reference first() const { return base::first(); }
-
- second_reference second() { return base::second(); }
- second_const_reference second() const { return base::second(); }
-
- void swap(compressed_pair& y) { base::swap(y); }
- };
-
-
- // Partial specialisation for case where T1 == T2:
- template <typename T>
- class compressed_pair<T, T>
- : private compressed_pair_imp<T, T,
- compressed_pair_switch<
- T,
- T,
- is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
- is_empty<T>::value,
- is_empty<T>::value>::value>
- {
- private:
- typedef compressed_pair_imp<T, T,
- compressed_pair_switch<
- T,
- T,
- is_same<typename remove_cv<T>::type, typename remove_cv<T>::type>::value,
- is_empty<T>::value,
- is_empty<T>::value>::value> base;
- public:
- typedef T first_type;
- typedef T 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) : base(x, y) {}
- explicit compressed_pair(first_param_type x) : base(x) {}
-
- first_reference first() { return base::first(); }
- first_const_reference first() const { return base::first(); }
-
- second_reference second() { return base::second(); }
- second_const_reference second() const { return base::second(); }
-
- void swap(compressed_pair<T, T>& y) { base::swap(y); }
- };
-
-
- template <typename T1, typename T2>
- inline void swap(compressed_pair<T1, T2>& x, compressed_pair<T1, T2>& y)
- {
- x.swap(y);
- }
-
-
-} // namespace eastl
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1900) // VS2015 or later
- EA_RESTORE_VC_WARNING()
-#endif
-
-#endif // Header include guard
-
-
-