Compare commits

...

18 Commits

Author SHA1 Message Date
4686882502 Create branches/filesystem-v3 for v2 removal
[SVN r77385]
2012-03-18 20:54:17 +00:00
df0fbd1d9d typo fix
[SVN r77114]
2012-02-25 01:09:58 +00:00
38cd16639d Fixes Ticket #6372
[SVN r76395]
2012-01-10 02:03:43 +00:00
1c51ad943a Fix for ticket #6338
[SVN r76238]
2011-12-31 05:48:27 +00:00
a25a7092d8 Patches from Tim Blechmann
[SVN r75976]
2011-12-16 00:14:49 +00:00
48e4118768 Fixes for MSVC workarounds from Freundlich: http://codepad.org/wRelwDJt
[SVN r75595]
2011-11-21 14:43:19 +00:00
0a520f6021 fix problem where sizeof(int) != sizeof(long)
[SVN r75563]
2011-11-20 10:59:09 +00:00
bbf10066bc C++11 patches by Michel Morin
[SVN r75394]
2011-11-07 22:07:05 +00:00
c2052a3c0c Fix Ticket #6067
[SVN r75318]
2011-11-04 20:37:33 +00:00
480183059e + Fixes Ticket #6016 using a two-level specialization such that specialization is preferred over SFINAE.
+ Removes tag_of_fallback. It's not needed anymore. The proper way is to specialize tag_of.

