commit mdds for openSUSE:Factory
Hello community, here is the log from the commit of package mdds for openSUSE:Factory checked in at 2014-04-26 10:08:29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/mdds (Old) and /work/SRC/openSUSE:Factory/.mdds.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "mdds" Changes: -------- --- /work/SRC/openSUSE:Factory/mdds/mdds.changes 2014-02-28 07:24:26.000000000 +0100 +++ /work/SRC/openSUSE:Factory/.mdds.new/mdds.changes 2014-04-26 10:08:30.000000000 +0200 @@ -1,0 +2,6 @@ +Fri Apr 25 10:01:09 UTC 2014 - tchvatal@suse.com + +- Version bump to 0.10.3: + * Various bugfixes among 0.10 series found during lo 4.2.3 phase. + +------------------------------------------------------------------- Old: ---- mdds_0.10.2.tar.bz2 New: ---- mdds_0.10.3.tar.bz2 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ mdds.spec ++++++ --- /var/tmp/diff_new_pack.33FIfQ/_old 2014-04-26 10:08:31.000000000 +0200 +++ /var/tmp/diff_new_pack.33FIfQ/_new 2014-04-26 10:08:31.000000000 +0200 @@ -17,7 +17,7 @@ Name: mdds -Version: 0.10.2 +Version: 0.10.3 Release: 0 Summary: A collection of multi-dimensional data structure and indexing algorithm License: MIT ++++++ mdds_0.10.2.tar.bz2 -> mdds_0.10.3.tar.bz2 ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/NEWS new/mdds_0.10.3/NEWS --- old/mdds_0.10.2/NEWS 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/NEWS 2014-04-23 21:22:00.000000000 +0200 @@ -1,3 +1,23 @@ +mdds 0.10.3 + +* multi_type_vector + + * added 2 variants of release_range() that take start and end positions, + to allow releasing of elements in specified interval. One of the + variants takes iterator as a block position hint. + + * iterator release_range(size_type start_pos, size_type end_pos) + + * iterator release_range(const iterator& pos_hint, size_type start_pos, size_type end_pos) + + * added push_back() and push_back_empty(), to allow efficient way to + append new values to the end of the container. + + * template<typename _T> + iterator push_back(const _T& value) + + * iterator push_back_empty() + mdds 0.10.2 * multi_type_vector diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/configure new/mdds_0.10.3/configure --- old/mdds_0.10.2/configure 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/configure 2014-04-23 21:22:00.000000000 +0200 @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for mdds 0.10.2. +# Generated by GNU Autoconf 2.69 for mdds 0.10.3. # # Report bugs to <kohei.yoshida@gmail.com>. # @@ -579,8 +579,8 @@ # Identity of this package. PACKAGE_NAME='mdds' PACKAGE_TARNAME='mdds' -PACKAGE_VERSION='0.10.2' -PACKAGE_STRING='mdds 0.10.2' +PACKAGE_VERSION='0.10.3' +PACKAGE_STRING='mdds 0.10.3' PACKAGE_BUGREPORT='kohei.yoshida@gmail.com' PACKAGE_URL='' @@ -1181,7 +1181,7 @@ # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures mdds 0.10.2 to adapt to many kinds of systems. +\`configure' configures mdds 0.10.3 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1242,7 +1242,7 @@ if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of mdds 0.10.2:";; + short | recursive ) echo "Configuration of mdds 0.10.3:";; esac cat <<\_ACEOF @@ -1335,7 +1335,7 @@ test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -mdds configure 0.10.2 +mdds configure 0.10.3 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -1352,7 +1352,7 @@ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by mdds $as_me 0.10.2, which was +It was created by mdds $as_me 0.10.3, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -1701,7 +1701,7 @@ -VERSION=0.10.2 +VERSION=0.10.3 PACKAGE_TARNAME=mdds @@ -2298,7 +2298,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by mdds $as_me 0.10.2, which was +This file was extended by mdds $as_me 0.10.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -2351,7 +2351,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -mdds config.status 0.10.2 +mdds config.status 0.10.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -3455,7 +3455,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by mdds $as_me 0.10.2, which was +This file was extended by mdds $as_me 0.10.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -3508,7 +3508,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -mdds config.status 0.10.2 +mdds config.status 0.10.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -4613,7 +4613,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by mdds $as_me 0.10.2, which was +This file was extended by mdds $as_me 0.10.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -4666,7 +4666,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -mdds config.status 0.10.2 +mdds config.status 0.10.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" @@ -5772,7 +5772,7 @@ # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by mdds $as_me 0.10.2, which was +This file was extended by mdds $as_me 0.10.3, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -5825,7 +5825,7 @@ cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -mdds config.status 0.10.2 +mdds config.status 0.10.3 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/configure.ac new/mdds_0.10.3/configure.ac --- old/mdds_0.10.2/configure.ac 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/configure.ac 2014-04-23 21:22:00.000000000 +0200 @@ -1,4 +1,4 @@ -AC_INIT(mdds, 0.10.2, kohei.yoshida@gmail.com) +AC_INIT(mdds, 0.10.3, kohei.yoshida@gmail.com) VERSION=AC_PACKAGE_VERSION AC_SUBST(VERSION) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/include/mdds/multi_type_vector.hpp new/mdds_0.10.3/include/mdds/multi_type_vector.hpp --- old/mdds_0.10.2/include/mdds/multi_type_vector.hpp 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/include/mdds/multi_type_vector.hpp 2014-04-23 21:22:00.000000000 +0200 @@ -1,6 +1,6 @@ /************************************************************************* * - * Copyright (c) 2011-2013 Kohei Yoshida + * Copyright (c) 2011-2014 Kohei Yoshida * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -261,7 +261,7 @@ * position to yield any performance benefit.</p> * * <p>The caller is responsible for ensuring that the passed iterator is - * valid. The behavior of this method when passing an invalid iteraotr is + * valid. The behavior of this method when passing an invalid iterator is * undefined.</p> * * <p>The method will throw an <code>std::out_of_range</code> exception @@ -319,7 +319,7 @@ * position to yield any performance benefit.</p> * * <p>The caller is responsible for ensuring that the passed iterator is - * valid. The behavior of this method when passing an invalid iteraotr is + * valid. The behavior of this method when passing an invalid iterator is * undefined.</p> * * <p>The method will throw an <code>std::out_of_range</code> exception if @@ -345,6 +345,27 @@ iterator set(const iterator& pos_hint, size_type pos, const _T& it_begin, const _T& it_end); /** + * Append a new value to the end of the container. + * + * @param value new value to be appended to the end of the container. + * + * @return iterator position pointing to the block where the value is + * appended, which in this case is always the last block of the + * container. + */ + template<typename _T> + iterator push_back(const _T& value); + + /** + * Append a new empty element to the end of the container. + * + * @return iterator position pointing to the block where the new empty + * element is appended, which in this case is always the last + * block of the container. + */ + iterator push_back_empty(); + + /** * Insert multiple values of identical type to a specified position. * Existing values that occur at or below the specified position will get * shifted after the insertion. No existing values will be overwritten by @@ -384,7 +405,7 @@ * position to yield any performance benefit.</p> * * <p>The caller is responsible for ensuring that the passed iterator is - * valid. The behavior of this method when passing an invalid iteraotr is + * valid. The behavior of this method when passing an invalid iterator is * undefined.</p> * * <p>The method will throw an <code>std::out_of_range</code> exception @@ -497,6 +518,49 @@ void release(); /** + * Make all elements within specified range empty, and relinquish the + * ownership of the elements in that range. All elements in the managed + * blocks within the range will be released and the container will no + * longer manage their life cycles after the call. + * + * <p>The method will throw an <code>std::out_of_range</code> exception if + * either the starting or the ending position is outside the current + * container size.</p> + * + * @param start_pos starting position + * @param end_pos ending position, inclusive. + * @return iterator position pointing to the block where the elements are + * released. + */ + iterator release_range(size_type start_pos, size_type end_pos); + + /** + * Make all elements within specified range empty, and relinquish the + * ownership of the elements in that range. All elements in the managed + * blocks within the range will be released and the container will no + * longer manage their life cycles after the call. + * + * <p>This variant takes an iterator as an additional parameter, which is + * used as a block position hint to speed up the lookup of the first block + * to empty. The other variant that doesn't take an iterator always + * starts the block lookup from the first block, which does not + * scale well as the block size grows.</p> + * + * <p>The method will throw an <code>std::out_of_range</code> exception if + * either the starting or the ending position is outside the current + * container size.</p> + * + * @param pos_hint iterator used as a block position hint, to specify + * which block to start when searching for the right + * blocks in which elements are to be released. + * @param start_pos starting position + * @param end_pos ending position, inclusive. + * @return iterator position pointing to the block where the elements are + * released. + */ + iterator release_range(const iterator& pos_hint, size_type start_pos, size_type end_pos); + + /** * Given the logical position of an element, get the iterator of the block * where the element is located, and its offset from the first element of * that block. @@ -661,7 +725,7 @@ * position to yield any performance benefit.</p> * * <p>The caller is responsible for ensuring that the passed iterator is - * valid. The behavior of this method when passing an invalid iteraotr is + * valid. The behavior of this method when passing an invalid iterator is * undefined.</p> * * <p>The method will throw an <code>std::out_of_range</code> exception if @@ -725,7 +789,7 @@ * position to yield any performance benefit.</p> * * <p>The caller is responsible for ensuring that the passed iterator is - * valid. The behavior of this method when passing an invalid iteraotr is + * valid. The behavior of this method when passing an invalid iterator is * undefined.</p> * * <p>The method will throw an <code>std::out_of_range</code> exception if @@ -910,7 +974,9 @@ size_type start_pos_in_block2, size_type block_index2, multi_type_vector& dest, size_type dest_pos); - iterator set_empty_impl(size_type start_pos, size_type end_pos, size_type start_pos_in_block1, size_type block_index1); + iterator set_empty_impl( + size_type start_pos, size_type end_pos, size_type start_pos_in_block1, size_type block_index1, + bool overwrite); void swap_impl( multi_type_vector& other, size_type start_pos, size_type end_pos, size_type other_pos, @@ -1060,6 +1126,8 @@ size_type dst_index1, size_type dst_offset1, size_type dst_index2, size_type dst_offset2, size_type len, blocks_type& new_blocks); + bool append_empty(size_type len); + inline iterator get_iterator(size_type block_index, size_type start_row) { typename blocks_type::iterator block_pos = m_blocks.begin(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/include/mdds/multi_type_vector_def.inl new/mdds_0.10.3/include/mdds/multi_type_vector_def.inl --- old/mdds_0.10.2/include/mdds/multi_type_vector_def.inl 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/include/mdds/multi_type_vector_def.inl 2014-04-23 21:22:00.000000000 +0200 @@ -1,6 +1,6 @@ /************************************************************************* * - * Copyright (c) 2012-2013 Kohei Yoshida + * Copyright (c) 2012-2014 Kohei Yoshida * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -494,6 +494,69 @@ template<typename _CellBlockFunc> template<typename _T> typename multi_type_vector<_CellBlockFunc>::iterator +multi_type_vector<_CellBlockFunc>::push_back(const _T& value) +{ + element_category_type cat = mdds_mtv_get_element_type(value); + + block* blk_last = m_blocks.empty() ? NULL : m_blocks.back(); + if (!blk_last || !blk_last->mp_data || cat != get_block_type(*blk_last->mp_data)) + { + // Either there is no block, or the last block is empty or of + // different type. Append a new block. + size_type block_index = m_blocks.size(); + size_type start_pos = m_cur_size; + + m_blocks.push_back(new block(1)); + block* blk = m_blocks.back(); + create_new_block_with_new_cell(blk->mp_data, value); + ++m_cur_size; + + return get_iterator(block_index, start_pos); + } + + assert(blk_last); + assert(blk_last->mp_data); + assert(cat == get_block_type(*blk_last->mp_data)); + + // Append the new value to the last block. + size_type block_index = m_blocks.size() - 1; + size_type start_pos = m_cur_size - blk_last->m_size; + + mdds_mtv_append_value(*blk_last->mp_data, value); + ++blk_last->m_size; + ++m_cur_size; + + return get_iterator(block_index, start_pos); +} + +template<typename _CellBlockFunc> +typename multi_type_vector<_CellBlockFunc>::iterator +multi_type_vector<_CellBlockFunc>::push_back_empty() +{ + size_type last_block_size = 0; + if (!m_blocks.empty()) + last_block_size = m_blocks.back()->m_size; + + size_type block_index = m_blocks.size(); + size_type start_pos = m_cur_size; + + if (!append_empty(1)) + { + // Last empty block has been extended. + --block_index; + start_pos -= last_block_size; + } + + // Get the iterator of the last block. + typename blocks_type::iterator block_pos = m_blocks.end(); + --block_pos; + + return iterator(block_pos, m_blocks.end(), start_pos, block_index); +} + +template<typename _CellBlockFunc> +template<typename _T> +typename multi_type_vector<_CellBlockFunc>::iterator multi_type_vector<_CellBlockFunc>::insert(size_type pos, const _T& it_begin, const _T& it_end) { size_type block_index = 0, start_pos = 0; @@ -1204,6 +1267,29 @@ } template<typename _CellBlockFunc> +typename multi_type_vector<_CellBlockFunc>::iterator +multi_type_vector<_CellBlockFunc>::release_range(size_type start_pos, size_type end_pos) +{ + size_type start_pos_in_block1 = 0; + size_type block_index1 = 0; + if (!get_block_position(start_pos, start_pos_in_block1, block_index1)) + throw std::out_of_range("Block position not found!"); + + return set_empty_impl(start_pos, end_pos, start_pos_in_block1, block_index1, false); +} + +template<typename _CellBlockFunc> +typename multi_type_vector<_CellBlockFunc>::iterator +multi_type_vector<_CellBlockFunc>::release_range( + const iterator& pos_hint, size_type start_pos, size_type end_pos) +{ + size_type start_pos_in_block1 = 0; + size_type block_index1 = 0; + get_block_position(pos_hint, start_pos, start_pos_in_block1, block_index1); + return set_empty_impl(start_pos, end_pos, start_pos_in_block1, block_index1, false); +} + +template<typename _CellBlockFunc> typename multi_type_vector<_CellBlockFunc>::position_type multi_type_vector<_CellBlockFunc>::position(size_type pos) { @@ -1361,7 +1447,7 @@ if (!get_block_position(start_pos, start_pos_in_block1, block_index1)) throw std::out_of_range("Block position not found!"); - return set_empty_impl(start_pos, end_pos, start_pos_in_block1, block_index1); + return set_empty_impl(start_pos, end_pos, start_pos_in_block1, block_index1, true); } template<typename _CellBlockFunc> @@ -1371,7 +1457,7 @@ size_type start_pos_in_block1 = 0; size_type block_index1 = 0; get_block_position(pos_hint, start_pos, start_pos_in_block1, block_index1); - return set_empty_impl(start_pos, end_pos, start_pos_in_block1, block_index1); + return set_empty_impl(start_pos, end_pos, start_pos_in_block1, block_index1, true); } template<typename _CellBlockFunc> @@ -1381,7 +1467,12 @@ multi_type_vector& dest, size_type dest_pos) { if (start_pos > end_pos) - throw std::out_of_range("Start row is larger than the end row."); + { + std::ostringstream os; + os << "multi_type_vector::transfer_impl: start position is larger than the end position. (start="; + os << start_pos << ", end=" << end_pos << ")"; + throw std::out_of_range(os.str()); + } size_type start_pos_in_block2 = start_pos_in_block1; size_type block_index2 = block_index1; @@ -1744,7 +1835,8 @@ template<typename _CellBlockFunc> typename multi_type_vector<_CellBlockFunc>::iterator multi_type_vector<_CellBlockFunc>::set_empty_impl( - size_type start_pos, size_type end_pos, size_type start_pos_in_block1, size_type block_index1) + size_type start_pos, size_type end_pos, size_type start_pos_in_block1, size_type block_index1, + bool overwrite) { if (start_pos > end_pos) throw std::out_of_range("Start row is larger than the end row."); @@ -1761,10 +1853,10 @@ iterator ret_it; if (block_index1 == block_index2) - ret_it = set_empty_in_single_block(start_pos, end_pos, block_index1, start_pos_in_block1, true); + ret_it = set_empty_in_single_block(start_pos, end_pos, block_index1, start_pos_in_block1, overwrite); else ret_it = set_empty_in_multi_blocks( - start_pos, end_pos, block_index1, start_pos_in_block1, block_index2, start_pos_in_block2, true); + start_pos, end_pos, block_index1, start_pos_in_block1, block_index2, start_pos_in_block2, overwrite); #ifdef MDDS_MULTI_TYPE_VECTOR_DEBUG if (!check_block_integrity()) @@ -2838,6 +2930,39 @@ } template<typename _CellBlockFunc> +bool multi_type_vector<_CellBlockFunc>::append_empty(size_type len) +{ + // Append empty cells. + if (m_blocks.empty()) + { + // No existing block. Create a new one. + assert(m_cur_size == 0); + m_blocks.push_back(new block(len)); + m_cur_size = len; + return true; + } + + bool new_block_added = false; + block* blk_last = m_blocks.back(); + + if (!blk_last->mp_data) + { + // Last block is empty. Just increase its size. + blk_last->m_size += len; + } + else + { + // Append a new empty block. + m_blocks.push_back(new block(len)); + new_block_added = true; + } + + m_cur_size += len; + + return new_block_added; +} + +template<typename _CellBlockFunc> void multi_type_vector<_CellBlockFunc>::exchange_elements( const element_block_type& src_data, size_type src_offset, size_type dst_index1, size_type dst_offset1, size_type dst_index2, size_type dst_offset2, @@ -3452,29 +3577,7 @@ if (new_size > m_cur_size) { // Append empty cells. - if (m_blocks.empty()) - { - // No existing block. Create a new one. - assert(m_cur_size == 0); - m_blocks.push_back(new block(new_size)); - m_cur_size = new_size; - return; - } - - block* blk_last = m_blocks.back(); - size_type delta = new_size - m_cur_size; - - if (!blk_last->mp_data) - { - // Last block is empty. Just increase its size. - blk_last->m_size += delta; - } - else - { - // Append a new empty block. - m_blocks.push_back(new block(delta)); - } - m_cur_size = new_size; + append_empty(new_size - m_cur_size); return; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/src/multi_type_vector_test_custom.cpp new/mdds_0.10.3/src/multi_type_vector_test_custom.cpp --- old/mdds_0.10.2/src/multi_type_vector_test_custom.cpp 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/src/multi_type_vector_test_custom.cpp 2014-04-23 21:22:00.000000000 +0200 @@ -1,6 +1,6 @@ /************************************************************************* * - * Copyright (c) 2012 Kohei Yoshida + * Copyright (c) 2012-2014 Kohei Yoshida * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -1430,10 +1430,62 @@ { stack_printer __stack_printer__("::mtv_test_release"); mtv_type db(3); - muser_cell c1(1.2), c2(1.3); + muser_cell c1(1.2), c2(1.3); // allocated on the stack. db.set(0, &c1); db.set(2, &c2); db.release(); // Prevent invalid free when db goes out of scope. + + // Variant with no argument should make the container empty after the call. + assert(db.empty()); + + db.push_back(new muser_cell(10.0)); + db.push_back(&c1); + db.push_back(&c2); + db.push_back(new muser_cell(10.1)); + + assert(db.size() == 4); + assert(db.block_size() == 1); + + // Release those allocated on the stack to avoid double deletion. + mtv_type::iterator it = db.release_range(1, 2); + + // Check the integrity of the returned iterator. + assert(it->type == mtv::element_type_empty); + assert(it->size == 2); + mtv_type::iterator check = it; + --check; + assert(check == db.begin()); + check = it; + ++check; + ++check; + assert(check == db.end()); + + db.push_back(new muser_cell(10.2)); + assert(db.size() == 5); + + muser_cell* p1 = db.get<muser_cell*>(3); + muser_cell* p2 = db.get<muser_cell*>(4); + assert(p1->value == 10.1); + assert(p2->value == 10.2); + + // Pass iterator as a position hint. + it = db.release_range(it, 3, 4); + assert(db.block_size() == 2); + + // Check the returned iterator. + check = it; + --check; + assert(check == db.begin()); + assert(check->type == element_type_muser_block); + assert(check->size == 1); + assert(it->type == mtv::element_type_empty); + assert(it->size == 4); + ++it; + assert(it == db.end()); + + // It should be safe to delete these instances now that they've been released. + delete p1; + delete p2; } void mtv_test_construction_with_array() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/mdds_0.10.2/src/multi_type_vector_test_default.cpp new/mdds_0.10.3/src/multi_type_vector_test_default.cpp --- old/mdds_0.10.2/src/multi_type_vector_test_default.cpp 2014-02-12 15:34:42.000000000 +0100 +++ new/mdds_0.10.3/src/multi_type_vector_test_default.cpp 2014-04-23 21:22:00.000000000 +0200 @@ -1,6 +1,6 @@ /************************************************************************* * - * Copyright (c) 2011-2013 Kohei Yoshida + * Copyright (c) 2011-2014 Kohei Yoshida * * Permission is hereby granted, free of charge, to any person * obtaining a copy of this software and associated documentation @@ -4880,6 +4880,104 @@ it = db1.transfer(1, 2, db2, 1); } +void mtv_test_push_back() +{ + stack_printer __stack_printer__("::mtv_test_push_back"); + + mtv_type db; + assert(db.size() == 0); + assert(db.block_size() == 0); + + // Append an empty element into an empty container. + mtv_type::iterator it = db.push_back_empty(); + assert(db.size() == 1); + assert(db.block_size() == 1); + assert(it->size == 1); + assert(it->type == mtv::element_type_empty); + assert(it->__private_data.block_index == 0); + assert(it == db.begin()); + ++it; + assert(it == db.end()); + + // ... and again. + it = db.push_back_empty(); + assert(db.size() == 2); + assert(db.block_size() == 1); + assert(it->size == 2); + assert(it->type == mtv::element_type_empty); + assert(it->__private_data.block_index == 0); + assert(it == db.begin()); + ++it; + assert(it == db.end()); + + // Append non-empty this time. + it = db.push_back(1.1); + assert(db.size() == 3); + assert(db.block_size() == 2); + assert(it->size == 1); + assert(it->type == mtv::element_type_numeric); + assert(it->__private_data.block_index == 1); + mtv_type::iterator check = it; + --check; + assert(check == db.begin()); + ++it; + assert(it == db.end()); + + // followed by an empty element again. + it = db.push_back_empty(); + assert(db.size() == 4); + assert(db.block_size() == 3); + assert(it->size == 1); + assert(it->type == mtv::element_type_empty); + assert(it->__private_data.block_index == 2); + check = it; + --check; + --check; + assert(check == db.begin()); + ++it; + assert(it == db.end()); + + // Check the values. + assert(db.is_empty(0)); + assert(db.is_empty(1)); + assert(db.get<double>(2) == 1.1); + assert(db.is_empty(3)); + + // Empty the container and push back a non-empty element. + db.clear(); + it = db.push_back(string("push me")); + assert(db.size() == 1); + assert(db.block_size() == 1); + assert(it->size == 1); + assert(it->type == mtv::element_type_string); + assert(it->__private_data.block_index == 0); + assert(it == db.begin()); + ++it; + assert(it == db.end()); + assert(db.get<string>(0) == "push me"); + + // Push back a non-empty element of the same type. + it = db.push_back(string("again")); + assert(db.size() == 2); + assert(db.block_size() == 1); + assert(it->size == 2); + assert(it->type == mtv::element_type_string); + assert(it->__private_data.block_index == 0); + assert(it == db.begin()); + ++it; + assert(it == db.end()); + + assert(db.get<string>(0) == "push me"); + assert(db.get<string>(1) == "again"); + + // Push back another non-empty element of a different type. + it = db.push_back(23.4); + assert(db.size() == 3); + assert(db.block_size() == 2); + assert(it->size == 1); + assert(it->type == mtv::element_type_numeric); +} + } int main (int argc, char **argv) @@ -4916,6 +5014,7 @@ mtv_test_value_type(); mtv_test_block_identifier(); mtv_test_transfer(); + mtv_test_push_back(); cout << "Test finished successfully!" << endl; return EXIT_SUCCESS; -- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@hilbert.suse.de