Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r52208 - in trunk: boost/mpl libs/mpl/doc/src/refmanual libs/mpl/test
From: eric_at_[hidden]
Date: 2009-04-06 02:01:00


Author: eric_niebler
Date: 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
New Revision: 52208
URL: http://svn.boost.org/trac/boost/changeset/52208

Log:
add mpl::char_ and mpl::string, fixes #2905
Added:
   trunk/boost/mpl/char.hpp (contents, props changed)
   trunk/boost/mpl/char_fwd.hpp (contents, props changed)
   trunk/boost/mpl/string.hpp (contents, props changed)
   trunk/libs/mpl/doc/src/refmanual/char_.rst (contents, props changed)
   trunk/libs/mpl/doc/src/refmanual/string.rst (contents, props changed)
   trunk/libs/mpl/test/char.cpp (contents, props changed)
   trunk/libs/mpl/test/string.cpp (contents, props changed)
Text files modified:
   trunk/libs/mpl/doc/src/refmanual/IntegralConstant.rst | 1 +
   trunk/libs/mpl/test/Jamfile.v2 | 2 ++
   2 files changed, 3 insertions(+), 0 deletions(-)

Added: trunk/boost/mpl/char.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/mpl/char.hpp 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,22 @@
+
+#ifndef BOOST_MPL_CHAR_HPP_INCLUDED
+#define BOOST_MPL_CHAR_HPP_INCLUDED
+
+// Copyright Eric Niebler 2008
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Source$
+// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $
+// $Revision: 24874 $
+
+#include <boost/mpl/char_fwd.hpp>
+
+#define AUX_WRAPPER_VALUE_TYPE char
+#include <boost/mpl/aux_/integral_wrapper.hpp>
+
+#endif // BOOST_MPL_CHAR_HPP_INCLUDED

Added: trunk/boost/mpl/char_fwd.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/mpl/char_fwd.hpp 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,27 @@
+
+#ifndef BOOST_MPL_CHAR_FWD_HPP_INCLUDED
+#define BOOST_MPL_CHAR_FWD_HPP_INCLUDED
+
+// Copyright Eric Niebler 2008
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Source$
+// $Date: 2008-06-14 08:41:37 -0700 (Sat, 16 Jun 2008) $
+// $Revision: 24874 $
+
+#include <boost/mpl/aux_/adl_barrier.hpp>
+#include <boost/mpl/aux_/nttp_decl.hpp>
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_OPEN
+
+template< BOOST_MPL_AUX_NTTP_DECL(char, N) > struct char_;
+
+BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
+BOOST_MPL_AUX_ADL_BARRIER_DECL(char_)
+
+#endif // BOOST_MPL_CHAR_FWD_HPP_INCLUDED

