Commit d9db2fe2 by Maarten L. Hekkelman

insert

parent 19a89aeb
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
cmake_minimum_required(VERSION 3.16) cmake_minimum_required(VERSION 3.16)
# set the project name # set the project name
project(cifpp VERSION 4.2.1 LANGUAGES CXX) project(cifpp VERSION 5.0.0 LANGUAGES CXX)
list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") list(PREPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
......
...@@ -12,8 +12,6 @@ include(CheckCXXSourceRuns) ...@@ -12,8 +12,6 @@ include(CheckCXXSourceRuns)
cmake_push_check_state() cmake_push_check_state()
# set(CMAKE_CXX_STANDARD 17)
check_include_file_cxx("atomic" _CXX_ATOMIC_HAVE_HEADER) check_include_file_cxx("atomic" _CXX_ATOMIC_HAVE_HEADER)
mark_as_advanced(_CXX_ATOMIC_HAVE_HEADER) mark_as_advanced(_CXX_ATOMIC_HAVE_HEADER)
......
...@@ -12,8 +12,6 @@ include(CheckCXXSourceCompiles) ...@@ -12,8 +12,6 @@ include(CheckCXXSourceCompiles)
cmake_push_check_state() cmake_push_check_state()
# set(CMAKE_CXX_STANDARD 17)
check_include_file_cxx("filesystem" _CXX_FILESYSTEM_HAVE_HEADER) check_include_file_cxx("filesystem" _CXX_FILESYSTEM_HAVE_HEADER)
mark_as_advanced(_CXX_FILESYSTEM_HAVE_HEADER) mark_as_advanced(_CXX_FILESYSTEM_HAVE_HEADER)
......
...@@ -410,6 +410,14 @@ class category ...@@ -410,6 +410,14 @@ class category
return result; return result;
} }
std::string_view get_column_name(uint16_t ix) const
{
if (ix >= m_columns.size())
throw std::out_of_range("column index is out of range");
return m_columns[ix].m_name;
}
uint16_t add_column(std::string_view column_name) uint16_t add_column(std::string_view column_name)
{ {
using namespace std::literals; using namespace std::literals;
......
...@@ -111,6 +111,7 @@ class row ...@@ -111,6 +111,7 @@ class row
private: private:
friend class item_handle; friend class item_handle;
friend class category_index; friend class category_index;
friend class row_initializer;
template <typename, typename...> template <typename, typename...>
friend class iterator_impl; friend class iterator_impl;
...@@ -138,6 +139,7 @@ class row_handle ...@@ -138,6 +139,7 @@ class row_handle
friend class item_handle; friend class item_handle;
friend class category; friend class category;
friend class category_index; friend class category_index;
friend class row_initializer;
row_handle() = default; row_handle() = default;
...@@ -218,6 +220,7 @@ class row_handle ...@@ -218,6 +220,7 @@ class row_handle
private: private:
uint16_t get_column_ix(std::string_view name) const; uint16_t get_column_ix(std::string_view name) const;
std::string_view get_column_name(uint16_t ix) const;
uint16_t add_column(std::string_view name); uint16_t add_column(std::string_view name);
...@@ -257,6 +260,8 @@ class row_initializer ...@@ -257,6 +260,8 @@ class row_initializer
{ {
} }
row_initializer(row_handle rh);
private: private:
std::vector<item> m_items; std::vector<item> m_items;
}; };
......
...@@ -1310,6 +1310,8 @@ category::iterator category::insert_impl(const_iterator pos, row *n) ...@@ -1310,6 +1310,8 @@ category::iterator category::insert_impl(const_iterator pos, row *n)
if (n == nullptr) if (n == nullptr)
throw std::runtime_error("Invalid pointer passed to insert"); throw std::runtime_error("Invalid pointer passed to insert");
try
{
// First, make sure all mandatory fields are supplied // First, make sure all mandatory fields are supplied
if (m_cat_validator != nullptr) if (m_cat_validator != nullptr)
{ {
...@@ -1381,11 +1383,13 @@ category::iterator category::insert_impl(const_iterator pos, row *n) ...@@ -1381,11 +1383,13 @@ category::iterator category::insert_impl(const_iterator pos, row *n)
n = n->m_next = m_head->m_next; n = n->m_next = m_head->m_next;
} }
return iterator(*this, n); return iterator(*this, n);
}
catch(const std::exception& e)
{
delete_row(n);
throw;
}
} }
category::iterator category::erase_impl(const_iterator pos) category::iterator category::erase_impl(const_iterator pos)
......
...@@ -39,9 +39,25 @@ uint16_t row_handle::get_column_ix(std::string_view name) const ...@@ -39,9 +39,25 @@ uint16_t row_handle::get_column_ix(std::string_view name) const
return m_category->get_column_ix(name); return m_category->get_column_ix(name);
} }
std::string_view row_handle::get_column_name(uint16_t ix) const
{
return m_category->get_column_name(ix);
}
uint16_t row_handle::add_column(std::string_view name) uint16_t row_handle::add_column(std::string_view name)
{ {
return m_category->add_column(name); return m_category->add_column(name);
} }
// --------------------------------------------------------------------
row_initializer::row_initializer(row_handle rh)
{
row *r = rh;
auto &cat = *rh.m_category;
for (auto i = r->m_head; i != nullptr; i = i->m_next)
m_items.emplace_back(cat.get_column_name(i->m_column_ix), i->text());
}
} // namespace cif::v2 } // namespace cif::v2
\ No newline at end of file
...@@ -130,6 +130,32 @@ BOOST_AUTO_TEST_CASE(cc_2) ...@@ -130,6 +130,32 @@ BOOST_AUTO_TEST_CASE(cc_2)
} }
} }
BOOST_AUTO_TEST_CASE(item_1)
{
using namespace cif::v2;
item i1("1", "1");
item i2("2", 2.0);
item i3("3", '3');
item ci1(i1);
item ci2(i2);
item ci3(i3);
BOOST_CHECK_EQUAL(i1.value(), ci1.value());
BOOST_CHECK_EQUAL(i2.value(), ci2.value());
BOOST_CHECK_EQUAL(i3.value(), ci3.value());
item mi1(std::move(i1));
item mi2(std::move(i2));
item mi3(std::move(i3));
BOOST_CHECK_EQUAL(i1.value(), mi1.value());
BOOST_CHECK_EQUAL(i2.value(), mi2.value());
BOOST_CHECK_EQUAL(i3.value(), mi3.value());
}
// -------------------------------------------------------------------- // --------------------------------------------------------------------
...@@ -243,6 +269,27 @@ BOOST_AUTO_TEST_CASE(c_2) ...@@ -243,6 +269,27 @@ BOOST_AUTO_TEST_CASE(c_2)
BOOST_CHECK_EQUAL(c.size(), 3); BOOST_CHECK_EQUAL(c.size(), 3);
} }
BOOST_AUTO_TEST_CASE(c_3)
{
std::tuple<int,const char*> D[] = {
{1, "aap"},
{2, "noot"},
{3, "mies"}
};
cif::v2::category c("foo");
for (const auto &[id, s] : D)
c.emplace({ {"id", id}, { "s", s} });
cif::v2::category c2("bar");
for (auto r : c)
c2.emplace(r);
// BOOST_CHECK(c == c2);
}
BOOST_AUTO_TEST_CASE(ci_1) BOOST_AUTO_TEST_CASE(ci_1)
{ {
cif::v2::category c("foo"); cif::v2::category c("foo");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment