Update of /cvsroot/boost/boost/boost/fusion/sequence/adapted/struct
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv29668
Modified Files:
extension.hpp
Added Files:
adapt_assoc_struct.hpp
Log Message:
adding struct associative adaptor
--- NEW FILE: adapt_assoc_struct.hpp ---
/*=============================================================================
Copyright (c) 2001-2007 Joel de Guzman
Copyright (c) 2007 Dan Marsden
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)
==============================================================================*/
#if !defined(BOOST_FUSION_ADAPT_ASSOC_STRUCT_20070508_2207)
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_20070508_2207
#include <boost/fusion/support/tag_of_fwd.hpp>
#include <boost/fusion/sequence/adapted/struct/extension.hpp>
#include <boost/fusion/sequence/adapted/struct/struct_iterator.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/is_view_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/is_sequence_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/category_of_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/begin_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/end_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/size_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/at_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/value_at_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/has_key_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/at_key_impl.hpp>
#include <boost/fusion/sequence/adapted/struct/detail/value_at_key_impl.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/punctuation/comma_if.hpp>
#include <boost/preprocessor/seq/for_each_i.hpp>
#include <boost/preprocessor/tuple/elem.hpp>
#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/cat.hpp>
#include <boost/mpl/int.hpp>
#include <utility>
namespace boost { namespace fusion { namespace extension {
template<typename Struct, typename Key>
struct struct_assoc_member;
}}}
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT(name, bseq)
\
BOOST_FUSION_ADAPT_ASSOC_STRUCT_I(
\
name, BOOST_PP_CAT(BOOST_FUSION_ADAPT_ASSOC_STRUCT_X bseq, 0))
\
/***/
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_X(x, y, z) ((x, y, z))
BOOST_FUSION_ADAPT_ASSOC_STRUCT_Y
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_Y(x, y, z) ((x, y, z))
BOOST_FUSION_ADAPT_ASSOC_STRUCT_X
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_X0
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_Y0
// BOOST_FUSION_ADAPT_ASSOC_STRUCT_I generates the overarching structure and
uses
// SEQ_FOR_EACH_I to generate the "linear" substructures.
// Thanks to Paul Mensonides for the PP macro help
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_I(name, seq)
\
namespace boost { namespace fusion { namespace traits
\
{
\
template <>
\
struct tag_of<name>
\
{
\
typedef struct_tag type;
\
};
\
}}}
\
namespace boost { namespace fusion { namespace extension
\
{
\
template <>
\
struct struct_size<name> : mpl::int_<BOOST_PP_SEQ_SIZE(seq)> {};
\
BOOST_PP_SEQ_FOR_EACH_I(BOOST_FUSION_ADAPT_ASSOC_STRUCT_C, name, seq)
\
}}}
\
/***/
#define BOOST_FUSION_ADAPT_ASSOC_STRUCT_C(r, name, i, xy)
\
template <>
\
struct struct_member<name, i>
\
{
\
typedef BOOST_PP_TUPLE_ELEM(3, 0, xy) type;
\
static type& call(name& struct_)
\
{
\
return struct_.BOOST_PP_TUPLE_ELEM(3, 1, xy);
\
};
\
};
\
template<>
\
struct struct_assoc_member<name, BOOST_PP_TUPLE_ELEM(3, 2, xy)>
\
{
\
typedef BOOST_PP_TUPLE_ELEM(3, 0, xy) type;
\
static type& call(name& struct_)
\
{
\
return struct_.BOOST_PP_TUPLE_ELEM(3, 1, xy);
\
};
\
};
/***/
#endif
Index: extension.hpp
===================================================================
RCS file:
/cvsroot/boost/boost/boost/fusion/sequence/adapted/struct/extension.hpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- extension.hpp 2 Apr 2007 03:52:41 -0000 1.1
+++ extension.hpp 8 May 2007 22:14:58 -0000 1.2
@@ -37,6 +37,30 @@
struct struct_size<Struct const>
: struct_size<Struct>
{};
+
+ struct no_such_member;
+
+ template<typename Struct, typename Key>
+ struct struct_assoc_member
+ {
+ typedef no_such_member type;
+ };
+
+ template<typename Struct, typename Key>
+ struct struct_assoc_member<Struct const, Key>
+ {
+ typedef typename
+ add_const<typename struct_assoc_member<Struct, Key>::type>::type
+ type;
+
+ static type&
+ call(Struct const& struct_)
+ {
+ return struct_member<Struct, Key>::call(
+ const_cast<Struct&>(struct_));
+ }
+ };
+
}}}
#endif
-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
Boost-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/boost-cvs