epoc32/include/stdapis/boost/serialization/void_cast.hpp
author William Roberts <williamr@symbian.org>
Tue, 16 Mar 2010 16:12:26 +0000
branchSymbian2
changeset 2 2fe1408b6811
permissions -rw-r--r--
Final list of Symbian^2 public API header files
williamr@2
     1
#ifndef  BOOST_SERIALIZATION_VOID_CAST_HPP
williamr@2
     2
#define BOOST_SERIALIZATION_VOID_CAST_HPP
williamr@2
     3
williamr@2
     4
// MS compatible compilers support #pragma once
williamr@2
     5
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
williamr@2
     6
# pragma once
williamr@2
     7
#endif
williamr@2
     8
williamr@2
     9
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
williamr@2
    10
// void_cast.hpp:   interface for run-time casting of void pointers.
williamr@2
    11
williamr@2
    12
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com . 
williamr@2
    13
// Use, modification and distribution is subject to the Boost Software
williamr@2
    14
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
williamr@2
    15
// http://www.boost.org/LICENSE_1_0.txt)
williamr@2
    16
// gennadiy.rozental@tfn.com
williamr@2
    17
williamr@2
    18
//  See http://www.boost.org for updates, documentation, and revision history.
williamr@2
    19
williamr@2
    20
#include <boost/smart_cast.hpp>
williamr@2
    21
#include <boost/mpl/eval_if.hpp>
williamr@2
    22
#include <boost/mpl/identity.hpp>
williamr@2
    23
williamr@2
    24
#include <boost/serialization/config.hpp>
williamr@2
    25
#include <boost/serialization/force_include.hpp>
williamr@2
    26
#include <boost/serialization/type_info_implementation.hpp>
williamr@2
    27
williamr@2
    28
#include <boost/config/abi_prefix.hpp> // must be the last header
williamr@2
    29
williamr@2
    30
#ifdef BOOST_MSVC
williamr@2
    31
#  pragma warning(push)
williamr@2
    32
#  pragma warning(disable : 4251 4231 4660 4275)
williamr@2
    33
#endif
williamr@2
    34
williamr@2
    35
