Ejemplo n.º 1
0
 void FlatNodeList::print(std::string tabs)
 {
     std::cout << tabs << "NodeList:\n";
     for (iterate_over(node, nodes))
     {
         (*node)->print(tabs + "\t");
     }
 }
Ejemplo n.º 2
0
    void FlatNodeList::populateFlatNodePool(std::vector<SP<FlatNode>>& flatNodePool)
    {
        for (iterate_over(it, nodes))
        {
            SP<FlatNodeListItem> flatNodeListItem(*it);

            if (flatNodeListItem->isLeaf()) {
                flatNodePool.push_back(std::dynamic_pointer_cast<FlatNode>(flatNodeListItem));
            }
            else {
                (std::dynamic_pointer_cast<FlatNodeList>(flatNodeListItem))->populateFlatNodePool(flatNodePool);
            }
        }
    }
void spot_checks()
{
   // test specific values ripped straight out of the Unicode standard
   // to verify that our encoding is the same as theirs, as well as 
   // self-consistent:
   ::boost::uint32_t spot16[] = { 0x10302u, };
   typedef boost::u32_to_u16_iterator<const ::boost::uint32_t*> u32to16type;

   u32to16type it(spot16);
   BOOST_CHECK_EQUAL(*it++, 0xD800u);
   BOOST_CHECK_EQUAL(*it++, 0xDF02u);
   BOOST_CHECK_EQUAL(*--it, 0xDF02u);
   BOOST_CHECK_EQUAL(*--it, 0xD800u);

   ::boost::uint32_t spot8[] = { 0x004Du, 0x0430u, 0x4E8Cu, 0x10302u, };
   typedef boost::u32_to_u8_iterator<const ::boost::uint32_t*> u32to8type;

   u32to8type it8(spot8);
   BOOST_CHECK_EQUAL(*it8++, 0x4Du);
   BOOST_CHECK_EQUAL(*it8++, 0xD0u);
   BOOST_CHECK_EQUAL(*it8++, 0xB0u);
   BOOST_CHECK_EQUAL(*it8++, 0xE4u);
   BOOST_CHECK_EQUAL(*it8++, 0xBAu);
   BOOST_CHECK_EQUAL(*it8++, 0x8Cu);
   BOOST_CHECK_EQUAL(*it8++, 0xF0u);
   BOOST_CHECK_EQUAL(*it8++, 0x90u);
   BOOST_CHECK_EQUAL(*it8++, 0x8Cu);
   BOOST_CHECK_EQUAL(*it8++, 0x82u);

   BOOST_CHECK_EQUAL(*--it8, 0x82u);
   BOOST_CHECK_EQUAL(*--it8, 0x8Cu);
   BOOST_CHECK_EQUAL(*--it8, 0x90u);
   BOOST_CHECK_EQUAL(*--it8, 0xF0u);
   BOOST_CHECK_EQUAL(*--it8, 0x8Cu);
   BOOST_CHECK_EQUAL(*--it8, 0xBAu);
   BOOST_CHECK_EQUAL(*--it8, 0xE4u);
   BOOST_CHECK_EQUAL(*--it8, 0xB0u);
   BOOST_CHECK_EQUAL(*--it8, 0xD0u);
   BOOST_CHECK_EQUAL(*--it8, 0x4Du);
   //
   // Test some bad sequences and verify that our iterators will catch them:
   //
   boost::uint8_t bad_seq[10] = { 0x4Du, 0xD0u, 0xB0u, 0xE4u, 0xBAu, 0x8Cu, 0xF0u, 0x90u, 0x8Cu, 0x82u };
   BOOST_CHECK_EQUAL(
      iterate_over(
         boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq, bad_seq, bad_seq + 10),
         boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq+10, bad_seq, bad_seq + 10)),
      0x000149f3u);
   BOOST_CHECK_THROW(boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq, bad_seq, bad_seq + 9), std::out_of_range);
   BOOST_CHECK_THROW(boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq, bad_seq, bad_seq + 8), std::out_of_range);
   BOOST_CHECK_THROW(boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq, bad_seq, bad_seq + 7), std::out_of_range);
   BOOST_CHECK_THROW(boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq + 2, bad_seq, bad_seq + 10), std::out_of_range);
   BOOST_CHECK_THROW(boost::u8_to_u32_iterator<const boost::uint8_t*>(bad_seq + 2, bad_seq + 2, bad_seq + 10), std::out_of_range);

   boost::uint16_t bad_seq2[6] =  { 0xD800, 0xDF02, 0xD800, 0xDF02, 0xD800, 0xDF02 };
   BOOST_CHECK_EQUAL(
      iterate_over(
         boost::u16_to_u32_iterator<const boost::uint16_t*>(bad_seq2, bad_seq2, bad_seq2 + 6),
         boost::u16_to_u32_iterator<const boost::uint16_t*>(bad_seq2+6, bad_seq2, bad_seq2 + 6)),
      66306u);
   BOOST_CHECK_THROW(boost::u16_to_u32_iterator<const boost::uint16_t*>(bad_seq2, bad_seq2, bad_seq2 + 5), std::out_of_range);
   BOOST_CHECK_THROW(boost::u16_to_u32_iterator<const boost::uint16_t*>(bad_seq2 + 1, bad_seq2 + 1, bad_seq2 + 6), std::out_of_range);
   BOOST_CHECK_THROW(boost::u16_to_u32_iterator<const boost::uint16_t*>(bad_seq2 + 1, bad_seq2, bad_seq2 + 6), std::out_of_range);
}