c++boostboost-mplboost-msm

Using boost msm state machine with more than 50 transitions


MSMs transition table uses a mpl::vector. The default maximum size is 20. You can change the size with

#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 50                
#define BOOST_MPL_LIMIT_MAP_SIZE 50 

to allow a size up to 50. According to the documentation (https://www.boost.org/doc/libs/1_80_0/libs/msm/doc/HTML/ch05.html) it is possible to increase the size even further by adding (for e.g. 60) mpl/vector60.hpp and mpl/map60.hpp

In boost/mpl/vector I find the files vector50_c.hpp and vector50.hpp. The content for vector50.hpp is:

#ifndef BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED
#define BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED

// Copyright Aleksey Gurtovoy 2000-2004
//
// 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$
// $Date$
// $Revision$

#if !defined(BOOST_MPL_PREPROCESSING_MODE)
#   include <boost/mpl/vector/vector40.hpp>
#endif

#include <boost/mpl/aux_/config/use_preprocessed.hpp>

#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
    && !defined(BOOST_MPL_PREPROCESSING_MODE)

#   define BOOST_MPL_PREPROCESSED_HEADER vector50.hpp
#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>

#else

#   include <boost/mpl/aux_/config/typeof.hpp>
#   include <boost/mpl/aux_/config/ctps.hpp>
#   include <boost/preprocessor/iterate.hpp>

namespace boost { namespace mpl {

#   define BOOST_PP_ITERATION_PARAMS_1 \
    (3,(41, 50, <boost/mpl/vector/aux_/numbered.hpp>))
#   include BOOST_PP_ITERATE()

}}

#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS

#endif // BOOST_MPL_VECTOR_VECTOR50_HPP_INCLUDED
  1. Do I need to add a file vector60_c.hpp and vector60.hpp? (What's the difference between the two?)
  2. Where do I add them? Inside boost/mpl/vector?
  3. How do I have to modify the file?

My first guess for writing the vector60.hpp would be:

#ifndef BOOST_MPL_VECTOR_VECTOR60_HPP_INCLUDED
#define BOOST_MPL_VECTOR_VECTOR60_HPP_INCLUDED

// Copyright Aleksey Gurtovoy 2000-2004
//
// 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$
// $Date$
// $Revision$

#if !defined(BOOST_MPL_PREPROCESSING_MODE)
#   include <boost/mpl/vector/vector50.hpp>
#endif

#include <boost/mpl/aux_/config/use_preprocessed.hpp>

#if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \
    && !defined(BOOST_MPL_PREPROCESSING_MODE)

#   define BOOST_MPL_PREPROCESSED_HEADER vector60.hpp
#   include <boost/mpl/vector/aux_/include_preprocessed.hpp>

#else

#   include <boost/mpl/aux_/config/typeof.hpp>
#   include <boost/mpl/aux_/config/ctps.hpp>
#   include <boost/preprocessor/iterate.hpp>

namespace boost { namespace mpl {

#   define BOOST_PP_ITERATION_PARAMS_1 \
    (3,(51, 60, <boost/mpl/vector/aux_/numbered.hpp>))
#   include BOOST_PP_ITERATE()

}}

#endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS

#endif // BOOST_MPL_VECTOR_VECTOR60_HPP_INCLUDED

Edit: My minimal example that I am trying to get to run

#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#define BOOST_MPL_LIMIT_VECTOR_SIZE 60
#include <boost/mpl/vector.hpp>

int main() {

    typedef boost::mpl::vector<
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int,
                int
            > vector_51;

    return 0;
}

produces currently the error

/usr/include/boost/mpl/vector.hpp:36:1: fatal error: boost/mpl/vector/vector60.hpp: No such file or directory
   36 | #   include BOOST_PP_STRINGIZE(boost/mpl/vector/AUX778076_VECTOR_HEADER)

My preferred solution would be adding some code before the includes that generates the code at compile time. But just getting my example to work with self-written files would be a good first step.


Solution

  • Do I need to add a file vector60_c.hpp and vector60.hpp? (What's the difference between the two?)

    Depends on whether MSM uses vector or vector_c. The difference: https://www.boost.org/doc/libs/1_80_0/libs/mpl/doc/refmanual/vector-c.html

    The way you generate the missing files is documented in preprocessed/README.txt.

    On my oldish Ubuntu box I could:

    cd ~/custom/superboost/libs/mpl
    python2.7 ./preprocessed/boost_mpl_preprocess.py 
    

    And it generated the files, as well as modifying many existing headers, e.g. aux_/preprocessed/plain/vector.hpp which now contains

    template<
          typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
        , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
        , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
        , typename T12 = na, typename T13 = na, typename T14 = na
        , typename T15 = na, typename T16 = na, typename T17 = na
        , typename T18 = na, typename T19 = na, typename T20 = na
        , typename T21 = na, typename T22 = na, typename T23 = na
        , typename T24 = na, typename T25 = na, typename T26 = na
        , typename T27 = na, typename T28 = na, typename T29 = na
        , typename T30 = na, typename T31 = na, typename T32 = na
        , typename T33 = na, typename T34 = na, typename T35 = na
        , typename T36 = na, typename T37 = na, typename T38 = na
        , typename T39 = na, typename T40 = na, typename T41 = na
        , typename T42 = na, typename T43 = na, typename T44 = na
        , typename T45 = na, typename T46 = na, typename T47 = na
        , typename T48 = na, typename T49 = na, typename T50 = na
        , typename T51 = na, typename T52 = na, typename T53 = na
        , typename T54 = na, typename T55 = na, typename T56 = na
        , typename T57 = na, typename T58 = na, typename T59 = na
        , typename T60 = na, typename T61 = na, typename T62 = na
        , typename T63 = na, typename T64 = na, typename T65 = na
        , typename T66 = na, typename T67 = na, typename T68 = na
        , typename T69 = na, typename T70 = na, typename T71 = na
        , typename T72 = na, typename T73 = na, typename T74 = na
        , typename T75 = na, typename T76 = na, typename T77 = na
        , typename T78 = na, typename T79 = na, typename T80 = na
        , typename T81 = na, typename T82 = na, typename T83 = na
        , typename T84 = na, typename T85 = na, typename T86 = na
        , typename T87 = na, typename T88 = na, typename T89 = na
        , typename T90 = na, typename T91 = na, typename T92 = na
        , typename T93 = na, typename T94 = na, typename T95 = na
        , typename T96 = na, typename T97 = na, typename T98 = na
        , typename T99 = na
        >
    struct vector;
    

    compared to the previous

    template<
          typename T0 = na, typename T1 = na, typename T2 = na, typename T3 = na
        , typename T4 = na, typename T5 = na, typename T6 = na, typename T7 = na
        , typename T8 = na, typename T9 = na, typename T10 = na, typename T11 = na
        , typename T12 = na, typename T13 = na, typename T14 = na
        , typename T15 = na, typename T16 = na, typename T17 = na
        , typename T18 = na, typename T19 = na
        >
    struct vector;