namespace boost { 
williamr@2
    36
namespace serialization { 
williamr@2
    37
williamr@2
    38
class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) extended_type_info;
williamr@2
    39
williamr@2
    40
// Given a void *, assume that it really points to an instance of one type
williamr@2
    41
// and alter it so that it would point to an instance of a related type.
williamr@2
    42
// Return the altered pointer. If there exists no sequence of casts that
williamr@2
    43
// can transform from_type to to_type, return a NULL.  
williamr@2
    44
williamr@2
    45
BOOST_SERIALIZATION_DECL(void const *)
williamr@2
    46
void_upcast(
williamr@2
    47
    extended_type_info const & derived_type,  
williamr@2
    48
    extended_type_info const & base_type, 
williamr@2
    49
    void const * const t,
williamr@2
    50
    bool top = true
williamr@2
    51
);
williamr@2
    52
williamr@2
    53
inline void *
williamr@2
    54
void_upcast(
williamr@2
    55
    extended_type_info const & derived_type_,
williamr@2
    56
    extended_type_info const & base_type_,
williamr@2
    57
    void * const t 
williamr@2
    58
){
williamr@2
    59
    return const_cast<void*>(void_upcast(
williamr@2
    60
        derived_type_, 
williamr@2
    61
        base_type_, 
williamr@2
    62
        const_cast<void const *>(t)
williamr@2
    63
    ));
williamr@2
    64
}
williamr@2
    65
williamr@2
    66
BOOST_SERIALIZATION_DECL(void const *)
williamr@2
    67
void_downcast(
williamr@2
    68
    extended_type_info const & derived_type,  
williamr@2
    69
    extended_type_info const & base_type, 
williamr@2
    70
    void const * const t,
williamr@2
    71
    bool top = true
williamr@2
    72
);
williamr@2
    73
williamr@2
    74
inline void *
williamr@2
    75
void_downcast(
williamr@2
    76
    extended_type_info const & derived_type_,
williamr@2
    77
    extended_type_info const & base_type_,
williamr@2
    78
    void * const t 
williamr@2
    79
){
williamr@2
    80
    return const_cast<void*>(void_downcast(
williamr@2
    81
        derived_type_, 
williamr@2
    82
        base_type_, 
williamr@2
    83
        const_cast<void const *>(t)
williamr@2
    84
    ));
williamr@2
    85
}
williamr@2
    86
williamr@2
    87
namespace void_cast_detail {
williamr@2
    88
williamr@2
    89
// note: can't be abstract because an instance is used as a search argument
williamr@2
    90
class BOOST_SERIALIZATION_DECL(BOOST_PP_EMPTY()) void_caster
williamr@2
    91
{
williamr@2
    92
    friend struct void_caster_compare ;
williamr@2
    93
    friend 
williamr@2
    94
    BOOST_SERIALIZATION_DECL(void const *)  
williamr@2
    95
    boost::serialization::void_upcast(
williamr@2
    96
        const extended_type_info & derived_type,
williamr@2
    97
        const extended_type_info & base_type,
williamr@2
    98
        const void * t,
williamr@2
    99
        bool top
williamr@2
   100
    );
williamr@2
   101
    friend 
williamr@2
   102
    BOOST_SERIALIZATION_DECL(void const *)  
williamr@2
   103
    boost::serialization::void_downcast(
williamr@2
   104
        const extended_type_info & derived_type,
williamr@2
   105
        const extended_type_info & base_type,
williamr@2
   106
        const void * t,
williamr@2
   107
        bool top
williamr@2
   108
    );
williamr@2
   109
    // each derived class must re-implement these;
williamr@2
   110
    virtual void const * upcast(void const * t) const = 0;
williamr@2
   111
    virtual void const * downcast(void const * t) const = 0;
williamr@2
   112
    // Data members
williamr@2
   113
    extended_type_info const & m_derived_type;
williamr@2
   114
    extended_type_info const & m_base_type;
williamr@2
   115
protected:
williamr@2
   116
    static void static_register(const void_caster *);
williamr@2
   117
public:
williamr@2
   118
    // Constructor
williamr@2
   119
    void_caster(
williamr@2
   120
        extended_type_info const & derived_type_,
williamr@2
   121
        extended_type_info const & base_type_ 
williamr@2
   122
    );
williamr@2
   123
    // predicate used to determine if this void caster includes
williamr@2
   124
    // a particular eti *
williamr@2
   125
    bool includes(const extended_type_info * eti) const;
williamr@2
   126
    virtual ~void_caster();
williamr@2
   127
private:
williamr@2
   128
    // cw 8.3 requires this!!
williamr@2
   129
    void_caster& operator=(void_caster const&);
williamr@2
   130
};
williamr@2
   131
williamr@2
   132
template <class Derived, class Base>
williamr@2
   133
class void_caster_primitive : 
williamr@2
   134
    public void_caster
williamr@2
   135
{
williamr@2
   136
    virtual void const* downcast( void const * t ) const {
williamr@2
   137
        Derived * d = boost::smart_cast<const Derived *, const Base *>(
williamr@2
   138
            static_cast<const Base *>(t)
williamr@2
   139
        );
williamr@2
   140
        return d;
williamr@2
   141
    }
williamr@2
   142
    virtual void const* upcast(void const * t) const {
williamr@2
   143
        Base * b = boost::smart_cast<const Base *, const Derived *>(
williamr@2
   144
            static_cast<const Derived *>(t)
williamr@2
   145
        );
williamr@2
   146
        return b;
williamr@2
   147
    }
williamr@2
   148
williamr@2
   149
public:
williamr@2
   150
    static const void_caster_primitive instance;
williamr@2
   151
    void_caster_primitive() BOOST_USED;
williamr@2
   152
};
williamr@2
   153
williamr@2
   154
template <class Derived, class Base>
williamr@2
   155
void_caster_primitive<Derived, Base>::void_caster_primitive() :
williamr@2
   156
    void_caster( 
williamr@2
   157
        * type_info_implementation<Derived>::type::get_instance(), 
williamr@2
   158
        * type_info_implementation<Base>::type::get_instance() 
williamr@2
   159
    )
williamr@2
   160
{
williamr@2
   161
    this->static_register(& instance);
williamr@2
   162
}
williamr@2
   163
williamr@2
   164
// the purpose of this class is to create to->from and from->to instances
williamr@2
   165
// of void_caster_primitive for each related pair of types.  This has to be
williamr@2
   166
// done a pre-execution time - hence the usage of static variable.
williamr@2
   167
template<class Derived, class Base>
williamr@2
   168
const void_caster_primitive<Derived, Base>
williamr@2
   169
    void_caster_primitive<Derived, Base>::instance;
williamr@2
   170
williamr@2
   171
} // void_cast_detail 
williamr@2
   172
williamr@2
   173
// Register a base/derived pair.  This indicates that it is possible
williamr@2
   174
// to upcast a void pointer from Derived to Base and downcast a
williamr@2
   175
// void pointer from Base to Derived.  Note bogus arguments to workaround
williamr@2
   176
// bug in msvc 6.0
williamr@2
   177
template<class Derived, class Base>
williamr@2
   178
BOOST_DLLEXPORT 
williamr@2
   179
inline const void_cast_detail::void_caster & void_cast_register(
williamr@2
   180
    const Derived * dnull, 
williamr@2
   181
    const Base * bnull
williamr@2
   182
) BOOST_USED;
williamr@2
   183
template<class Derived, class Base>
williamr@2
   184
BOOST_DLLEXPORT 
williamr@2
   185
inline const void_cast_detail::void_caster & void_cast_register(
williamr@2
   186
    const Derived * /* dnull = NULL */, 
williamr@2
   187
    const Base * /* bnull = NULL */
williamr@2
   188
){
williamr@2
   189
    return void_cast_detail::void_caster_primitive<
williamr@2
   190
        const Derived, 
williamr@2
   191
        const Base
williamr@2
   192
    >::instance;
williamr@2
   193
}
williamr@2
   194
williamr@2
   195
} // namespace serialization
williamr@2
   196
} // namespace boost
williamr@2
   197
williamr@2
   198
#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
williamr@2
   199
williamr@2
   200
#endif // BOOST_SERIALIZATION_VOID_CAST_HPP