Added: trunk/boost/mpl/string.hpp
==============================================================================
--- (empty file)
+++ trunk/boost/mpl/string.hpp 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,396 @@
+
+#ifndef BOOST_MPL_STRING_HPP_INCLUDED
+#define BOOST_MPL_STRING_HPP_INCLUDED
+
+// Copyright Eric Niebler 2009
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: string.hpp 49239 2009-04-01 09:10:26Z eric_niebler $
+// $Date: 2009-04-01 02:10:26 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49239 $
+
+#include <boost/mpl/char.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/back.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/size_t.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/insert_range.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/preprocessor/arithmetic/dec.hpp>
+#include <boost/preprocessor/arithmetic/add.hpp>
+#include <boost/preprocessor/arithmetic/div.hpp>
+#include <boost/preprocessor/repetition/enum.hpp>
+#include <boost/preprocessor/punctuation/comma_if.hpp>
+#include <boost/preprocessor/repetition/enum_params.hpp>
+#include <boost/preprocessor/repetition/repeat_from_to.hpp>
+#include <boost/preprocessor/repetition/enum_shifted_params.hpp>
+#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
+#include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
+
+namespace boost { namespace mpl
+{
+ #ifndef BOOST_MPL_STRING_MAX_LENGTH
+ # define BOOST_MPL_STRING_MAX_LENGTH 32
+ #endif
+
+ #define BOOST_MPL_STRING_MAX_PARAMS BOOST_PP_DIV(BOOST_PP_ADD(BOOST_MPL_STRING_MAX_LENGTH, 3), 4)
+
+ #define BOOST_MPL_MULTICHAR_LENGTH(c) (std::size_t)((c>0xffffff)+(c>0xffff)+(c>0xff)+1)
+ #define BOOST_MPL_MULTICHAR_AT(c,i) (char)(0xff&(c>>(8*(BOOST_MPL_MULTICHAR_LENGTH(c)-(std::size_t)(i)-1))))
+
+ struct string_tag;
+ struct string_iterator_tag;
+
+ template<BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C, 0)>
+ struct string;
+
+ template<typename Sequence, long N>
+ struct string_iterator;
+
+ template<typename Sequence>
+ struct sequence_tag;
+
+ template<typename Tag>
+ struct size_impl;
+
+ template<>
+ struct size_impl<string_tag>
+ {
+ template<typename Sequence>
+ struct apply
+ : mpl::size_t<Sequence::size>
+ {};
+ };
+
+ template<typename Tag>
+ struct at_impl;
+
+ template<>
+ struct at_impl<string_tag>
+ {
+ template<typename Sequence, typename N>
+ struct apply
+ : Sequence::template at<N::value>
+ {};
+ };
+
+ template<typename Tag>
+ struct begin_impl;
+
+ template<>
+ struct begin_impl<string_tag>
+ {
+ template<typename Sequence>
+ struct apply
+ {
+ typedef string_iterator<Sequence, 0> type;
+ };
+ };
+
+ template<typename Tag>
+ struct end_impl;
+
+ template<>
+ struct end_impl<string_tag>
+ {
+ template<typename Sequence>
+ struct apply
+ {
+ typedef string_iterator<Sequence, Sequence::size> type;
+ };
+ };
+
+ template<typename Tag>
+ struct push_back_impl;
+
+ template<>
+ struct push_back_impl<string_tag>
+ {
+ template<typename Sequence, typename Value, bool B = (4==BOOST_MPL_MULTICHAR_LENGTH(Sequence::back_))>
+ struct apply
+ {
+ BOOST_MPL_ASSERT_MSG(false, PUSH_BACK_FAILED_MPL_STRING_IS_FULL, (Sequence));
+ typedef void type;
+ };
+
+ template<typename Value>
+ struct apply<string<>, Value, false>
+ {
+ typedef string<(char)Value::value> type;
+ };
+
+ #define M0(z,n,data) \
+ template<BOOST_PP_ENUM_PARAMS_Z(z, n, unsigned int C), typename Value> \
+ struct apply<string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, Value, false> \
+ { \
+ typedef string< \
+ BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), C) \
+ BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
+ (BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff) \
+ ?BOOST_PP_CAT(C,BOOST_PP_DEC(n)) \
+ :(BOOST_PP_CAT(C,BOOST_PP_DEC(n))<<8)|(unsigned char)Value::value \
+ , (BOOST_PP_CAT(C,BOOST_PP_DEC(n))>0xffffff) \
+ ?(char)Value::value \
+ :0 \
+ > type; \
+ };
+
+ BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~)
+ #undef M0
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C), typename Value>
+ struct apply<string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, Value, false>
+ {
+ typedef string<
+ BOOST_PP_ENUM_PARAMS(BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS), C)
+ , (BOOST_PP_CAT(C,BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS))<<8)|(unsigned char)Value::value
+ > type;
+ };
+ };
+
+ template<typename Tag>
+ struct push_front_impl;
+
+ template<>
+ struct push_front_impl<string_tag>
+ {
+ template<typename Sequence, typename Value, bool B = (4==BOOST_MPL_MULTICHAR_LENGTH(Sequence::front_))>
+ struct apply
+ {
+ BOOST_MPL_ASSERT_MSG(false, PUSH_FRONT_FAILED_MPL_STRING_IS_FULL, (Sequence));
+ typedef void type;
+ };
+
+ template<typename Value>
+ struct apply<string<>, Value, false>
+ {
+ typedef string<(char)Value::value> type;
+ };
+
+ #define M0(z,n,data) \
+ template<BOOST_PP_ENUM_PARAMS_Z(z, n, unsigned int C), typename Value> \
+ struct apply<string<BOOST_PP_ENUM_PARAMS_Z(z, n, C)>, Value, true> \
+ { \
+ typedef string< \
+ (char)Value::value \
+ BOOST_PP_ENUM_TRAILING_PARAMS_Z(z, n, C) \
+ > type; \
+ };
+
+ BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS), M0, ~)
+ #undef M0
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C), typename Value>
+ struct apply<string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>, Value, false>
+ {
+ typedef string<
+ ((((unsigned char)Value::value)<<(BOOST_MPL_MULTICHAR_LENGTH(C0)*8))|C0)
+ , BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)
+ > type;
+ };
+ };
+
+ template<typename Tag>
+ struct insert_range_impl;
+
+ template<>
+ struct insert_range_impl<string_tag>
+ {
+ template<typename Sequence, typename Pos, typename Range>
+ struct apply
+ : copy<
+ joint_view<
+ iterator_range<
+ string_iterator<Sequence, 0>
+ , Pos
+ >
+ , joint_view<
+ Range
+ , iterator_range<
+ Pos
+ , string_iterator<Sequence, Sequence::size>
+ >
+ >
+ >
+ , back_inserter<string<> >
+ >
+ {};
+ };
+
+ template<typename Tag>
+ struct insert_impl;
+
+ template<>
+ struct insert_impl<string_tag>
+ {
+ template<typename Sequence, typename Pos, typename Value>
+ struct apply
+ : insert_range<Sequence, Pos, string<(char)Value::value> >
+ {};
+ };
+
+ template<typename Tag>
+ struct erase_impl;
+
+ template<>
+ struct erase_impl<string_tag>
+ {
+ template<typename Sequence, typename First, typename Last>
+ struct apply
+ : copy<
+ joint_view<
+ iterator_range<
+ string_iterator<Sequence, 0>
+ , First
+ >
+ , iterator_range<
+ typename if_na<Last, typename next<First>::type>::type
+ , string_iterator<Sequence, Sequence::size>
+ >
+ >
+ , back_inserter<string<> >
+ >
+ {};
+ };
+
+ template<typename Tag>
+ struct clear_impl;
+
+ template<>
+ struct clear_impl<string_tag>
+ {
+ template<typename>
+ struct apply
+ {
+ typedef string<> type;
+ };
+ };
+
+ template<typename Tag>
+ struct advance_impl;
+
+ template<>
+ struct advance_impl<string_iterator_tag>
+ {
+ template<typename Iterator, typename N>
+ struct apply
+ {
+ typedef string_iterator<
+ typename Iterator::string_type
+ , Iterator::index + N::value
+ > type;
+ };
+ };
+
+ template<typename Tag>
+ struct distance_impl;
+
+ template<>
+ struct distance_impl<string_iterator_tag>
+ {
+ template<typename First, typename Last>
+ struct apply
+ {
+ typedef mpl::long_<Last::index - First::index> type;
+ };
+ };
+
+ template<typename Sequence, long N>
+ struct string_iterator
+ : Sequence::template at<N>
+ {
+ typedef string_iterator_tag tag;
+ typedef std::random_access_iterator_tag category;
+ typedef Sequence string_type;
+ static long const index = N;
+ typedef string_iterator<Sequence, N+1> next;
+ typedef string_iterator<Sequence, N-1> prior;
+ };
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C)>
+ struct string
+ {
+ /// INTERNAL ONLY
+ static unsigned int const front_ = C0;
+ /// INTERNAL ONLY
+ static unsigned int const back_ = BOOST_PP_CAT(C, BOOST_PP_DEC(BOOST_MPL_STRING_MAX_PARAMS));
+ /// INTERNAL ONLY
+ typedef string<BOOST_PP_ENUM_SHIFTED_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)> rest_;
+
+ typedef string type;
+
+ typedef string_tag tag;
+
+ static std::size_t const size = BOOST_MPL_MULTICHAR_LENGTH(C0) + rest_::size;
+
+ template<long Pos, bool B = (Pos < BOOST_MPL_MULTICHAR_LENGTH(C0))>
+ struct at
+ : boost::mpl::char_<BOOST_MPL_MULTICHAR_AT(C0,Pos)>
+ {};
+
+ template<long Pos>
+ struct at<Pos, false>
+ : rest_::template at<Pos-BOOST_MPL_MULTICHAR_LENGTH(C0)>
+ {};
+
+ static char const c_str[];
+ };
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C)>
+ char const string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>::c_str[] =
+ {
+ #define M0(z, n, data) at<n>::value
+ BOOST_PP_ENUM(BOOST_MPL_STRING_MAX_LENGTH, M0, ~)
+ #undef M0
+ , '\0' // to ensure the string is null-terminated
+ };
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C)>
+ std::size_t const string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>::size;
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C)>
+ unsigned int const string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>::front_;
+
+ template<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, unsigned int C)>
+ unsigned int const string<BOOST_PP_ENUM_PARAMS(BOOST_MPL_STRING_MAX_PARAMS, C)>::back_;
+
+ template<>
+ struct string<>
+ {
+ /// INTERNAL ONLY
+ static unsigned int const front_ = 0;
+ /// INTERNAL ONLY
+ static unsigned int const back_ = 0;
+ /// INTERNAL ONLY
+ typedef string rest_;
+
+ typedef string type;
+
+ typedef string_tag tag;
+
+ static std::size_t const size = 0;
+
+ template<unsigned int>
+ struct at
+ : boost::mpl::char_<'\0'>
+ {};
+
+ static char const c_str[];
+ };
+
+ char const string<>::c_str[] = {'\0'};
+ std::size_t const string<>::size;
+ unsigned int const string<>::front_;
+ unsigned int const string<>::back_;
+
+}} // namespace boost
+
+#endif // BOOST_MPL_STRING_HPP_INCLUDED

