mirror of https://github.com/KLayout/klayout.git
Fixed issue #1632 (at least partially): introducing non-const versions of RDB iterators and access methods
This commit is contained in:
parent
230bacf725
commit
7c4133b9e4
|
|
@ -88,6 +88,49 @@ private:
|
|||
rdb::Database::const_item_ref_iterator m_iter;
|
||||
};
|
||||
|
||||
class ItemRefUnwrappingNonConstIterator
|
||||
{
|
||||
public:
|
||||
typedef rdb::Database::const_item_ref_iterator::iterator_category iterator_category;
|
||||
typedef rdb::Database::const_item_ref_iterator::difference_type difference_type;
|
||||
typedef rdb::Item value_type;
|
||||
typedef rdb::Item &reference;
|
||||
typedef rdb::Item *pointer;
|
||||
|
||||
ItemRefUnwrappingNonConstIterator (rdb::Database::item_ref_iterator i)
|
||||
: m_iter (i)
|
||||
{ }
|
||||
|
||||
bool operator== (const ItemRefUnwrappingNonConstIterator &d) const
|
||||
{
|
||||
return m_iter == d.m_iter;
|
||||
}
|
||||
|
||||
bool operator!= (const ItemRefUnwrappingNonConstIterator &d) const
|
||||
{
|
||||
return m_iter != d.m_iter;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator &operator++ ()
|
||||
{
|
||||
++m_iter;
|
||||
return *this;
|
||||
}
|
||||
|
||||
rdb::Item &operator* () const
|
||||
{
|
||||
return (*m_iter).operator* ();
|
||||
}
|
||||
|
||||
rdb::Item *operator-> () const
|
||||
{
|
||||
return (*m_iter).operator-> ();
|
||||
}
|
||||
|
||||
private:
|
||||
rdb::Database::item_ref_iterator m_iter;
|
||||
};
|
||||
|
||||
// ---------------------------------------------------------------
|
||||
// rdb::Reference binding
|
||||
|
||||
|
|
@ -105,7 +148,12 @@ Class<rdb::Reference> decl_RdbReference ("rdb", "RdbReference",
|
|||
"\n"
|
||||
"This method has been introduced in version 0.23."
|
||||
) +
|
||||
gsi::method ("trans", &rdb::Reference::trans,
|
||||
gsi::method ("database", (rdb::Database *(rdb::Reference::*)()) &rdb::Reference::database,
|
||||
"@brief Gets the database object that category is associated with (non-const version)\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.29."
|
||||
) +
|
||||
gsi::method ("trans", &rdb::Reference::trans,
|
||||
"@brief Gets the transformation for this reference\n"
|
||||
"The transformation describes the transformation of the child cell into the parent cell. In that sense that is the "
|
||||
"usual transformation of a cell reference.\n"
|
||||
|
|
@ -141,6 +189,16 @@ static rdb::References::const_iterator end_references (const rdb::Cell *cell)
|
|||
return cell->references ().end ();
|
||||
}
|
||||
|
||||
static rdb::References::iterator begin_references_nc (rdb::Cell *cell)
|
||||
{
|
||||
return cell->references ().begin ();
|
||||
}
|
||||
|
||||
static rdb::References::iterator end_references_nc (rdb::Cell *cell)
|
||||
{
|
||||
return cell->references ().end ();
|
||||
}
|
||||
|
||||
static void add_reference (rdb::Cell *cell, const rdb::Reference &ref)
|
||||
{
|
||||
cell->references ().insert (ref);
|
||||
|
|
@ -163,6 +221,18 @@ ItemRefUnwrappingIterator cell_items_end (const rdb::Cell *cell)
|
|||
return cell->database ()->items_by_cell (cell->id ()).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator cell_items_begin_non_const (rdb::Cell *cell)
|
||||
{
|
||||
tl_assert (cell->database ());
|
||||
return cell->database ()->items_by_cell (cell->id ()).first;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator cell_items_end_non_const (rdb::Cell *cell)
|
||||
{
|
||||
tl_assert (cell->database ());
|
||||
return cell->database ()->items_by_cell (cell->id ()).second;
|
||||
}
|
||||
|
||||
Class<rdb::Cell> decl_RdbCell ("rdb", "RdbCell",
|
||||
gsi::method ("rdb_id", &rdb::Cell::id,
|
||||
"@brief Gets the cell ID\n"
|
||||
|
|
@ -175,12 +245,22 @@ Class<rdb::Cell> decl_RdbCell ("rdb", "RdbCell",
|
|||
"\n"
|
||||
"This method has been introduced in version 0.23."
|
||||
) +
|
||||
gsi::method ("database", (rdb::Database *(rdb::Cell::*)()) &rdb::Cell::database,
|
||||
"@brief Gets the database object that category is associated with (non-const version)\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.29."
|
||||
) +
|
||||
gsi::iterator_ext ("each_item", &cell_items_begin, &cell_items_end,
|
||||
"@brief Iterates over all items inside the database which are associated with this cell\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.23."
|
||||
) +
|
||||
gsi::method ("name", &rdb::Cell::name,
|
||||
gsi::iterator_ext ("each_item", &cell_items_begin_non_const, &cell_items_end_non_const,
|
||||
"@brief Iterates over all items inside the database which are associated with this cell (non-const version)\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.29."
|
||||
) +
|
||||
gsi::method ("name", &rdb::Cell::name,
|
||||
"@brief Gets the cell name\n"
|
||||
"The cell name is an string that identifies the category in the database. "
|
||||
"Additionally, a cell may carry a variant identifier which is a string that uniquely identifies a cell "
|
||||
|
|
@ -215,6 +295,11 @@ Class<rdb::Cell> decl_RdbCell ("rdb", "RdbCell",
|
|||
) +
|
||||
gsi::iterator_ext ("each_reference", &begin_references, &end_references,
|
||||
"@brief Iterates over all references\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_reference", &begin_references_nc, &end_references_nc,
|
||||
"@brief Iterates over all references (non-const version)\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.23."
|
||||
),
|
||||
"@brief A cell inside the report database\n"
|
||||
"This class represents a cell in the report database. There is not necessarily a 1:1 correspondence of RDB cells "
|
||||
|
|
@ -226,12 +311,22 @@ Class<rdb::Cell> decl_RdbCell ("rdb", "RdbCell",
|
|||
// ---------------------------------------------------------------
|
||||
// rdb::Category binding
|
||||
|
||||
static rdb::Categories::iterator begin_sub_categories (rdb::Category *cat)
|
||||
static rdb::Categories::const_iterator begin_sub_categories (const rdb::Category *cat)
|
||||
{
|
||||
return cat->sub_categories ().begin ();
|
||||
}
|
||||
|
||||
static rdb::Categories::iterator end_sub_categories (rdb::Category *cat)
|
||||
static rdb::Categories::const_iterator end_sub_categories (const rdb::Category *cat)
|
||||
{
|
||||
return cat->sub_categories ().end ();
|
||||
}
|
||||
|
||||
static rdb::Categories::iterator begin_sub_categories_non_const (rdb::Category *cat)
|
||||
{
|
||||
return cat->sub_categories ().begin ();
|
||||
}
|
||||
|
||||
static rdb::Categories::iterator end_sub_categories_non_const (rdb::Category *cat)
|
||||
{
|
||||
return cat->sub_categories ().end ();
|
||||
}
|
||||
|
|
@ -248,6 +343,18 @@ ItemRefUnwrappingIterator category_items_end (const rdb::Category *cat)
|
|||
return cat->database ()->items_by_category (cat->id ()).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator category_items_begin_non_const (rdb::Category *cat)
|
||||
{
|
||||
tl_assert (cat->database ());
|
||||
return cat->database ()->items_by_category (cat->id ()).first;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator category_items_end_non_const (rdb::Category *cat)
|
||||
{
|
||||
tl_assert (cat->database ());
|
||||
return cat->database ()->items_by_category (cat->id ()).second;
|
||||
}
|
||||
|
||||
static void scan_layer (rdb::Category *cat, const db::Layout &layout, unsigned int layer, const db::Cell *from_cell, int levels, bool with_properties)
|
||||
{
|
||||
rdb::scan_layer (cat, layout, layer, from_cell, levels, with_properties);
|
||||
|
|
@ -299,6 +406,11 @@ Class<rdb::Category> decl_RdbCategory ("rdb", "RdbCategory",
|
|||
"\n"
|
||||
"This method has been introduced in version 0.23."
|
||||
) +
|
||||
gsi::iterator_ext ("each_item", &category_items_begin_non_const, &category_items_end_non_const,
|
||||
"@brief Iterates over all items inside the database which are associated with this category (non-const version)\n"
|
||||
"\n"
|
||||
"This method has been introduced in version 0.29."
|
||||
) +
|
||||
gsi::method_ext ("scan_shapes", &scan_shapes, gsi::arg ("iter"), gsi::arg ("flat", false), gsi::arg ("with_properties", true),
|
||||
"@brief Scans the polygon or edge shapes from the shape iterator into the category\n"
|
||||
"Creates RDB items for each polygon or edge shape read from the iterator and puts them into this category.\n"
|
||||
|
|
@ -379,12 +491,23 @@ Class<rdb::Category> decl_RdbCategory ("rdb", "RdbCategory",
|
|||
) +
|
||||
gsi::iterator_ext ("each_sub_category", &begin_sub_categories, &end_sub_categories,
|
||||
"@brief Iterates over all sub-categories\n"
|
||||
"\n"
|
||||
"The const version has been added in version 0.29."
|
||||
) +
|
||||
gsi::method ("parent", (rdb::Category *(rdb::Category::*) ()) &rdb::Category::parent,
|
||||
gsi::iterator_ext ("each_sub_category", &begin_sub_categories_non_const, &end_sub_categories_non_const,
|
||||
"@brief Iterates over all sub-categories (non-const version)\n"
|
||||
) +
|
||||
gsi::method ("parent", (const rdb::Category *(rdb::Category::*) () const) &rdb::Category::parent,
|
||||
"@brief Gets the parent category of this category\n"
|
||||
"@return The parent category or nil if this category is a top-level category\n"
|
||||
"\n"
|
||||
"The const version has been added in version 0.29."
|
||||
) +
|
||||
gsi::method ("num_items", &rdb::Category::num_items,
|
||||
gsi::method ("parent", (rdb::Category *(rdb::Category::*) ()) &rdb::Category::parent,
|
||||
"@brief Gets the parent category of this category (non-const version)\n"
|
||||
"@return The parent category or nil if this category is a top-level category\n"
|
||||
) +
|
||||
gsi::method ("num_items", &rdb::Category::num_items,
|
||||
"@brief Gets the number of items in this category\n"
|
||||
"The number of items includes the items in sub-categories of this category.\n"
|
||||
) +
|
||||
|
|
@ -923,6 +1046,16 @@ rdb::Items::const_iterator database_items_end (const rdb::Database *db)
|
|||
return db->items ().end ();
|
||||
}
|
||||
|
||||
rdb::Items::iterator database_items_begin_nc (rdb::Database *db)
|
||||
{
|
||||
return db->items_non_const ().begin ();
|
||||
}
|
||||
|
||||
rdb::Items::iterator database_items_end_nc (rdb::Database *db)
|
||||
{
|
||||
return db->items_non_const ().end ();
|
||||
}
|
||||
|
||||
ItemRefUnwrappingIterator database_items_begin_cell (const rdb::Database *db, rdb::id_type cell_id)
|
||||
{
|
||||
return db->items_by_cell (cell_id).first;
|
||||
|
|
@ -933,6 +1066,16 @@ ItemRefUnwrappingIterator database_items_end_cell (const rdb::Database *db, rdb:
|
|||
return db->items_by_cell (cell_id).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator database_items_begin_cell_nc (rdb::Database *db, rdb::id_type cell_id)
|
||||
{
|
||||
return db->items_by_cell (cell_id).first;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator database_items_end_cell_nc (rdb::Database *db, rdb::id_type cell_id)
|
||||
{
|
||||
return db->items_by_cell (cell_id).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingIterator database_items_begin_cat (const rdb::Database *db, rdb::id_type cat_id)
|
||||
{
|
||||
return db->items_by_category (cat_id).first;
|
||||
|
|
@ -943,6 +1086,16 @@ ItemRefUnwrappingIterator database_items_end_cat (const rdb::Database *db, rdb::
|
|||
return db->items_by_category (cat_id).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator database_items_begin_cat_nc (rdb::Database *db, rdb::id_type cat_id)
|
||||
{
|
||||
return db->items_by_category (cat_id).first;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator database_items_end_cat_nc (rdb::Database *db, rdb::id_type cat_id)
|
||||
{
|
||||
return db->items_by_category (cat_id).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingIterator database_items_begin_cc (const rdb::Database *db, rdb::id_type cell_id, rdb::id_type cat_id)
|
||||
{
|
||||
return db->items_by_cell_and_category (cell_id, cat_id).first;
|
||||
|
|
@ -953,6 +1106,16 @@ ItemRefUnwrappingIterator database_items_end_cc (const rdb::Database *db, rdb::i
|
|||
return db->items_by_cell_and_category (cell_id, cat_id).second;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator database_items_begin_cc_nc (rdb::Database *db, rdb::id_type cell_id, rdb::id_type cat_id)
|
||||
{
|
||||
return db->items_by_cell_and_category (cell_id, cat_id).first;
|
||||
}
|
||||
|
||||
ItemRefUnwrappingNonConstIterator database_items_end_cc_nc (rdb::Database *db, rdb::id_type cell_id, rdb::id_type cat_id)
|
||||
{
|
||||
return db->items_by_cell_and_category (cell_id, cat_id).second;
|
||||
}
|
||||
|
||||
rdb::Categories::const_iterator database_begin_categories (const rdb::Database *db)
|
||||
{
|
||||
return db->categories ().begin ();
|
||||
|
|
@ -963,6 +1126,16 @@ rdb::Categories::const_iterator database_end_categories (const rdb::Database *db
|
|||
return db->categories ().end ();
|
||||
}
|
||||
|
||||
rdb::Categories::iterator database_end_categories_nc (rdb::Database *db)
|
||||
{
|
||||
return db->categories_non_const ().end ();
|
||||
}
|
||||
|
||||
rdb::Categories::iterator database_begin_categories_nc (rdb::Database *db)
|
||||
{
|
||||
return db->categories_non_const ().begin ();
|
||||
}
|
||||
|
||||
rdb::Cells::const_iterator database_begin_cells (const rdb::Database *db)
|
||||
{
|
||||
return db->cells ().begin ();
|
||||
|
|
@ -973,6 +1146,16 @@ rdb::Cells::const_iterator database_end_cells (const rdb::Database *db)
|
|||
return db->cells ().end ();
|
||||
}
|
||||
|
||||
rdb::Cells::iterator database_begin_cells_nc (rdb::Database *db)
|
||||
{
|
||||
return db->cells_non_const ().begin ();
|
||||
}
|
||||
|
||||
rdb::Cells::iterator database_end_cells_nc (rdb::Database *db)
|
||||
{
|
||||
return db->cells_non_const ().end ();
|
||||
}
|
||||
|
||||
const std::string &database_tag_name (const rdb::Database *db, rdb::id_type tag)
|
||||
{
|
||||
return db->tags ().tag (tag).name ();
|
||||
|
|
@ -1121,6 +1304,11 @@ Class<rdb::Database> decl_ReportDatabase ("rdb", "ReportDatabase",
|
|||
gsi::iterator_ext ("each_category", &database_begin_categories, &database_end_categories,
|
||||
"@brief Iterates over all top-level categories\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_category", &database_begin_categories_nc, &database_end_categories_nc,
|
||||
"@brief Iterates over all top-level categories (non-const version)\n"
|
||||
"\n"
|
||||
"The non-const variant has been added in version 0.29."
|
||||
) +
|
||||
gsi::method ("create_category", (rdb::Category *(rdb::Database::*) (const std::string &)) &rdb::Database::create_category, gsi::arg ("name"),
|
||||
"@brief Creates a new top level category\n"
|
||||
"@param name The name of the category\n"
|
||||
|
|
@ -1135,10 +1323,23 @@ Class<rdb::Database> decl_ReportDatabase ("rdb", "ReportDatabase",
|
|||
"@param path The full path to the category starting from the top level (subcategories separated by dots)\n"
|
||||
"@return The (const) category object or nil if the name is not valid\n"
|
||||
) +
|
||||
gsi::method ("category_by_path", &rdb::Database::category_by_name_non_const, gsi::arg ("path"),
|
||||
"@brief Gets a category by path (non-const version)\n"
|
||||
"@param path The full path to the category starting from the top level (subcategories separated by dots)\n"
|
||||
"@return The (const) category object or nil if the name is not valid\n"
|
||||
"\n"
|
||||
"This non-const variant has been introduced in version 0.29."
|
||||
) +
|
||||
gsi::method ("category_by_id", &rdb::Database::category_by_id, gsi::arg ("id"),
|
||||
"@brief Gets a category by ID\n"
|
||||
"@return The (const) category object or nil if the ID is not valid\n"
|
||||
) +
|
||||
gsi::method ("category_by_id", &rdb::Database::category_by_id_non_const, gsi::arg ("id"),
|
||||
"@brief Gets a category by ID (non-const version)\n"
|
||||
"@return The (const) category object or nil if the ID is not valid\n"
|
||||
"\n"
|
||||
"This non-const variant has been introduced in version 0.29."
|
||||
) +
|
||||
gsi::method ("create_cell", (rdb::Cell *(rdb::Database::*) (const std::string &)) &rdb::Database::create_cell, gsi::arg ("name"),
|
||||
"@brief Creates a new cell\n"
|
||||
"@param name The name of the cell\n"
|
||||
|
|
@ -1158,14 +1359,33 @@ Class<rdb::Database> decl_ReportDatabase ("rdb", "ReportDatabase",
|
|||
"@param qname The qualified name of the cell (name plus variant name optionally)\n"
|
||||
"@return The cell object or nil if no such cell exists\n"
|
||||
) +
|
||||
gsi::method ("cell_by_qname", &rdb::Database::cell_by_qname_non_const, gsi::arg ("qname"),
|
||||
"@brief Returns the cell for a given qualified name (non-const version)\n"
|
||||
"@param qname The qualified name of the cell (name plus variant name optionally)\n"
|
||||
"@return The cell object or nil if no such cell exists\n"
|
||||
"\n"
|
||||
"This non-const variant has been added version 0.29."
|
||||
) +
|
||||
gsi::method ("cell_by_id", &rdb::Database::cell_by_id, gsi::arg ("id"),
|
||||
"@brief Returns the cell for a given ID\n"
|
||||
"@param id The ID of the cell\n"
|
||||
"@return The cell object or nil if no cell with that ID exists\n"
|
||||
) +
|
||||
gsi::method ("cell_by_id", &rdb::Database::cell_by_id_non_const, gsi::arg ("id"),
|
||||
"@brief Returns the cell for a given ID (non-const version)\n"
|
||||
"@param id The ID of the cell\n"
|
||||
"@return The cell object or nil if no cell with that ID exists\n"
|
||||
"\n"
|
||||
"This non-const variant has been added version 0.29."
|
||||
) +
|
||||
gsi::iterator_ext ("each_cell", &database_begin_cells, &database_end_cells,
|
||||
"@brief Iterates over all cells\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_cell", &database_begin_cells_nc, &database_end_cells_nc,
|
||||
"@brief Iterates over all cells (non-const version)\n"
|
||||
"\n"
|
||||
"This non-const variant has been added version 0.29."
|
||||
) +
|
||||
gsi::method ("num_items", (size_t (rdb::Database::*) () const) &rdb::Database::num_items,
|
||||
"@brief Returns the number of items inside the database\n"
|
||||
"@return The total number of items\n"
|
||||
|
|
@ -1351,19 +1571,43 @@ Class<rdb::Database> decl_ReportDatabase ("rdb", "ReportDatabase",
|
|||
gsi::iterator_ext ("each_item", &database_items_begin, &database_items_end,
|
||||
"@brief Iterates over all items inside the database\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_item", &database_items_begin_nc, &database_items_end_nc,
|
||||
"@brief Iterates over all items inside the database (non-const version)\n"
|
||||
"\n"
|
||||
"This non-const variant has been added in version 0.29."
|
||||
) +
|
||||
gsi::iterator_ext ("each_item_per_cell", &database_items_begin_cell, &database_items_end_cell, gsi::arg ("cell_id"),
|
||||
"@brief Iterates over all items inside the database which are associated with the given cell\n"
|
||||
"@param cell_id The ID of the cell for which all associated items should be retrieved\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_item_per_cell", &database_items_begin_cell_nc, &database_items_end_cell_nc, gsi::arg ("cell_id"),
|
||||
"@brief Iterates over all items inside the database which are associated with the given cell (non-const version)\n"
|
||||
"@param cell_id The ID of the cell for which all associated items should be retrieved\n"
|
||||
"\n"
|
||||
"This non-const variant has been added in version 0.29."
|
||||
) +
|
||||
gsi::iterator_ext ("each_item_per_category", &database_items_begin_cat, &database_items_end_cat, gsi::arg ("category_id"),
|
||||
"@brief Iterates over all items inside the database which are associated with the given category\n"
|
||||
"@param category_id The ID of the category for which all associated items should be retrieved\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_item_per_category", &database_items_begin_cat_nc, &database_items_end_cat_nc, gsi::arg ("category_id"),
|
||||
"@brief Iterates over all items inside the database which are associated with the given category (non-const version)\n"
|
||||
"@param category_id The ID of the category for which all associated items should be retrieved\n"
|
||||
"\n"
|
||||
"This non-const variant has been added in version 0.29."
|
||||
) +
|
||||
gsi::iterator_ext ("each_item_per_cell_and_category", &database_items_begin_cc, &database_items_end_cc, gsi::arg ("cell_id"), gsi::arg ("category_id"),
|
||||
"@brief Iterates over all items inside the database which are associated with the given cell and category\n"
|
||||
"@param cell_id The ID of the cell for which all associated items should be retrieved\n"
|
||||
"@param category_id The ID of the category for which all associated items should be retrieved\n"
|
||||
) +
|
||||
gsi::iterator_ext ("each_item_per_cell_and_category", &database_items_begin_cc_nc, &database_items_end_cc_nc, gsi::arg ("cell_id"), gsi::arg ("category_id"),
|
||||
"@brief Iterates over all items inside the database which are associated with the given cell and category\n"
|
||||
"@param cell_id The ID of the cell for which all associated items should be retrieved\n"
|
||||
"@param category_id The ID of the category for which all associated items should be retrieved\n"
|
||||
"\n"
|
||||
"This non-const variant has been added in version 0.29."
|
||||
) +
|
||||
gsi::method ("set_item_visited", &rdb::Database::set_item_visited, gsi::arg ("item"), gsi::arg ("visited"),
|
||||
"@brief Modifies the visited state of an item\n"
|
||||
"@param item The item to modify\n"
|
||||
|
|
|
|||
|
|
@ -1488,7 +1488,18 @@ Database::items_by_cell_and_category (id_type cell_id, id_type category_id) cons
|
|||
}
|
||||
}
|
||||
|
||||
std::pair<Database::const_item_ref_iterator, Database::const_item_ref_iterator>
|
||||
std::pair<Database::item_ref_iterator, Database::item_ref_iterator>
|
||||
Database::items_by_cell_and_category (id_type cell_id, id_type category_id)
|
||||
{
|
||||
std::map <std::pair <id_type, id_type>, std::list<ItemRef> >::iterator i = m_items_by_cell_and_category_id.find (std::make_pair (cell_id, category_id));
|
||||
if (i != m_items_by_cell_and_category_id.end ()) {
|
||||
return std::make_pair (i->second.begin (), i->second.end ());
|
||||
} else {
|
||||
return std::make_pair (empty_list.begin (), empty_list.end ());
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<Database::const_item_ref_iterator, Database::const_item_ref_iterator>
|
||||
Database::items_by_cell (id_type cell_id) const
|
||||
{
|
||||
std::map <id_type, std::list<ItemRef> >::const_iterator i = m_items_by_cell_id.find (cell_id);
|
||||
|
|
@ -1499,7 +1510,18 @@ Database::items_by_cell (id_type cell_id) const
|
|||
}
|
||||
}
|
||||
|
||||
std::pair<Database::const_item_ref_iterator, Database::const_item_ref_iterator>
|
||||
std::pair<Database::item_ref_iterator, Database::item_ref_iterator>
|
||||
Database::items_by_cell (id_type cell_id)
|
||||
{
|
||||
std::map <id_type, std::list<ItemRef> >::iterator i = m_items_by_cell_id.find (cell_id);
|
||||
if (i != m_items_by_cell_id.end ()) {
|
||||
return std::make_pair (i->second.begin (), i->second.end ());
|
||||
} else {
|
||||
return std::make_pair (empty_list.begin (), empty_list.end ());
|
||||
}
|
||||
}
|
||||
|
||||
std::pair<Database::const_item_ref_iterator, Database::const_item_ref_iterator>
|
||||
Database::items_by_category (id_type category_id) const
|
||||
{
|
||||
std::map <id_type, std::list<ItemRef> >::const_iterator i = m_items_by_category_id.find (category_id);
|
||||
|
|
@ -1510,7 +1532,18 @@ Database::items_by_category (id_type category_id) const
|
|||
}
|
||||
}
|
||||
|
||||
size_t
|
||||
std::pair<Database::item_ref_iterator, Database::item_ref_iterator>
|
||||
Database::items_by_category (id_type category_id)
|
||||
{
|
||||
std::map <id_type, std::list<ItemRef> >::iterator i = m_items_by_category_id.find (category_id);
|
||||
if (i != m_items_by_category_id.end ()) {
|
||||
return std::make_pair (i->second.begin (), i->second.end ());
|
||||
} else {
|
||||
return std::make_pair (empty_list.begin (), empty_list.end ());
|
||||
}
|
||||
}
|
||||
|
||||
size_t
|
||||
Database::num_items (id_type cell_id, id_type category_id) const
|
||||
{
|
||||
std::map <std::pair <id_type, id_type>, size_t>::const_iterator n = m_num_items_by_cell_and_category.find (std::make_pair (cell_id, category_id));
|
||||
|
|
|
|||
|
|
@ -2082,6 +2082,14 @@ public:
|
|||
return *mp_categories;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the reference to the categories collection (non-const version)
|
||||
*/
|
||||
Categories &categories_non_const ()
|
||||
{
|
||||
return *mp_categories;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Import categories
|
||||
*
|
||||
|
|
@ -2129,6 +2137,20 @@ public:
|
|||
return const_cast<Database *> (this)->category_by_id_non_const (id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the category pointer for a category name (non-const version)
|
||||
*
|
||||
* This method returns 0 if the category name is invalid.
|
||||
*/
|
||||
Category *category_by_name_non_const (const std::string &name);
|
||||
|
||||
/**
|
||||
* @brief Get the category pointer for a category id (non-const version)
|
||||
*
|
||||
* This method returns 0 if the category is invalid.
|
||||
*/
|
||||
Category *category_by_id_non_const (id_type id);
|
||||
|
||||
/**
|
||||
* @brief Access to the cell collection (const)
|
||||
*/
|
||||
|
|
@ -2137,6 +2159,14 @@ public:
|
|||
return m_cells;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Access to the cell collection
|
||||
*/
|
||||
Cells &cells_non_const ()
|
||||
{
|
||||
return m_cells;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Import cells
|
||||
*
|
||||
|
|
@ -2190,6 +2220,20 @@ public:
|
|||
return const_cast<Database *> (this)->cell_by_id_non_const (id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the cell pointer for a cell name or name:variant combination (non-const version)
|
||||
*
|
||||
* This method returns 0 if the cell name or name:variant combination is invalid.
|
||||
*/
|
||||
Cell *cell_by_qname_non_const (const std::string &qname);
|
||||
|
||||
/**
|
||||
* @brief Get the cell pointer for a cell id (non-const version)
|
||||
*
|
||||
* This method returns 0 if the cell id is invalid.
|
||||
*/
|
||||
Cell *cell_by_id_non_const (id_type id);
|
||||
|
||||
/**
|
||||
* @brief Report the number of items in total
|
||||
*/
|
||||
|
|
@ -2266,6 +2310,14 @@ public:
|
|||
return *mp_items;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the items collection (non-const version)
|
||||
*/
|
||||
Items &items_non_const ()
|
||||
{
|
||||
return *mp_items;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Set the items collection
|
||||
*
|
||||
|
|
@ -2279,16 +2331,31 @@ public:
|
|||
*/
|
||||
std::pair<const_item_ref_iterator, const_item_ref_iterator> items_by_cell (id_type cell_id) const;
|
||||
|
||||
/**
|
||||
* @brief Get an iterator pair that delivers the non-const items (ItemRef) for a given cell
|
||||
*/
|
||||
std::pair<item_ref_iterator, item_ref_iterator> items_by_cell (id_type cell_id);
|
||||
|
||||
/**
|
||||
* @brief Get an iterator that delivers the const items (ItemRef) for a given category
|
||||
*/
|
||||
std::pair<const_item_ref_iterator, const_item_ref_iterator> items_by_category (id_type category_id) const;
|
||||
|
||||
/**
|
||||
* @brief Get an iterator that delivers the non-const items (ItemRef) for a given category
|
||||
*/
|
||||
std::pair<item_ref_iterator, item_ref_iterator> items_by_category (id_type category_id);
|
||||
|
||||
/**
|
||||
* @brief Get an iterator that delivers the const items (ItemRef) for a given cell and category
|
||||
*/
|
||||
std::pair<const_item_ref_iterator, const_item_ref_iterator> items_by_cell_and_category (id_type cell_id, id_type category_id) const;
|
||||
|
||||
/**
|
||||
* @brief Get an iterator that delivers the non-const items (ItemRef) for a given cell and category
|
||||
*/
|
||||
std::pair<item_ref_iterator, item_ref_iterator> items_by_cell_and_category (id_type cell_id, id_type category_id);
|
||||
|
||||
/**
|
||||
* @brief Returns true, if the database was modified
|
||||
*/
|
||||
|
|
@ -2349,14 +2416,6 @@ private:
|
|||
m_modified = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the items collection (non-const version)
|
||||
*/
|
||||
Items &items_non_const ()
|
||||
{
|
||||
return *mp_items;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the reference to the tags collection (non-const version)
|
||||
*/
|
||||
|
|
@ -2364,50 +2423,6 @@ private:
|
|||
{
|
||||
return m_tags;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the reference to the categories collection (non-const version)
|
||||
*/
|
||||
Categories &categories_non_const ()
|
||||
{
|
||||
return *mp_categories;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the category pointer for a category name
|
||||
*
|
||||
* This method returns 0 if the category name is invalid.
|
||||
*/
|
||||
Category *category_by_name_non_const (const std::string &name);
|
||||
|
||||
/**
|
||||
* @brief Get the category pointer for a category id
|
||||
*
|
||||
* This method returns 0 if the category is invalid.
|
||||
*/
|
||||
Category *category_by_id_non_const (id_type id);
|
||||
|
||||
/**
|
||||
* @brief Access to the cell collection
|
||||
*/
|
||||
Cells &cells_non_const ()
|
||||
{
|
||||
return m_cells;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Get the cell pointer for a cell name or name:variant combination (non-const version)
|
||||
*
|
||||
* This method returns 0 if the cell name or name:variant combination is invalid.
|
||||
*/
|
||||
Cell *cell_by_qname_non_const (const std::string &qname);
|
||||
|
||||
/**
|
||||
* @brief Get the cell pointer for a cell id (non-const version)
|
||||
*
|
||||
* This method returns 0 if the cell id is invalid.
|
||||
*/
|
||||
Cell *cell_by_id_non_const (id_type id);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -935,6 +935,78 @@ class RDB_TestClass < TestBase
|
|||
|
||||
end
|
||||
|
||||
def test_13
|
||||
|
||||
# manipulations
|
||||
rdb = RBA::ReportDatabase::new("")
|
||||
|
||||
_cell = rdb.create_cell("CELL")
|
||||
_cat = rdb.create_category("cat")
|
||||
_subcat = rdb.create_category(_cat, "subcat")
|
||||
_subcat.description = "subcat_d"
|
||||
_item1 = rdb.create_item(_cell.rdb_id, _subcat.rdb_id)
|
||||
_item1.add_value(17.5)
|
||||
_item1.add_value("string")
|
||||
_item2 = rdb.create_item(_cell.rdb_id, _subcat.rdb_id)
|
||||
_item2.add_value("b")
|
||||
_subsubcat = rdb.create_category(_subcat, "subsubcat")
|
||||
_cat2 = rdb.create_category("cat2")
|
||||
|
||||
cell = rdb.cell_by_id(_cell.rdb_id)
|
||||
assert_equal(cell._is_const_object?, false)
|
||||
assert_equal(rdb.each_cell.first._is_const_object?, false)
|
||||
|
||||
cell = rdb.cell_by_qname("CELL")
|
||||
assert_equal(cell._is_const_object?, false)
|
||||
|
||||
cat = rdb.category_by_id(_cat.rdb_id)
|
||||
assert_equal(cat._is_const_object?, false)
|
||||
|
||||
cat = rdb.category_by_path("cat")
|
||||
assert_equal(cat._is_const_object?, false)
|
||||
subcat = rdb.category_by_path("cat.subcat")
|
||||
|
||||
assert_equal(rdb.each_category.first._is_const_object?, false)
|
||||
assert_equal(rdb.each_category.collect { |c| c.name }.join(","), "cat,cat2")
|
||||
assert_equal(subcat._is_const_object?, false)
|
||||
assert_equal(subcat.database._is_const_object?, false)
|
||||
assert_equal(subcat.name, "subcat")
|
||||
assert_equal(subcat.parent.name, "cat")
|
||||
|
||||
assert_equal(subcat.description, "subcat_d")
|
||||
subcat.description = "changed"
|
||||
assert_equal(subcat.description, "changed")
|
||||
|
||||
assert_equal(rdb.each_item_per_category(subcat.rdb_id).collect { |item| item.each_value.collect { |v| v.to_s }.join("/") }.join(";"), "float: 17.5/text: string;text: b")
|
||||
|
||||
item1 = rdb.each_item_per_category(subcat.rdb_id).first
|
||||
assert_equal(item1._is_const_object?, false)
|
||||
item1.clear_values
|
||||
assert_equal(rdb.each_item_per_category(subcat.rdb_id).collect { |item| item.each_value.collect { |v| v.to_s }.join("/") }.join(";"), ";text: b")
|
||||
item1.add_value("x")
|
||||
assert_equal(rdb.each_item_per_category(subcat.rdb_id).collect { |item| item.each_value.collect { |v| v.to_s }.join("/") }.join(";"), "text: x;text: b")
|
||||
item1.add_tag(17)
|
||||
assert_equal(item1.has_tag?(17), true)
|
||||
assert_equal(item1.has_tag?(16), false)
|
||||
|
||||
item1 = rdb.each_item.first
|
||||
assert_equal(item1._is_const_object?, false)
|
||||
assert_equal(item1.has_tag?(17), true)
|
||||
|
||||
item1 = rdb.each_item_per_cell(cell.rdb_id).first
|
||||
assert_equal(item1._is_const_object?, false)
|
||||
assert_equal(item1.has_tag?(17), true)
|
||||
|
||||
item1 = rdb.each_item_per_cell_and_category(cell.rdb_id, subcat.rdb_id).first
|
||||
assert_equal(item1._is_const_object?, false)
|
||||
assert_equal(item1.has_tag?(17), true)
|
||||
|
||||
item1 = cell.each_item.first
|
||||
assert_equal(item1._is_const_object?, false)
|
||||
assert_equal(item1.has_tag?(17), true)
|
||||
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
load("test_epilogue.rb")
|
||||
|
|
|
|||
Loading…
Reference in New Issue