2

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.

Darragh
  • 109
  • 2
  • 5

2 Answers2

1

You can use boost::mp11::mp_list to replace boost::mpl::vector. This boost::mp11 library is modern C++11 (as name suggests) and it has not limitations - it just uses variadic templates.

For transition tables - you need to remember that it does not support inheritance - so you need to replace in such way:

// old mpl::vector way - limitation of 50
struct transition_table : boost::mpl::vector < rows.... >;

// new mp11 way - no limitations
using transition_table = boost::mp11::mp_list<rows...>;

You also need to include <boost/mp11/mpl.hpp> so all boost::mpl "algorithms" can work on boost::mp11

PiotrNycz
  • 23,099
  • 7
  • 66
  • 112
0

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;
sehe
  • 374,641
  • 47
  • 450
  • 633
  • I'm on Ubuntu 20.04 with an installed boost version 1.71. I do find only /usr/include/boost/mpl , which doesn't contain the script and afaik is also the wrong place to execute this. Does this work with an installed boost version and if so, where do I execute the script? Or do I have to build the library by myself? – Darragh Sep 30 '22 at 12:40
  • 1
    It will not work on an installed version. You need to download the tar-ball at least. MPL is header only so there's no need to install it: just put it somewhere "early" in your include path. I'd suggest keeping with the OS package version of boost. Alternatively you can build the libraries you need and install them instead of the system packages. Beyond that, you can question your design. So many transitions within <=10 states seem relatively strange. – sehe Sep 30 '22 at 12:44
  • Perhaps relevant https://twitter.com/krisjusiak/status/1575456353946148864 – sehe Sep 30 '22 at 14:29