Modified: trunk/libs/mpl/doc/src/refmanual/IntegralConstant.rst
==============================================================================
--- trunk/libs/mpl/doc/src/refmanual/IntegralConstant.rst (original)
+++ trunk/libs/mpl/doc/src/refmanual/IntegralConstant.rst 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -71,6 +71,7 @@
 * |bool_|
 * |int_|
 * |long_|
+* |char_|
 * |integral_c|
 
 

Added: trunk/libs/mpl/doc/src/refmanual/char_.rst
==============================================================================
--- (empty file)
+++ trunk/libs/mpl/doc/src/refmanual/char_.rst 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,89 @@
+.. Data Types/Numeric//char_ |60
+
+.. Copyright Eric Niebler 2009.
+.. 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)
+
+char\_
+======
+
+Synopsis
+--------
+
+.. parsed-literal::
+
+ template<
+ char N
+ >
+ struct char\_
+ {
+ // |unspecified|
+ // ...
+ };
+
+
+Description
+-----------
+
+An |Integral Constant| wrapper for ``char``.
+
+
+Header
+------
+
+.. parsed-literal::
+
+ #include <boost/mpl/char.hpp>
+
+
+Model of
+--------
+
+|Integral Constant|
+
+
+Parameters
+----------
+
++---------------+-------------------------------+---------------------------+
+| Parameter | Requirement | Description |
++===============+===============================+===========================+
+| ``N`` | A character constant | A value to wrap. |
++---------------+-------------------------------+---------------------------+
+
+Expression semantics
+--------------------
+
+|Semantics disclaimer...| |Integral Constant|.
+
+For arbitrary character constant ``c``:
+
++-------------------+-----------------------------------------------------------+
+| Expression | Semantics |
++===================+===========================================================+
+| ``char_<c>`` | An |Integral Constant| ``x`` such that ``x::value == c`` |
+| | and ``x::value_type`` is identical to ``char``. |
++-------------------+-----------------------------------------------------------+
+
+
+Example
+-------
+
+.. parsed-literal::
+
+ typedef char_<'c'> c;
+
+ BOOST_MPL_ASSERT(( is_same< c::value_type, char > ));
+ BOOST_MPL_ASSERT(( is_same< c::type, c > ));
+ BOOST_MPL_ASSERT(( is_same< next< c >::type, char_<'d'> > ));
+ BOOST_MPL_ASSERT(( is_same< prior< c >::type, char_<'b'> > ));
+ BOOST_MPL_ASSERT_RELATION( (c::value), ==, 'c' );
+ assert( c() == 'c' );
+
+
+See also
+--------
+
+|Data Types|, |Integral Constant|, |int_|, |size_t|, |integral_c|
+

