Boost logo

Boost Users :

From: Danny Havenith (dh.boost_at_[hidden])
Date: 2008-06-22 09:25:50


Hello all,

I've encountered some behaviour of maps in both fusion and mpl that I
did not expect, when inserting elements with the same key. Both
libraries behave the same.

To illustrate, I wrote the code below (full source at the end of this
post), where I create a map with a single element an then insert an
element with the same key (int_<1>). I expected the size<> of the
resulting map to be 1. Instead, the size is 2. (all on msvc9 and gcc
4.1.2 (MinGW), boost 1.35 and svn_head)

-----------------------------------
typedef pair< int_<1>, vector< int> > first_element;
typedef pair< int_<1>, vector< int, int> > second_element;

typedef map< first_element> first_map;
typedef insert< first_map, second_element>::type
  second_map;

// it prints "2", I expected "1".
std::cout << size< second_map>::type() << std::endl;
-----------------------------------

Generally, when I inspect the type of the resulting map after several
inserts, I see that all inserted elements are still there.

What is wrong with the above code? What should I do if I wanted the
original entry to be replaced with the new one?

Danny.
------source-------
#include <iostream>
#include <boost/mpl/vector.hpp>
#include <boost/mpl/int.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/pair.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/count.hpp>
#include <boost/mpl/map.hpp>

#include <boost/fusion/include/map.hpp>
#include <boost/fusion/include/insert.hpp>
#include <boost/fusion/include/count.hpp>
#include <boost/fusion/include/vector.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <utility> // std::pair

//#define USE_FUSION

int main(int argc, char* argv[])
{

#ifdef USE_FUSION
  using namespace boost::fusion::result_of;
  using std::pair;
  using boost::fusion::vector;
  using boost::fusion::map;
#else
  using namespace boost::mpl;
#endif

  using boost::mpl::int_;

  typedef pair< int_<1>, vector< int> > first_element;
  typedef pair< int_<1>, vector< int, int> > second_element;

  typedef map< first_element> first_map;
  typedef insert< first_map, end< first_map>::type,
      second_element>::type second_map;

  std::cout << size< second_map>::type() << std::endl;

  return 0;
}


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net