[SVN r74934]
2011-10-13 00:23:40 +00:00
fd82b51cec Wrong version. Should be 2.2 + fixed copyright notices and dates
[SVN r74886]
2011-10-10 10:37:53 +00:00
24bca52c5e Wrong version. Should be 2.2.
[SVN r74885]
2011-10-10 10:08:44 +00:00
459a1dba3d Bumped copyright date and version to 2.1 (it's about time!).
[SVN r74883]
2011-10-10 10:05:49 +00:00
10274e7884 Made map random access. Thanks to Brandon Kohn!
[SVN r74882]
2011-10-10 09:55:52 +00:00
b6df98e86c Made map random access. Thanks to Brandon Kohn!
[SVN r74881]
2011-10-10 09:55:41 +00:00
4be9e08af7 Fix for ticket #6000
[SVN r74872]
2011-10-10 00:59:32 +00:00
f46b2aeb73 Fix for ticket #6000
[SVN r74871]
2011-10-10 00:58:24 +00:00
21301c93dc Fix for ticket #6000
[SVN r74870]
2011-10-10 00:47:40 +00:00
79 changed files with 571 additions and 240 deletions

View File

@ -1,5 +1,5 @@
#==============================================================================
# Copyright (c) 2003-2007 Joel de Guzman
# Copyright (c) 2003-2011 Joel de Guzman
#
# Use, modification and distribution is subject to the Boost Software
# License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software
@ -243,7 +244,7 @@ __random_access_sequence__.
[heading Semantics]
The above macro generates the necessary code to adapt `struct_name` or an
The above macro generates the necessary code to adapt `struct_name` or an
arbitrary specialization of `struct_name` as a model of
__random_access_sequence__.
The sequence `(template_param0)(template_param1)...` declares the names of
@ -286,9 +287,9 @@ namespace qualified name of the struct to be adapted.
[section:adapt_struct_named BOOST_FUSION_ADAPT_STRUCT_NAMED]
[heading Description]
BOOST_FUSION_ADAPT_STRUCT_NAMED and BOOST_FUSION_ADAPT_STRUCT_NAMED_NS are
macros that can be used to generate all the necessary boilerplate to make an
arbitrary struct a model of __random_access_sequence__. The given struct is
BOOST_FUSION_ADAPT_STRUCT_NAMED and BOOST_FUSION_ADAPT_STRUCT_NAMED_NS are
macros that can be used to generate all the necessary boilerplate to make an
arbitrary struct a model of __random_access_sequence__. The given struct is
adapted using the given name.
[heading Synopsis]
@ -311,7 +312,7 @@ adapted using the given name.
[heading Semantics]
The above macros generate the necessary code to adapt `struct_name`
as a model of __random_access_sequence__ while using `adapted_name` as the
as a model of __random_access_sequence__ while using `adapted_name` as the
name of the adapted struct.
The sequence `(namespace0)(namespace1)...` declares the namespace
for `adapted_name`. It yields to a fully qualified name for `adapted_name` of
@ -426,7 +427,7 @@ __random_access_sequence__ and __associative_sequence__.
[heading Semantics]
The above macro generates the necessary code to adapt `struct_name` or an
The above macro generates the necessary code to adapt `struct_name` or an
arbitrary specialization of `struct_name` as a model of
__random_access_sequence__ and __associative_sequence__.
The sequence `(template_param0)(template_param1)...` declares the names of
@ -462,7 +463,7 @@ namespace qualified name of the struct to be adapted.
struct name;
struct age;
}
// Any instantiated demo::employee is now a Fusion sequence.
// It is also an associative sequence with
// keys keys::name and keys::age present.
@ -477,8 +478,8 @@ namespace qualified name of the struct to be adapted.
[section:adapt_assoc_struct_named BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED]
[heading Description]
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED and BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS are
macros that can be used to generate all the necessary boilerplate to make an
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED and BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED_NS are
macros that can be used to generate all the necessary boilerplate to make an
arbitrary struct a model of __random_access_sequence__ and
__associative_sequence__. The given struct is adapted using the given name.
@ -538,7 +539,7 @@ namespace qualified name of the struct to be converted.
struct name;
struct age;
}
// boost::fusion::adapted::adapted_employee is now a Fusion sequence
// referring to demo::employee
BOOST_FUSION_ADAPT_ASSOC_STRUCT_NAMED(
@ -566,7 +567,7 @@ __random_access_sequence__.
[heading Expression Semantics]
The above macro generates the necessary code to adapt `type_name`
as a model of __random_access_sequence__.
as a model of __random_access_sequence__.
The sequence of
[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N])]
quadruples declares the types, const types, get-expressions and set-expressions
@ -599,7 +600,7 @@ namespace qualified name of the class type to be adapted.
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
[heading Example]
namespace demo
{
@ -608,41 +609,41 @@ namespace qualified name of the class type to be adapted.
private:
std::string name;
int age;
public:
void set_name(std::string const& n)
{
name=n;
}
void set_age(int a)
{
age=a;
}
std::string const& get_name()const
{
return name;
}
int get_age()const
{
return age;
}
};
}
BOOST_FUSION_ADAPT_ADT(
demo::employee,
(std::string const&, std::string const&, obj.get_name(), obj.set_name(val))
(int, int, obj.get_age(), obj.set_age(val)))
demo::employee e;
front(e)="Edward Norton";
back(e)=41;
//Prints 'Edward Norton is 41 years old'
std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;
[heading See also]
__adt_attribute_proxy__
@ -669,7 +670,7 @@ __random_access_sequence__.
The above macro generates the necessary code to adapt `type_name`
or an arbitrary specialization of `type_name`
as a model of __random_access_sequence__.
as a model of __random_access_sequence__.
The sequence `(template_param0)(template_param1)...` declares the names of
the template type parameters used.
The sequence `(specialization_param0)(specialization_param1)...`
@ -707,40 +708,40 @@ namespace qualified name of the template class type to be adapted.
#include <boost/fusion/adapted/adt/adapt_adt.hpp>
#include <boost/fusion/include/adapt_adt.hpp>
[heading Example]
namespace demo
{
{
template<typename Name, typename Age>
struct employee
{
private:
Name name;
Age age;
public:
void set_name(Name const& n)
{
name=n;
}
void set_age(Age const& a)
{
age=a;
}
Name const& get_name()const
{
return name;
}
Age const& get_age()const
{
return age;
}
};
}
BOOST_FUSION_ADAPT_TPL_ADT(
(Name)(Age),
(demo::employee) (Name)(Age),
@ -752,7 +753,7 @@ namespace qualified name of the template class type to be adapted.
boost::fusion::back(e)=41;
//Prints 'Edward Norton is 41 years old'
std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;
[heading See also]
__adt_attribute_proxy__
@ -777,7 +778,7 @@ __random_access_sequence__ and __associative_sequence__.
[heading Expression Semantics]
The above macro generates the necessary code to adapt `type_name`
as a model of __random_access_sequence__ and __associative_sequence__.
as a model of __random_access_sequence__ and __associative_sequence__.
The sequence of
[^(attribute_type['N], attribute_const_type['N], get_expr['N], set_expr['N], key_type['N])]
5-tuples declares the types, const types, get-expressions, set-expressions and key types
@ -799,7 +800,7 @@ The actual return type of fusion's intrinsic sequence access (meta-)functions
when in invoked with (an instance of) `type_name` is a proxy type.
This type is implicitly convertible to the attribute type via [^get_expr['N]] and
forwards assignment to the underlying element via [^set_expr['N]].
The value type (that is the type returned by __result_of_value_of__, __result_of_value_of_data__,
The value type (that is the type returned by __result_of_value_of__, __result_of_value_of_data__,
__result_of_value_at__, __result_of_value_at_c__ and __result_of_value_at_key__) of the ['N]th element
is [^attribute_type['N]] with const-qualifier and reference removed.
@ -810,7 +811,7 @@ namespace qualified name of the class type to be adapted.
#include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp>
#include <boost/fusion/include/adapt_assoc_adt.hpp>
[heading Example]
namespace demo
{
@ -819,47 +820,47 @@ namespace qualified name of the class type to be adapted.
private:
std::string name;
int age;
public:
void set_name(std::string const& n)
{
name=n;
}
void set_age(int a)
{
age=a;
}
std::string const& get_name()const
{
return name;
}
int get_age()const
{
return age;
}
};
}
namespace keys
{
struct name;
struct age;
}
BOOST_FUSION_ADAPT_ASSOC_ADT(
demo::employee,
(std::string const&, std::string const&, obj.get_name(), obj.set_name(val), keys::name)
(int, int, obj.get_age(), obj.set_age(val), keys::age))
demo::employee e;
at_key<keys::name>(e)="Edward Norton";
at_key<keys::age>(e)=41;
//Prints 'Edward Norton is 41 years old'
std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;
[heading See also]
__adt_attribute_proxy__
@ -886,7 +887,7 @@ __random_access_sequence__ and __associative_sequence__.
The above macro generates the necessary code to adapt `type_name`
or an arbitrary specialization of `type_name`
as a model of __random_access_sequence__ and __associative_sequence__.
as a model of __random_access_sequence__ and __associative_sequence__.
The sequence `(template_param0)(template_param1)...` declares the names of
the template type parameters used.
The sequence `(specialization_param0)(specialization_param1)...`
@ -913,7 +914,7 @@ The actual return type of fusion's intrinsic sequence access (meta-)functions
when in invoked with (an instance of) `type_name` is a proxy type.
This type is implicitly convertible to the attribute type via [^get_expr['N]] and
forwards assignment to the underlying element via [^set_expr['N]].
The value type (that is the type returned by __result_of_value_of__, __result_of_value_of_data__,
The value type (that is the type returned by __result_of_value_of__, __result_of_value_of_data__,
__result_of_value_at__, __result_of_value_at_c__ and __result_of_value_at_key__) of the ['N]th element
is [^attribute_type['N]] with const-qualifier and reference removed.
@ -924,7 +925,7 @@ namespace qualified name of the template class type to be adapted.
#include <boost/fusion/adapted/adt/adapt_assoc_adt.hpp>
#include <boost/fusion/include/adapt_assoc_adt.hpp>
[heading Example]
namespace demo
{
@ -934,48 +935,48 @@ namespace qualified name of the template class type to be adapted.
private:
Name name;
Age age;
public:
void set_name(Name const& n)
{
name=n;
}
void set_age(Age const& a)
{
age=a;
}
Name const& get_name()const
{
return name;
}
Age const& get_age()const
{
return age;
}
};
}
namespace keys
{
struct name;
struct age;
}
BOOST_FUSION_ADAPT_ASSOC_TPL_ADT(
(Name)(Age),
(demo::employee) (Name)(Age),
(Name const&, Name const&, obj.get_name(), obj.set_name(val), keys::name)
(Age const&, Age const&, obj.get_age(), obj.set_age(val), keys::age))
demo::employee<std::string, int> e;
at_key<keys::name>(e)="Edward Norton";
at_key<keys::age>(e)=41;
//Prints 'Edward Norton is 41 years old'
std::cout << e.get_name() << " is " << e.get_age() << " years old" << std::endl;
[heading See also]
__adt_attribute_proxy__
@ -1027,14 +1028,14 @@ defined in __random_access_sequence__.
[[`struct_name(e0, e1,... en)`] [Creates an instance of `struct_name` with elements `e0`...`en`.]]
[[`struct_name(fs)`] [Copy constructs an instance of `struct_name` from a __forward_sequence__ `fs`.]]
[[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
]
[heading Header]
#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <boost/fusion/include/define_struct.hpp>
[heading Example]
// demo::employee is a Fusion sequence
@ -1096,14 +1097,14 @@ defined in __random_access_sequence__.
[[`Str(e0, e1,... en)`] [Creates an instance of `Str` with elements `e0`...`en`.]]
[[`Str(fs)`] [Copy constructs an instance of `Str` from a __forward_sequence__ `fs`.]]
[[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
]
[heading Header]
#include <boost/fusion/adapted/struct/define_struct.hpp>
#include <boost/fusion/include/define_struct.hpp>
[heading Example]
// Any instantiated demo::employee is a Fusion sequence
@ -1161,14 +1162,14 @@ defined in __random_access_sequence__ and __associative_sequence__.
[[`struct_name(e0, e1,... en)`] [Creates an instance of `struct_name` with elements `e0`...`en`.]]
[[`struct_name(fs)`] [Copy constructs an instance of `struct_name` from a __forward_sequence__ `fs`.]]
[[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
]
[heading Header]
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp>
#include <boost/fusion/include/define_assoc_struct.hpp>
[heading Example]
namespace keys
@ -1176,7 +1177,7 @@ defined in __random_access_sequence__ and __associative_sequence__.
struct name;
struct age;
}
// demo::employee is a Fusion sequence
BOOST_FUSION_DEFINE_ASSOC_STRUCT(
(demo), employee,
@ -1237,14 +1238,14 @@ defined in __random_access_sequence__ and __associative_sequence__.
[[`Str(e0, e1,... en)`] [Creates an instance of `Str` with elements `e0`...`en`.]]
[[`Str(fs)`] [Copy constructs an instance of `Str` from a __forward_sequence__ `fs`.]]
[[`str = fs`] [Assigns from a __forward_sequence__ `fs`.]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
[[`str.member_nameN`] [Access of struct member `member_nameN`]]
]
[heading Header]
#include <boost/fusion/adapted/struct/define_assoc_struct.hpp>
#include <boost/fusion/include/define_assoc_struct.hpp>
[heading Example]
namespace keys
@ -1252,7 +1253,7 @@ defined in __random_access_sequence__ and __associative_sequence__.
struct name;
struct age;
}
// Any instantiated demo::employee is a Fusion sequence
BOOST_FUSION_DEFINE_ASSOC_TPL_STRUCT(
(Name)(Age), (demo), employee,

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software

View File

@ -1,5 +1,7 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2006 Tobias Schwinger
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software
@ -37,6 +39,11 @@ This section summarizes significant changes to the Fusion library.
(Christopher Schmidt)
* October 7, 2010: Added __adapt_adt__, __adapt_tpl_adt__,
__adapt_assoc_adt__ and __adapt_assoc_tpl_adt__ (Joel de Guzman,
Hartmut Kaiser and Christopher Schmidt)
Hartmut Kaiser and Christopher Schmidt)
* August 29, 2011: Added support for segmented sequences and iterators (Eric Niebler)
* September 16, 2011: Added preprocessed files (using wave) to speed up
compilation (Joel de Guzman)
* October 8, 2011: Added adaptor for std::tuple (Joel de Guzman)
* October 10, 2011: Made map random access (Brandon Kohn)
[endsect]

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@ -419,7 +420,7 @@ including any Fusion header to change the default. Example:
[heading Model of]
* __associative_sequence__
* __forward_sequence__
* __random_access_sequence__
[variablelist Notation
[[`M`] [A `map` type]]
@ -431,7 +432,7 @@ including any Fusion header to change the default. Example:
[heading Expression Semantics]
Semantics of an expression is defined only where it differs from, or is not
defined in __random_access_sequence__ and __associative_sequence__.
defined in __forward_sequence__ and __associative_sequence__.
[table
[[Expression] [Semantics]]
@ -681,7 +682,7 @@ Create a __map__ from one or more key/data pairs.
, typename T0, typename T1,... typename TN>
typename __result_of_make_map__<K0, K0,... KN, T0, T1,... TN>::type
make_map(T0 const& x0, T1 const& x1... TN const& xN);
The variadic function accepts `0` to `FUSION_MAX_MAP_SIZE` elements,
where `FUSION_MAX_MAP_SIZE` is a user definable predefined maximum that
defaults to `10`. You may define the preprocessor constant
@ -1038,8 +1039,8 @@ rules for __element_conversion__.
[heading Header]
#include <boost/fusion/container/generation/make_list.hpp>
#include <boost/fusion/include/make_list.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
#include <boost/fusion/include/make_vector.hpp>
[heading Example]

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,5 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2006 Tobias Schwinger
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@ -66,9 +66,9 @@ function objects to accept arbitrary calls. In other words, an unary function
object can be implemented instead of (maybe heavily overloaded) function
templates or function call operators.
The library provides both a strictly typed and a generic variant for this
The library provides both a strictly typed and a generic variant for this
transformation. The latter should be used in combination with
__boost_func_forward__ to attack __the_forwarding_problem__.
__boost_func_forward__ to attack __the_forwarding_problem__.
Both variants have a corresponding generator function template that returns an
adapter instance for the given argument.
@ -546,7 +546,7 @@ Returns the result type of __invoke_function_object__.
[heading Macros]
The following macros can be defined to change the maximum arity.
The following macros can be defined to change the maximum arity.
The default is 6.
* BOOST_FUSION_INVOKE_MAX_ARITY
@ -1060,7 +1060,7 @@ signature is optimized automatically to avoid by-value parameters.]
[heading Macros]
The following macros can be defined to change the maximum arity.
The following macros can be defined to change the maximum arity.
The value used for these macros must not exceed `FUSION_MAX_VECTOR_SIZE`.
The default is 6.

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software
@ -8,9 +9,9 @@
===============================================================================/]
[library Fusion
[quickbook 1.3]
[version 2.0]
[version 2.2]
[authors [de Guzman, Joel], [Marsden, Dan], [Schwinger, Tobias]]
[copyright 2001 2002 2003 2004 2005 2006 2007 Joel de Guzman, Dan Marsden, Tobias Schwinger]
[copyright 2001 2002 2003 2004 2005 2006 2011 Joel de Guzman, Dan Marsden, Tobias Schwinger]
[purpose Statically Typed Heterogeneous Data Structures and Algorithms]
[license
Distributed under the Boost Software License, Version 1.0.

0
doc/html/images/alert.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 603 B

After

Width:  |  Height:  |  Size: 603 B

0
doc/html/images/home.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 358 B

After

Width:  |  Height:  |  Size: 358 B

0
doc/html/images/next.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 336 B

After

Width:  |  Height:  |  Size: 336 B

0
doc/html/images/note.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 658 B

After

Width:  |  Height:  |  Size: 658 B

0
doc/html/images/prev.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 334 B

After

Width:  |  Height:  |  Size: 334 B

0
doc/html/images/smiley.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 867 B

After

Width:  |  Height:  |  Size: 867 B

0
doc/html/images/tip.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 640 B

After

Width:  |  Height:  |  Size: 640 B

0
doc/html/images/up.png Executable file → Normal file
View File

Before

Width:  |  Height:  |  Size: 370 B

After

Width:  |  Height:  |  Size: 370 B

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@ -160,6 +161,7 @@ the following invariants always hold:
* __std_pair__ iterator
* __boost_array__ iterator
* __vector__ iterator
* __map__ iterator
* __single_view__ iterator
* __iterator_range__ (where adapted sequence is a __bidirectional_sequence__)
* __transform_view__ (where adapted sequence is a __bidirectional_sequence__)
@ -205,6 +207,7 @@ the following expressions must be valid:
[heading Models]
* __vector__ iterator
* __map__ iterator
* __std_pair__ iterator
* __boost_array__ iterator
* __single_view__ iterator
@ -992,9 +995,9 @@ Returns the key type associated with the element referenced by an associative it
[heading Example]
typedef __map__<__pair__<float,int> > vec;
typedef __result_of_begin__<vec>::type first;
BOOST_MPL_ASSERT((boost::is_same<__result_of_key_of__<first>::type, float>));
[endsect]
[section value_of_data]
@ -1031,9 +1034,9 @@ Returns the type of the data property associated with the element referenced by
[heading Example]
typedef __map__<__pair__<float,int> > vec;
typedef __result_of_begin__<vec>::type first;
BOOST_MPL_ASSERT((boost::is_same<__result_of_value_of_data__<first>::type, int>));
[endsect]
[section deref_data]

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Copyright (C) 2010 Christopher Schmidt
Use, modification and distribution is subject to the Boost Software
@ -167,7 +168,7 @@ and __deref_data__) is a proxy type, an instance of
has three template arguments:
namespace boost { namespace fusion { namespace extension
{
{
template<
typename Type
, int Index
@ -175,14 +176,14 @@ has three template arguments:
>
struct adt_attribute_proxy;
}}}
When adapting a class type, `adt_attribute_proxy` is specialized for every
element of the adapted sequence, with `Type` being the class type that is
adapted, `Index` the 0-based indices of the elements, and `Const` both `true`
and `false`. The return type of fusion's intrinsic sequence access functions
for the ['N]th element of an adapted class type `type_name` is
[^adt_attribute_proxy<type_name, ['N], ['Const]>], with [^['Const]] being `true`
for constant instances of `type_name` and `false` for non-constant ones.
for constant instances of `type_name` and `false` for non-constant ones.
[variablelist Notation
[[`type_name`]
@ -204,7 +205,7 @@ for constant instances of `type_name` and `false` for non-constant ones.
]
[*Expression Semantics]
[table
[[Expression] [Semantics]]
[[[^proxy_type['N](inst)]] [Creates an instance of [^proxy_type['N]] with underlying object `inst`]]

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@ -188,6 +189,7 @@ are not defined in __forward_sequence__.
* __std_pair__
* __boost_array__
* __vector__
* __map__
* __reverse_view__
* __single_view__
* __iterator_range__ (where adapted sequence is a Bidirectional Sequence)
@ -264,6 +266,7 @@ are not defined in __bidirectional_sequence__.
* __std_pair__
* __boost_array__
* __vector__
* __map__
* __reverse_view__
* __single_view__
* __iterator_range__ (where adapted sequence is a Random Access Sequence)

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at

View File

@ -1,5 +1,6 @@
[/==============================================================================
Copyright (C) 2001-2007 Joel de Guzman, Dan Marsden, Tobias Schwinger
Copyright (C) 2001-2011 Joel de Guzman
Copyright (C) 2006 Dan Marsden
Use, modification and distribution is subject to the Boost Software
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
@ -482,7 +483,7 @@ defined in the implemented models.
[heading Description]
`nview` presents a view which iterates over a given __sequence__ in a specified order.
`nview` presents a view which iterates over a given __sequence__ in a specified order.
An `nview` is constructed from an arbitrary __sequence__ and a list of indicies specifying
the elements to iterate over.
@ -506,15 +507,15 @@ the elements to iterate over.
[[Parameter] [Description] [Default]]
[[`Sequence`] [An arbitrary Fusion __forward_sequence__]
[]]
[[`Indicies`] [A `mpl::vector_c<int, ...>` holding the indicies defining
[[`Indicies`] [A `mpl::vector_c<int, ...>` holding the indicies defining
the required iteration order.] []]
[[`I1`, `I2`, `I3`...] [A list of integers specifying the required
[[`I1`, `I2`, `I3`...] [A list of integers specifying the required
iteration order.] [`INT_MAX` for `I2`, `I3`...]]
]
[heading Model of]
* __random_access_sequence__ (see __traversal_concept__)
* __random_access_sequence__ (see __traversal_concept__)
[variablelist Notation
[[`NV`] [A `nview` type]]

View File

@ -78,6 +78,51 @@ namespace boost { namespace fusion
, mpl::int_<(Last::is_last?1:0)>
>::type
{};
template <typename Iterator, bool IsLast_>
struct prior_impl
{
typedef typename Iterator::iterator_base_type base_type;
typedef typename
result_of::prior<base_type>::type
base_prior;
typedef pop_back_iterator<base_prior, false> type;
static type
call(Iterator const& i)
{
return type(fusion::prior(i.iterator_base));
}
};
template <typename Iterator>
struct prior_impl<Iterator, true>
{
// If this is the last iterator, we'll have to double back
typedef typename Iterator::iterator_base_type base_type;
typedef typename
result_of::prior<
typename result_of::prior<base_type>::type
>::type
base_prior;
typedef pop_back_iterator<base_prior, false> type;
static type
call(Iterator const& i)
{
return type(fusion::prior(
fusion::prior(i.iterator_base)));
}
};
template <typename Iterator>
struct prior : prior_impl<Iterator, Iterator::is_last>
{};
};
namespace result_of

View File

@ -88,7 +88,7 @@ namespace boost { namespace fusion
template <typename Sequence>
cons(
Sequence const& seq
, typename disable_if<
, typename boost::disable_if<
mpl::or_<
is_convertible<Sequence, cons> // use copy ctor instead
, is_convertible<Sequence, Car> // use copy to car instead
@ -119,7 +119,7 @@ namespace boost { namespace fusion
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, Car>, cons&>::type
typename boost::disable_if<is_convertible<Sequence, Car>, cons&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type Iterator;

View File

@ -0,0 +1,57 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2011 Brandon Kohn
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_MAP_DETAIL_AT_IMPL_HPP)
#define BOOST_FUSION_MAP_DETAIL_AT_IMPL_HPP
#include <boost/fusion/support/detail/access.hpp>
#include <boost/type_traits/is_const.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/int.hpp>
namespace boost { namespace fusion
{
struct map_tag;
namespace extension
{
template <typename Tag>
struct at_impl;
template <>
struct at_impl<map_tag>
{
template <typename Sequence, typename N>
struct apply
{
typedef mpl::at<typename Sequence::storage_type::types, N> element;
typedef typename detail::ref_result<element>::type type;
static type
call(Sequence& m)
{
return m.get_data().at_impl(N());
}
};
template <typename Sequence, typename N>
struct apply <Sequence const, N>
{
typedef mpl::at<typename Sequence::storage_type::types, N> element;
typedef typename detail::cref_result<element>::type type;
static type
call(Sequence const& m)
{
return m.get_data().at_impl(N());
}
};
};
}
}}
#endif //BOOST_FUSION_MAP_DETAIL_AT_IMPL_HPP

View File

@ -13,7 +13,7 @@ namespace boost { namespace fusion
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9>
struct map : sequence_base<map<T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9> >
{
struct category : forward_traversal_tag, associative_tag {};
struct category : random_access_traversal_tag, associative_tag {};
typedef map_tag fusion_tag;
typedef fusion_sequence_tag tag;
typedef mpl::false_ is_view;

View File

@ -13,7 +13,7 @@ namespace boost { namespace fusion
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19>
struct map : sequence_base<map<T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19> >
{
struct category : forward_traversal_tag, associative_tag {};
struct category : random_access_traversal_tag, associative_tag {};
typedef map_tag fusion_tag;
typedef fusion_sequence_tag tag;
typedef mpl::false_ is_view;

View File

@ -13,7 +13,7 @@ namespace boost { namespace fusion
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29>
struct map : sequence_base<map<T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29> >
{
struct category : forward_traversal_tag, associative_tag {};
struct category : random_access_traversal_tag, associative_tag {};
typedef map_tag fusion_tag;
typedef fusion_sequence_tag tag;
typedef mpl::false_ is_view;

View File

@ -13,7 +13,7 @@ namespace boost { namespace fusion
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39>
struct map : sequence_base<map<T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39> >
{
struct category : forward_traversal_tag, associative_tag {};
struct category : random_access_traversal_tag, associative_tag {};
typedef map_tag fusion_tag;
typedef fusion_sequence_tag tag;
typedef mpl::false_ is_view;

View File

@ -13,7 +13,7 @@ namespace boost { namespace fusion
template <typename T0 , typename T1 , typename T2 , typename T3 , typename T4 , typename T5 , typename T6 , typename T7 , typename T8 , typename T9 , typename T10 , typename T11 , typename T12 , typename T13 , typename T14 , typename T15 , typename T16 , typename T17 , typename T18 , typename T19 , typename T20 , typename T21 , typename T22 , typename T23 , typename T24 , typename T25 , typename T26 , typename T27 , typename T28 , typename T29 , typename T30 , typename T31 , typename T32 , typename T33 , typename T34 , typename T35 , typename T36 , typename T37 , typename T38 , typename T39 , typename T40 , typename T41 , typename T42 , typename T43 , typename T44 , typename T45 , typename T46 , typename T47 , typename T48 , typename T49>
struct map : sequence_base<map<T0 , T1 , T2 , T3 , T4 , T5 , T6 , T7 , T8 , T9 , T10 , T11 , T12 , T13 , T14 , T15 , T16 , T17 , T18 , T19 , T20 , T21 , T22 , T23 , T24 , T25 , T26 , T27 , T28 , T29 , T30 , T31 , T32 , T33 , T34 , T35 , T36 , T37 , T38 , T39 , T40 , T41 , T42 , T43 , T44 , T45 , T46 , T47 , T48 , T49> >
{
struct category : forward_traversal_tag, associative_tag {};
struct category : random_access_traversal_tag, associative_tag {};
typedef map_tag fusion_tag;
typedef fusion_sequence_tag tag;
typedef mpl::false_ is_view;

View File

@ -0,0 +1,34 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2011 Brandon Kohn
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_MAP_DETAIL_VALUE_AT_IMPL_HPP)
#define BOOST_FUSION_MAP_DETAIL_VALUE_AT_IMPL_HPP
#include <boost/mpl/at.hpp>
namespace boost { namespace fusion
{
struct map_tag;
namespace extension
{
template <typename Tag>
struct value_at_impl;
template <>
struct value_at_impl<map_tag>
{
template <typename Sequence, typename N>
struct apply
{
typedef typename mpl::at<typename Sequence::storage_type::types, N>::type type;
};
};
}
}}
#endif //BOOST_FUSION_MAP_DETAIL_VALUE_AT_IMPL_HPP

View File

@ -11,6 +11,8 @@
#include <boost/fusion/support/category_of.hpp>
#include <boost/fusion/support/detail/access.hpp>
#include <boost/fusion/container/map/map_fwd.hpp>
#include <boost/fusion/container/map/detail/at_impl.hpp>
#include <boost/fusion/container/map/detail/value_at_impl.hpp>
#include <boost/fusion/container/map/detail/begin_impl.hpp>
#include <boost/fusion/container/map/detail/end_impl.hpp>
#include <boost/fusion/container/map/detail/value_of_impl.hpp>
@ -50,7 +52,7 @@ namespace boost { namespace fusion
template <BOOST_PP_ENUM_PARAMS(FUSION_MAX_MAP_SIZE, typename T)>
struct map : sequence_base<map<BOOST_PP_ENUM_PARAMS(FUSION_MAX_MAP_SIZE, T)> >
{
struct category : forward_traversal_tag, associative_tag {};
struct category : random_access_traversal_tag, associative_tag {};
typedef map_tag fusion_tag;
typedef fusion_sequence_tag tag; // this gets picked up by MPL

View File

@ -61,7 +61,7 @@ namespace boost { namespace fusion
template <typename Sequence>
vector1(
Sequence const& seq
, typename disable_if<is_convertible<Sequence, T0> >::type* = 0
, typename boost::disable_if<is_convertible<Sequence, T0> >::type* = 0
)
: base_type(base_type::init_from_sequence(seq)) {}
template <typename U0>
@ -72,7 +72,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -157,7 +157,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -242,7 +242,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -327,7 +327,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -412,7 +412,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -497,7 +497,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -582,7 +582,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -667,7 +667,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -752,7 +752,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -837,7 +837,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;

View File

@ -73,7 +73,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -158,7 +158,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -243,7 +243,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -328,7 +328,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -413,7 +413,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -498,7 +498,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -583,7 +583,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -668,7 +668,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -753,7 +753,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -838,7 +838,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;

View File

@ -73,7 +73,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -158,7 +158,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -243,7 +243,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -328,7 +328,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -413,7 +413,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -498,7 +498,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -583,7 +583,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -668,7 +668,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -753,7 +753,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -838,7 +838,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;

View File

@ -73,7 +73,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -158,7 +158,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -243,7 +243,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -328,7 +328,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -413,7 +413,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -498,7 +498,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -583,7 +583,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -668,7 +668,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -753,7 +753,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -838,7 +838,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;

View File

@ -73,7 +73,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -158,7 +158,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -243,7 +243,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -328,7 +328,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -413,7 +413,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -498,7 +498,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -583,7 +583,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -668,7 +668,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -753,7 +753,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;
@ -838,7 +838,7 @@ namespace boost { namespace fusion
return *this;
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;

View File

@ -36,7 +36,7 @@ namespace boost { namespace fusion
: vec(rhs.vec) {}
template <typename Sequence>
vector(Sequence const& rhs)
: vec(rhs) {}
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
@ -116,6 +116,7 @@ namespace boost { namespace fusion
return vec.at_impl(mpl::int_<I::value>());
}
private:
BOOST_FUSION_VECTOR_CTOR_HELPER()
vector_n vec;
};
}}

View File

@ -36,7 +36,7 @@ namespace boost { namespace fusion
: vec(rhs.vec) {}
template <typename Sequence>
vector(Sequence const& rhs)
: vec(rhs) {}
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
@ -136,6 +136,7 @@ namespace boost { namespace fusion
return vec.at_impl(mpl::int_<I::value>());
}
private:
BOOST_FUSION_VECTOR_CTOR_HELPER()
vector_n vec;
};
}}

View File

@ -36,7 +36,7 @@ namespace boost { namespace fusion
: vec(rhs.vec) {}
template <typename Sequence>
vector(Sequence const& rhs)
: vec(rhs) {}
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
@ -156,6 +156,7 @@ namespace boost { namespace fusion
return vec.at_impl(mpl::int_<I::value>());
}
private:
BOOST_FUSION_VECTOR_CTOR_HELPER()
vector_n vec;
};
}}

View File

@ -36,7 +36,7 @@ namespace boost { namespace fusion
: vec(rhs.vec) {}
template <typename Sequence>
vector(Sequence const& rhs)
: vec(rhs) {}
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
@ -176,6 +176,7 @@ namespace boost { namespace fusion
return vec.at_impl(mpl::int_<I::value>());
}
private:
BOOST_FUSION_VECTOR_CTOR_HELPER()
vector_n vec;
};
}}

View File

@ -36,7 +36,7 @@ namespace boost { namespace fusion
: vec(rhs.vec) {}
template <typename Sequence>
vector(Sequence const& rhs)
: vec(rhs) {}
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
@ -196,6 +196,7 @@ namespace boost { namespace fusion
return vec.at_impl(mpl::int_<I::value>());
}
private:
BOOST_FUSION_VECTOR_CTOR_HELPER()
vector_n vec;
};
}}

View File

@ -104,7 +104,7 @@
BOOST_PP_CAT(vector, N)(
Sequence const& seq
#if (N == 1)
, typename disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0
, typename boost::disable_if<is_convertible<Sequence, T0> >::type* /*dummy*/ = 0
#endif
)
: base_type(base_type::init_from_sequence(seq)) {}
@ -118,7 +118,7 @@
}
template <typename Sequence>
typename disable_if<is_convertible<Sequence, T0>, this_type&>::type
typename boost::disable_if<is_convertible<Sequence, T0>, this_type&>::type
operator=(Sequence const& seq)
{
typedef typename result_of::begin<Sequence const>::type I0;

View File

@ -17,6 +17,38 @@
#include <boost/type_traits/is_base_of.hpp>
#include <boost/detail/workaround.hpp>
#if !defined(__WAVE__)
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
#define BOOST_FUSION_VECTOR_COPY_INIT() \
ctor_helper(rhs, is_base_of<vector, Sequence>()) \
#define BOOST_FUSION_VECTOR_CTOR_HELPER() \
static vector_n const& \
ctor_helper(vector const& rhs, mpl::true_) \
{ \
return rhs.vec; \
} \
\
template <typename T> \
static T const& \
ctor_helper(T const& rhs, mpl::false_) \
{ \
return rhs; \
}
#else
#define BOOST_FUSION_VECTOR_COPY_INIT() \
rhs \
#define BOOST_FUSION_VECTOR_CTOR_HELPER()
#endif
#endif // !defined(__WAVE__)
#if !defined(BOOST_FUSION_DONT_USE_PREPROCESSED_FILES)
#include <boost/fusion/container/vector/detail/preprocessed/vector.hpp>
#else
@ -76,11 +108,7 @@ namespace boost { namespace fusion
template <typename Sequence>
vector(Sequence const& rhs)
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
: vec(ctor_helper(rhs, is_base_of<vector, Sequence>())) {}
#else
: vec(rhs) {}
#endif
: vec(BOOST_FUSION_VECTOR_COPY_INIT()) {}
// Expand a couple of forwarding constructors for arguments
// of type (T0), (T0, T1), (T0, T1, T2) etc. Example:
@ -149,21 +177,7 @@ namespace boost { namespace fusion
private:
#if BOOST_WORKAROUND(BOOST_MSVC, <= 1600)
static vector_n const&
ctor_helper(vector const& rhs, mpl::true_)
{
return rhs.vec;
}
template <typename T>
static T const&
ctor_helper(T const& rhs, mpl::false_)
{
return rhs;
}
#endif
BOOST_FUSION_VECTOR_CTOR_HELPER()
vector_n vec;
};
}}

0
include/boost/fusion/functional/adapter/unfused.hpp Executable file → Normal file
View File

View File

@ -74,7 +74,7 @@ namespace boost { namespace fusion
{
template <typename Iter1, typename Iter2>
inline typename
enable_if<
boost::enable_if<
mpl::and_<is_fusion_iterator<Iter1>, is_fusion_iterator<Iter2> >
, bool
>::type
@ -85,7 +85,7 @@ namespace boost { namespace fusion
template <typename Iter1, typename Iter2>
inline typename
enable_if<
boost::enable_if<
mpl::and_<is_fusion_iterator<Iter1>, is_fusion_iterator<Iter2> >
, bool
>::type

View File

@ -37,7 +37,7 @@ namespace boost { namespace fusion
{
template <typename Seq1, typename Seq2>
inline typename
enable_if<
boost::enable_if<
traits::enable_equality<Seq1, Seq2>
, bool
>::type

View File

@ -37,7 +37,7 @@ namespace boost { namespace fusion
{
template <typename Seq1, typename Seq2>
inline typename
enable_if<
boost::enable_if<
traits::enable_comparison<Seq1, Seq2>
, bool
>::type

View File

@ -37,7 +37,7 @@ namespace boost { namespace fusion
{
template <typename Seq1, typename Seq2>
inline typename
enable_if<
boost::enable_if<
traits::enable_comparison<Seq1, Seq2>
, bool
>::type

View File

@ -28,7 +28,7 @@ namespace boost { namespace fusion
{
template <typename Seq1, typename Seq2>
inline typename
enable_if<
boost::enable_if<
traits::enable_comparison<Seq1, Seq2>
, bool
>::type

View File

@ -65,7 +65,7 @@ namespace boost { namespace fusion
template <typename Seq1, typename Seq2>
inline typename
enable_if<
boost::enable_if<
traits::enable_comparison<Seq1, Seq2>
, bool
>::type

View File

@ -40,7 +40,7 @@ namespace boost { namespace fusion
{
template <typename Seq1, typename Seq2>
inline typename
enable_if<
boost::enable_if<
traits::enable_equality<Seq1, Seq2>
, bool
>::type

View File

@ -27,7 +27,7 @@ namespace boost { namespace fusion
{
template <typename Sequence>
inline typename
enable_if<
boost::enable_if<
fusion::traits::is_sequence<Sequence>
, std::istream&
>::type

View File

@ -29,7 +29,7 @@ namespace boost { namespace fusion
{
template <typename Sequence>
inline typename
enable_if<
boost::enable_if<
fusion::traits::is_sequence<Sequence>
, std::ostream&
>::type

View File

@ -12,6 +12,7 @@
#include <boost/fusion/support/deduce.hpp>
#include <boost/fusion/container/vector/convert.hpp>
#include <boost/fusion/view/transform_view.hpp>
#include <boost/config.hpp>
namespace boost { namespace fusion { namespace traits
@ -29,6 +30,13 @@ namespace boost { namespace fusion { namespace traits
struct result< Self(T) >
: fusion::traits::deduce<T>
{ };
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_RVALUE_REFERENCES
template <typename T>
typename result< deducer(T) >::type
operator()(T&&) const;
#endif
};
}

View File

@ -46,28 +46,29 @@ namespace boost { namespace fusion
namespace detail
{
BOOST_MPL_HAS_XXX_TRAIT_DEF(fusion_tag)
template <typename Sequence, typename Active>
struct tag_of_impl
: mpl::if_<fusion::detail::is_mpl_sequence<Sequence>,
mpl::identity<mpl_sequence_tag>,
mpl::identity<non_fusion_tag> >::type
{};
template <typename Sequence>
struct tag_of_impl<
Sequence
, typename boost::enable_if<detail::has_fusion_tag<Sequence> >::type>
{
typedef typename Sequence::fusion_tag type;
};
}
namespace traits
{
template <typename Sequence, typename Active>
struct tag_of_fallback
{
typedef non_fusion_tag type;
};
template <typename Sequence, typename Active>
struct tag_of
: mpl::if_< fusion::detail::is_mpl_sequence<Sequence>,
mpl::identity<mpl_sequence_tag>,
tag_of_fallback<Sequence> >::type
: boost::fusion::detail::tag_of_impl<Sequence, Active>
{};
template <typename Sequence>
struct tag_of<Sequence, typename boost::enable_if<detail::has_fusion_tag<Sequence> >::type>
{
typedef typename Sequence::fusion_tag type;
};
}
namespace detail

View File

@ -12,9 +12,6 @@ namespace boost { namespace fusion
{
namespace traits
{
template <typename Sequence, typename Active = void>
struct tag_of_fallback;
template<typename T, typename Active = void>
struct tag_of;
}

View File

@ -8,6 +8,7 @@
#if !defined(FUSION_STRICTEST_TRAVERSAL_20060123_2101)
#define FUSION_STRICTEST_TRAVERSAL_20060123_2101
#include <boost/config.hpp>
#include <boost/mpl/or.hpp>
#include <boost/mpl/if.hpp>
#include <boost/fusion/support/category_of.hpp>
@ -53,6 +54,13 @@ namespace boost { namespace fusion
typedef typename stricter_traversal<tag1,tag2>::type type;
};
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_RVALUE_REFERENCES
template<typename StrictestSoFar, typename Next>
typename result<strictest_traversal_impl(StrictestSoFar, Next)>::type
operator()(StrictestSoFar&&, Next&&) const;
#endif
};
template<typename Sequence>

View File

@ -33,7 +33,7 @@ namespace boost { namespace fusion
static type
call(Seq& s)
{
return * advance<N>(s.first);
return * fusion::advance<N>(s.first);
}
};
};

View File

@ -29,11 +29,28 @@
// - All other ranges point to ranges
// - The front of each range in the stack (besides the
// topmost) is the range above it
namespace boost { namespace fusion
{
template <typename First, typename Last>
struct iterator_range;
namespace result_of
{
template <typename Sequence, typename T>
struct push_back;
template <typename Sequence, typename T>
struct push_front;
}
template <typename Sequence, typename T>
typename result_of::push_back<Sequence const, T>::type
push_back(Sequence const& seq, T const& x);
template <typename Sequence, typename T>
typename result_of::push_front<Sequence const, T>::type
push_front(Sequence const& seq, T const& x);
}}
namespace boost { namespace fusion { namespace detail
@ -117,7 +134,7 @@ namespace boost { namespace fusion { namespace detail
segment_sequence<
typename result_of::push_front<
rest_type const
, typename recurse::type
, typename recurse::type
>::type
>
type;
@ -184,7 +201,7 @@ namespace boost { namespace fusion { namespace detail
{
return stack.cdr;
}
};
};
//auto make_segment_sequence_back(stack_end)
//{
@ -260,7 +277,7 @@ namespace boost { namespace fusion { namespace detail
segment_sequence<
typename result_of::push_back<
rest_type const
, typename recurse::type
, typename recurse::type
>::type
>
type;
@ -328,7 +345,7 @@ namespace boost { namespace fusion { namespace detail
return stack.cdr;
}
};
//auto make_segmented_range_reduce(stack_begin, stack_end)
//{
// if (size(stack_begin) == 1 && size(stack_end) == 1)
@ -373,7 +390,7 @@ namespace boost { namespace fusion { namespace detail
template <
typename StackBegin
, typename StackEnd
, bool SameSegment =
, bool SameSegment =
result_of::equal_to<
typename StackBegin::car_type::begin_type
, typename StackEnd::car_type::begin_type

View File

@ -1,7 +1,7 @@
/*=============================================================================
Copyright (c) 2009 Hartmut Kaiser
Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
==============================================================================*/
@ -27,7 +27,7 @@
namespace boost { namespace fusion { namespace result_of
{
template <typename Sequence
, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(FUSION_MAX_VECTOR_SIZE, int I, LONG_MAX)>
, BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(FUSION_MAX_VECTOR_SIZE, int I, INT_MAX)>
struct as_nview
{
typedef mpl::vector_c<

View File

@ -23,6 +23,8 @@
#include <boost/fusion/container/vector.hpp>
#include <boost/fusion/view/transform_view.hpp>
#include <boost/config.hpp>
namespace boost { namespace fusion
{
namespace detail
@ -35,12 +37,21 @@ namespace boost { namespace fusion
template<typename U>
struct result<addref(U)> : add_reference<U> {};
#ifdef BOOST_NO_RVALUE_REFERENCES
template <typename T>
typename add_reference<T>::type
operator()(T& x) const
{
return x;
}
#else
template <typename T>
typename result<addref(T)>::type
operator()(T&& x) const
{
return x;
}
#endif
};
struct addconstref

View File

@ -62,7 +62,7 @@ namespace boost { namespace fusion {
template<typename Seq>
typename result<endpoints(Seq const&)>::type
operator()(Seq const& seq)
operator()(Seq const& seq) const
{
return fusion::advance<M>(fusion::begin(seq));
}

View File

@ -16,6 +16,7 @@
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/config.hpp>
namespace boost { namespace fusion {
@ -35,6 +36,13 @@ namespace boost { namespace fusion {
mpl::identity<unused_type>,
result_of::value_at<typename remove_reference<Seq>::type, N> >
{};
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_RVALUE_REFERENCES
template<typename Seq>
typename result<poly_value_at(Seq)>::type
operator()(Seq&&) const;
#endif
};
}

View File

@ -16,6 +16,7 @@
#include <boost/mpl/eval_if.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/type_traits/is_same.hpp>
#include <boost/config.hpp>
namespace boost { namespace fusion
{
@ -34,6 +35,13 @@ namespace boost { namespace fusion
mpl::identity<unused_type>,
result_of::value_of<It> >
{};
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_RVALUE_REFERENCES
template<typename It>
typename result<poly_value_of(It)>::type
operator()(It&&) const;
#endif
};
}

View File

@ -37,6 +37,8 @@
#include <boost/type_traits/remove_reference.hpp>
#include <boost/type_traits/is_reference.hpp>
#include <boost/config.hpp>
namespace boost { namespace fusion {
namespace detail
@ -64,6 +66,13 @@ namespace boost { namespace fusion {
result_of::size<SeqClass>,
mpl::int_<high_int> >::type type;
};
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_RVALUE_REFERENCES
template<typename Seq>
typename result<seq_ref_size(Seq)>::type
operator()(Seq&&) const;
#endif
};
struct poly_min
@ -78,6 +87,13 @@ namespace boost { namespace fusion {
typedef typename remove_reference<Rhs>::type rhs;
typedef typename mpl::min<lhs, rhs>::type type;
};
// never called, but needed for decltype-based result_of (C++0x)
#ifndef BOOST_NO_RVALUE_REFERENCES
template<typename Lhs, typename Rhs>
typename result<poly_min(Lhs, Rhs)>::type
operator()(Lhs&&, Rhs&&) const;
#endif
};
template<typename Sequences>

View File

@ -15,6 +15,9 @@
#include <boost/fusion/algorithm/transformation/pop_back.hpp>
#include <boost/fusion/algorithm/transformation/push_back.hpp>
#include <boost/fusion/algorithm/query/find.hpp>
#include <boost/fusion/include/back.hpp>
#include <boost/fusion/include/array.hpp>
#include <boost/array.hpp>
#include <boost/mpl/vector_c.hpp>
int
@ -85,12 +88,17 @@ main()
auto i1 = find<int>(popv);
auto i2 = find<double>(pop);
assert(i1 != end(pop));
assert(i2 != end(pop));
assert(i1 != i2);
BOOST_TEST(i1 != end(pop));
BOOST_TEST(i2 != end(pop));
BOOST_TEST(i1 != i2);
}
#endif
{
boost::array<std::size_t, 2> a = { 10, 50 };
BOOST_TEST(back(pop_back(a)) == 10);
}
return boost::report_errors();
}

View File

@ -72,6 +72,8 @@ struct fobj
int operator()(int i, object &, object_nc &) { return 10 + i; }
int operator()(int i, object &, object_nc &) const { return 11 + i; }
int operator()(int i, object const &, object_nc &);
int operator()(int i, object const &, object_nc &) const;
};
struct nullary_fobj

View File

@ -75,6 +75,8 @@ struct fobj
int operator()(int i, object &, object_nc &) { return 10 + i; }
int operator()(int i, object &, object_nc &) const { return 11 + i; }
int operator()(int i, object const &, object_nc &);
int operator()(int i, object const &, object_nc &) const;
};
struct nullary_fobj

View File

@ -71,7 +71,7 @@ void result_type_tests()
typedef fusion::unfused< test_func<> > t;
BOOST_TEST(( is_same< boost::result_of< t () >::type, long >::value ));
BOOST_TEST(( is_same< boost::result_of< t (int) >::type, long >::value ));
BOOST_TEST(( is_same< boost::result_of< t (int &) >::type, long >::value ));
}
int main()

View File

@ -85,7 +85,7 @@ void result_type_tests()
typedef fusion::unfused_typed< test_func<>, types0 > t0;
BOOST_TEST(( is_same< boost::result_of< t0 () >::type, long >::value ));
typedef fusion::unfused_typed< test_func<>, types1 > t1;
BOOST_TEST(( is_same< boost::result_of< t1 (int) >::type, long >::value ));
BOOST_TEST(( is_same< boost::result_of< t1 (long &) >::type, long >::value ));
}
#if defined(BOOST_MSVC) && BOOST_MSVC < 1400

View File

@ -1,7 +1,7 @@
/*=============================================================================
Copyright (c) 2001-2011 Joel de Guzman
Distributed under the Boost Software License, Version 1.0. (See accompanying
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)
==============================================================================*/
#include <boost/detail/lightweight_test.hpp>
@ -20,6 +20,8 @@
#include <boost/fusion/support/category_of.hpp>
#include <boost/static_assert.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/at.hpp>
#include <boost/typeof/typeof.hpp>
#include <iostream>
#include <string>
@ -39,18 +41,19 @@ main()
{
typedef map<
pair<int, char>
, pair<double, std::string> >
, pair<double, std::string> >
map_type;
BOOST_MPL_ASSERT((traits::is_associative<map_type>));
BOOST_MPL_ASSERT((traits::is_random_access<map_type>));
map_type m(
make_pair<int>('X')
, make_pair<double>("Men"));
std::cout << at_key<int>(m) << std::endl;
std::cout << at_key<double>(m) << std::endl;
BOOST_TEST(at_key<int>(m) == 'X');
BOOST_TEST(at_key<double>(m) == "Men");
@ -58,7 +61,7 @@ main()
boost::is_same<boost::fusion::result_of::value_at_key<map_type, int>::type, char>::value));
BOOST_STATIC_ASSERT((
boost::is_same<boost::fusion::result_of::value_at_key<map_type, double>::type, std::string>::value));
std::cout << m << std::endl;
BOOST_STATIC_ASSERT((boost::fusion::result_of::has_key<map_type, int>::value));
@ -75,8 +78,43 @@ main()
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::key_of<boost::fusion::result_of::next<boost::fusion::result_of::begin<map_type>::type>::type>::type, double>::value));
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::value_of_data<boost::fusion::result_of::begin<map_type>::type>::type, char>::value));
BOOST_STATIC_ASSERT((boost::is_same<boost::fusion::result_of::value_of_data<boost::fusion::result_of::next<boost::fusion::result_of::begin<map_type>::type>::type>::type, std::string>::value));
//! Test random access interface.
pair<int, char> a = at_c<0>(m);
pair<double, std::string> b = at_c<1>(m);
}
//! iterators & random access interface.
{
typedef pair<boost::mpl::int_<0>, std::string> pair0;
typedef pair<boost::mpl::int_<1>, std::string> pair1;
typedef pair<boost::mpl::int_<2>, std::string> pair2;
typedef pair<boost::mpl::int_<3>, std::string> pair3;
typedef pair<boost::mpl::int_<4>, std::string> pair4;
typedef map< pair0, pair1, pair2, pair3, pair4 > map_type;
map_type m( pair0("zero"), pair1("one"), pair2("two"), pair3("three"), pair4("four") );
BOOST_AUTO( it0, begin(m) );
BOOST_TEST((deref(it0) == pair0("zero")));
BOOST_AUTO( it1, fusion::next(it0) );
BOOST_TEST((deref(it1) == pair1("one")));
BOOST_AUTO( it2, fusion::next(it1) );
BOOST_TEST((deref(it2) == pair2("two")));
BOOST_AUTO( it3, fusion::next(it2) );
BOOST_TEST((deref(it3) == pair3("three")));
BOOST_AUTO( it4, fusion::next(it3) );
BOOST_TEST((deref(it4) == pair4("four")));
BOOST_TEST((deref(fusion::advance_c<4>(it0)) == deref(it4)));
//! Bi-directional
BOOST_TEST((deref(fusion::prior(it4)) == deref(it3) ));
BOOST_TEST((deref(fusion::prior(it3)) == deref(it2) ));
BOOST_TEST((deref(fusion::prior(it2)) == deref(it1) ));
BOOST_TEST((deref(fusion::prior(it1)) == deref(it0) ));
}
{
std::cout << make_map<char, int>('X', 123) << std::endl;
BOOST_TEST(at_key<char>(make_map<char, int>('X', 123)) == 'X');

View File

@ -6,6 +6,7 @@
==============================================================================*/
#include <boost/detail/lightweight_test.hpp>
#include <boost/fusion/container/vector/vector.hpp>
#include <boost/fusion/container/map/map.hpp>
#include <boost/fusion/adapted/mpl.hpp>
#include <boost/fusion/sequence/io/out.hpp>
#include <boost/fusion/container/generation/make_vector.hpp>
@ -82,6 +83,27 @@ main()
));
}
//! Map
{
typedef pair<boost::mpl::int_<0>, std::string> pair0;
typedef pair<boost::mpl::int_<1>, std::string> pair1;
typedef pair<boost::mpl::int_<2>, std::string> pair2;
typedef pair<boost::mpl::int_<3>, std::string> pair3;
typedef pair<boost::mpl::int_<4>, std::string> pair4;
typedef map< pair0, pair1, pair2, pair3, pair4 > map_type;
map_type m( pair0("zero"), pair1("one"), pair2("two"), pair3("three"), pair4("four") );
typedef reverse_view<map_type> view_type;
view_type rev(m);
std::cout << rev << std::endl;
BOOST_TEST((rev == make_vector( pair4("four"), pair3("three"), pair2("two"), pair1("one"), pair0("zero"))));
BOOST_TEST((at_c<0>(rev) == pair4("four")));
BOOST_TEST((at_c<1>(rev) == pair3("three")));
BOOST_TEST((at_c<2>(rev) == pair2("two")));
BOOST_TEST((at_c<3>(rev) == pair1("one")));
BOOST_TEST((at_c<4>(rev) == pair0("zero")));
}
return boost::report_errors();
}