Added: trunk/libs/mpl/doc/src/refmanual/string.rst
==============================================================================
--- (empty file)
+++ trunk/libs/mpl/doc/src/refmanual/string.rst 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,140 @@
+.. Sequences/Classes//string |100
+
+.. Copyright Eric Niebler 2009.
+.. 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)
+
+string
+======
+
+Description
+-----------
+
+``string`` is a |variadic|, `random access`__, `extensible`__ |Integral Sequence Wrapper| of
+characters that supports constant-time insertion and removal of elements at both ends, and
+linear-time insertion and removal of elements in the middle. The parameters to ``string``
+are multi-character literals, giving a somewhat readable syntax for compile-time strings.
+``string`` also has a class static null-terminated character array called ``c_str`` that
+facilitates interoperability with runtime string processing routines.
+
+__ `Random Access Sequence`_
+__ `Extensible Sequence`_
+
+Header
+------
+
++-------------------+-------------------------------------------------------+
+| Sequence form | Header |
++===================+=======================================================+
+| Variadic | ``#include <boost/mpl/string.hpp>`` |
++-------------------+-------------------------------------------------------+
+
+Model of
+--------
+
+* |Integral Sequence Wrapper|
+* |Variadic Sequence|
+* |Random Access Sequence|
+* |Extensible Sequence|
+* |Back Extensible Sequence|
+* |Front Extensible Sequence|
+
+
+Expression semantics
+--------------------
+
+In the following table, ``s`` is an instance of ``string``, ``pos`` and ``last`` are iterators
+into ``s``, ``r`` is a |Forward Sequence| of characters, ``n`` and ``x`` are |Integral Constant|\ s,
+and |c1...cn| are arbitrary (multi-)characters.
+
++---------------------------------------+-----------------------------------------------------------+
+| Expression | Semantics |
++=======================================+===========================================================+
+| .. parsed-literal:: | ``string`` of characters |c1...cn|; see |
+| | |Variadic Sequence|. |
+| string<|c1...cn|> | |
++---------------------------------------+-----------------------------------------------------------+
+| .. parsed-literal:: | Identical to ``string<``\ |c1...cn|\ ``>``; |
+| | see |Variadic Sequence|. |
+| string<|c1...cn|>::type | |
++---------------------------------------+-----------------------------------------------------------+
+| ``begin<s>::type`` | An iterator pointing to the beginning of ``s``; |
+| | see |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``end<s>::type`` | An iterator pointing to the end of ``s``; |
+| | see |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``size<s>::type`` | The size of ``s``; see |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``empty<s>::type`` | |true if and only if| the sequence is empty; |
+| | see |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``front<s>::type`` | The first element in ``s``; see |
+| | |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``back<s>::type`` | The last element in ``s``; see |
+| | |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``at<s,n>::type`` | The ``n``\ th element from the beginning of ``s``; see |
+| | |Random Access Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``insert<s,pos,x>::type`` | A new ``string`` of following elements: |
+| | [``begin<s>::type``, ``pos``), ``x``, |
+| | [``pos``, ``end<s>::type``); see |Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``insert_range<s,pos,r>::type`` | A new ``string`` of following elements: |
+| | [``begin<s>::type``, ``pos``), |
+| | [``begin<r>::type``, ``end<r>::type``) |
+| | [``pos``, ``end<s>::type``); see |Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``erase<s,pos>::type`` | A new ``string`` of following elements: |
+| | [``begin<s>::type``, ``pos``), |
+| | [``next<pos>::type``, ``end<s>::type``); see |
+| | |Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``erase<s,pos,last>::type`` | A new ``string`` of following elements: |
+| | [``begin<s>::type``, ``pos``), |
+| | [``last``, ``end<s>::type``); see |Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``clear<s>::type`` | An empty ``string``; see |Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``push_back<s,x>::type`` | A new ``string`` of following elements: |
+| | |begin/end<s>|, ``x``; |
+| | see |Back Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``pop_back<s>::type`` | A new ``string`` of following elements: |
+| | [``begin<s>::type``, ``prior< end<s>::type >::type``); |
+| | see |Back Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``push_front<s,x>::type`` | A new ``string`` of following elements: |
+| | |begin/end<s>|, ``x``; see |Front Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``pop_front<s>::type`` | A new ``string`` of following elements: |
+| | [``next< begin<s>::type >::type``, ``end<s>::type``); |
+| | see |Front Extensible Sequence|. |
++---------------------------------------+-----------------------------------------------------------+
+| ``s::c_str`` | A null-terminated byte string such that |
+| | ``s::c_str[``\ *n*\ ``]`` is |
+| | ``at<s,``\ *n*\ ``>::type::value`` for each *n* in |
+| | [``0``, ``size<s>::type::value``), and |
+| | ``s::c_str[size<s>::type::value]`` is ``'\0'``. |
++---------------------------------------+-----------------------------------------------------------+
+
+
+Example
+-------
+
+.. parsed-literal::
+
+ typedef string<'hell','o wo','rld'> hello;
+ typedef push_back<hello, char_<'!'> >::type hello2;
+
+ BOOST_ASSERT(0 == std::strcmp(hello2::c_str, "hello world!"));
+
+
+See also
+--------
+
+|Sequences|, |Variadic Sequence|, |Random Access Sequence|, |Extensible Sequence|, |Integral Sequence Wrapper|, |char_|
+

