Use type_traits to manage valptridx const

This commit is contained in:
Kp 2016-01-09 16:38:13 +00:00
parent cefc79f869
commit 6489c64598
2 changed files with 22 additions and 29 deletions

View file

@ -2,9 +2,11 @@
#include <cstddef>
#include "dxxsconf.h"
#include "objnum.h"
#include "segnum.h"
/* valptridx_specialized_type is never defined, but is declared to
* return a type-specific class suitable for use as a base of
* valptridx<T>.
*/
template <typename managed_type>
using valptridx_specialized_types = decltype(valptridx_specialized_type(static_cast<managed_type *>(nullptr)));
@ -18,9 +20,7 @@ class valptridx :
public:
class require_valid;
class allow_invalid;
class const_policy;
class mutable_policy;
template <typename policy>
template <template <typename> class policy>
class apply_cv_policy;
};
class vc; /* require_valid + const_policy */
@ -34,10 +34,20 @@ protected:
using const_pointer_type = const managed_type *;
using const_reference_type = const managed_type &;
using mutable_pointer_type = managed_type *;
/* integral_type must be a primitive integer type capable of holding
* all legal values used with managed_type. Legal values are valid
* indexes in array_managed_type and any magic out-of-range values.
*/
using typename specialized_types::integral_type;
using index_type = integral_type; // deprecated; should be dedicated UDT
using specialized_types::array_size;
/* basic_ptridx<policy> publicly inherits from basic_idx<policy> and
* basic_ptr<policy>, but should not be implicitly sliced to one of
* the base types. To prevent slicing, basic_idx and basic_ptr take
* a dummy parameter that is set to 0 for freestanding use and 1
* when used as a base class.
*/
template <typename policy, unsigned>
class basic_idx;
template <typename policy, unsigned>

View file

@ -158,28 +158,11 @@ template <typename managed_type>
constexpr tt::true_type valptridx<managed_type>::partial_policy::allow_invalid::allow_nullptr;
template <typename managed_type>
class valptridx<managed_type>::partial_policy::const_policy
{
protected:
template <typename T>
using apply_cv_qualifier = const T;
};
template <typename managed_type>
class valptridx<managed_type>::partial_policy::mutable_policy
{
protected:
template <typename T>
using apply_cv_qualifier = T;
};
template <typename managed_type>
template <typename policy>
class valptridx<managed_type>::partial_policy::apply_cv_policy :
policy
template <template <typename> class policy>
class valptridx<managed_type>::partial_policy::apply_cv_policy
{
template <typename T>
using apply_cv_qualifier = typename policy::template apply_cv_qualifier<T>;
using apply_cv_qualifier = typename policy<T>::type;
public:
using array_managed_type = apply_cv_qualifier<valptridx<managed_type>::array_managed_type>;
using pointer_type = apply_cv_qualifier<managed_type> *;
@ -189,28 +172,28 @@ public:
template <typename managed_type>
class valptridx<managed_type>::vc :
public partial_policy::require_valid,
public partial_policy::template apply_cv_policy<typename partial_policy::const_policy>
public partial_policy::template apply_cv_policy<tt::add_const>
{
};
template <typename managed_type>
class valptridx<managed_type>::vm :
public partial_policy::require_valid,
public partial_policy::template apply_cv_policy<typename partial_policy::mutable_policy>
public partial_policy::template apply_cv_policy<tt::remove_const>
{
};
template <typename managed_type>
class valptridx<managed_type>::ic :
public partial_policy::allow_invalid,
public partial_policy::template apply_cv_policy<typename partial_policy::const_policy>
public partial_policy::template apply_cv_policy<tt::add_const>
{
};
template <typename managed_type>
class valptridx<managed_type>::im :
public partial_policy::allow_invalid,
public partial_policy::template apply_cv_policy<typename partial_policy::mutable_policy>
public partial_policy::template apply_cv_policy<tt::remove_const>
{
};