Modified: trunk/libs/mpl/test/Jamfile.v2
==============================================================================
--- trunk/libs/mpl/test/Jamfile.v2 (original)
+++ trunk/libs/mpl/test/Jamfile.v2 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -44,6 +44,7 @@
 compile insert.cpp ;
 compile insert_range.cpp ;
 run int.cpp ;
+run char.cpp ;
 run integral_c.cpp : : : <toolset>vacpp:<cxxflags>-qchars=signed ;
 compile is_placeholder.cpp ;
 compile is_sequence.cpp ;
@@ -90,3 +91,4 @@
 compile vector.cpp ;
 compile vector_c.cpp ;
 compile zip_view.cpp ;
+run string.cpp ;

Added: trunk/libs/mpl/test/char.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/mpl/test/char.cpp 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,24 @@
+
+// Copyright Eric Niebler 2008
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: char.cpp 49240 2009-04-01 09:21:07Z eric_niebler $
+// $Date: 2009-04-01 02:21:07 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49240 $
+
+#include <boost/mpl/char.hpp>
+#include <boost/preprocessor/repeat.hpp>
+
+#include "integral_wrapper_test.hpp"
+
+
+MPL_TEST_CASE()
+{
+# define WRAPPER(T, i) char_<i>
+ BOOST_PP_REPEAT(10, INTEGRAL_WRAPPER_TEST, char)
+}

Added: trunk/libs/mpl/test/string.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/mpl/test/string.cpp 2009-04-06 02:00:57 EDT (Mon, 06 Apr 2009)
@@ -0,0 +1,173 @@
+
+// Copyright Eric Niebler 2009
+//
+// 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)
+//
+// See http://www.boost.org/libs/mpl for documentation.
+
+// $Id: string.cpp 49240 2009-04-01 09:21:07Z eric_niebler $
+// $Date: 2009-04-01 02:21:07 -0700 (Wed, 1 Apr 2009) $
+// $Revision: 49240 $
+
+#include <string>
+#include <cstring>
+#include <iostream>
+
+#include <boost/mpl/string.hpp>
+
+#include <boost/mpl/at.hpp>
+#include <boost/mpl/long.hpp>
+#include <boost/mpl/back.hpp>
+#include <boost/mpl/copy.hpp>
+#include <boost/mpl/size.hpp>
+#include <boost/mpl/empty.hpp>
+#include <boost/mpl/front.hpp>
+#include <boost/mpl/clear.hpp>
+#include <boost/mpl/erase.hpp>
+#include <boost/mpl/insert.hpp>
+#include <boost/mpl/assert.hpp>
+#include <boost/mpl/size_t.hpp>
+#include <boost/mpl/for_each.hpp>
+#include <boost/mpl/vector_c.hpp>
+#include <boost/mpl/push_back.hpp>
+#include <boost/mpl/joint_view.hpp>
+#include <boost/mpl/insert_range.hpp>
+#include <boost/mpl/back_inserter.hpp>
+#include <boost/mpl/iterator_range.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/detail/lightweight_test.hpp>
+namespace mpl = boost::mpl;
+
+// Accept a string as a template parameter!
+template<char const *sz>
+struct greeting
+{
+ std::string say_hello() const
+ {
+ return sz;
+ }
+};
+
+struct push_char
+{
+ push_char(std::string &str)
+ : str_(&str)
+ {}
+
+ void operator()(char ch) const
+ {
+ this->str_->push_back(ch);
+ }
+
+ std::string *str_;
+};
+
+void test1()
+{
+ BOOST_TEST(0 == std::strcmp(mpl::string<'Hell','o wo','rld!'>::c_str, "Hello world!"));
+ BOOST_TEST((12 == mpl::size<mpl::string<'Hell','o wo','rld!'> >::type::value));
+ BOOST_TEST(('w' == mpl::at_c<mpl::string<'Hell','o wo','rld!'>, 6>::type::value));
+
+ // test using a string as a template parameter
+ greeting<mpl::string<'Hell','o wo','rld!'>::c_str> g;
+ BOOST_TEST("Hello world!" == g.say_hello());
+
+ BOOST_TEST(0 == std::strcmp("", mpl::string<>::c_str));
+
+ std::string result;
+ mpl::for_each<mpl::string<'Hell','o wo','rld!'> >(push_char(result));
+ BOOST_TEST("Hello world!" == result);
+
+ BOOST_MPL_ASSERT((mpl::empty<mpl::string<> >));
+ BOOST_MPL_ASSERT_NOT((mpl::empty<mpl::string<'hi!'> >));
+
+ BOOST_TEST(('h' == mpl::front<mpl::string<'hi!'> >::type()));
+ BOOST_TEST(('!' == mpl::back<mpl::string<'hi!'> >::type()));
+}
+
+// testing push_back
+void test2()
+{
+ typedef mpl::push_back<mpl::string<>, mpl::char_<'a'> >::type t1;
+ BOOST_TEST(0 == std::strcmp("a", t1::c_str));
+
+ typedef mpl::push_back<t1, mpl::char_<'b'> >::type t2;
+ BOOST_TEST(0 == std::strcmp("ab", t2::c_str));
+
+ typedef mpl::push_back<t2, mpl::char_<'c'> >::type t3;
+ BOOST_TEST(0 == std::strcmp("abc", t3::c_str));
+ BOOST_MPL_ASSERT((boost::is_same<t3, mpl::string<'abc'> >));
+
+ typedef mpl::push_back<t3, mpl::char_<'d'> >::type t4;
+ BOOST_TEST(0 == std::strcmp("abcd", t4::c_str));
+
+ typedef mpl::push_back<t4, mpl::char_<'e'> >::type t5;
+ BOOST_TEST(0 == std::strcmp("abcde", t5::c_str));
+ BOOST_MPL_ASSERT((boost::is_same<t5, mpl::string<'abcd','e'> >));
+
+ typedef mpl::string<'aaaa','aaaa','aaaa','aaaa','aaaa','aaaa','aaaa','aaa'> almost_full;
+ BOOST_TEST(0 == std::strcmp("aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaa", almost_full::c_str));
+
+ typedef mpl::push_back<almost_full, mpl::char_<'X'> >::type t6;
+ BOOST_TEST(0 == std::strcmp("aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaX", t6::c_str));
+}
+
+// testing push_front
+void test3()
+{
+ typedef mpl::push_front<mpl::string<>, mpl::char_<'a'> >::type t1;
+ BOOST_TEST(0 == std::strcmp("a", t1::c_str));
+
+ typedef mpl::push_front<t1, mpl::char_<'b'> >::type t2;
+ BOOST_TEST(0 == std::strcmp("ba", t2::c_str));
+
+ typedef mpl::push_front<t2, mpl::char_<'c'> >::type t3;
+ BOOST_TEST(0 == std::strcmp("cba", t3::c_str));
+
+ typedef mpl::push_front<t3, mpl::char_<'d'> >::type t4;
+ BOOST_TEST(0 == std::strcmp("dcba", t4::c_str));
+
+ typedef mpl::push_front<t4, mpl::char_<'e'> >::type t5;
+ BOOST_TEST(0 == std::strcmp("edcba", t5::c_str));
+
+ typedef mpl::string<'aaa','aaaa','aaaa','aaaa','aaaa','aaaa','aaaa','aaaa'> almost_full;
+ BOOST_TEST(0 == std::strcmp("aaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa", almost_full::c_str));
+
+ typedef mpl::push_front<almost_full, mpl::char_<'X'> >::type t6;
+ BOOST_TEST(0 == std::strcmp("Xaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa" "aaaa", t6::c_str));
+}
+
+void test4()
+{
+ // back-inserter with copy
+ typedef mpl::vector_c<char, 'a','b','c','d','e'> rgc;
+ typedef mpl::copy<rgc, mpl::back_inserter<mpl::string<> > >::type str;
+ BOOST_TEST(0 == std::strcmp("abcde", str::c_str));
+}
+
+// test insert_range and erase
+void test5()
+{
+ typedef mpl::string<'Hell','o wo','rld!'> hello;
+ typedef mpl::advance_c<mpl::begin<hello>::type, 5>::type where;
+ typedef mpl::string<' cru','el'> cruel;
+ typedef mpl::insert_range<hello, where, cruel>::type hello_cruel;
+ BOOST_TEST(0 == std::strcmp("Hello cruel world!", hello_cruel::c_str));
+
+ typedef mpl::erase<hello, mpl::begin<hello>::type, where>::type erased1;
+ BOOST_TEST(0 == std::strcmp(" world!", erased1::c_str));
+}
+
+
+int main()
+{
+ test1();
+ test2();
+ test3();
+ test4();
+ test5();
+
+ return boost::report_errors();
+}


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk