minor tweaks

This commit is contained in:
Garux 2021-03-20 20:15:43 +03:00
parent 95f4b3e504
commit 9feec41e31
3 changed files with 31 additions and 20 deletions

View File

@ -74,20 +74,20 @@ private:
struct Compare{ struct Compare{
using is_transparent = void; using is_transparent = void;
bool operator()( const iterator& one, const iterator& other ) const { bool operator()( const const_iterator& one, const const_iterator& other ) const {
return *one < *other; return *one < *other;
} }
bool operator()( const Value& va, const iterator& it ) const { bool operator()( const Value& va, const const_iterator& it ) const {
return va < *it; return va < *it;
} }
bool operator()( const iterator& it, const Value& va ) const { bool operator()( const const_iterator& it, const Value& va ) const {
return *it < va; return *it < va;
} }
}; };
std::set<iterator, Compare> m_set; // store sorted iterators for fast lookup std::set<const_iterator, Compare> m_set; // store sorted iterators for fast lookup
void init_set(){ // only load set, when lookup is needed void init_set(){ // only load set, when lookup is needed
if( m_set.empty() ) if( m_set.empty() )
for( auto it = begin(); it != end(); ++it ) for( const_iterator it = begin(); it != end(); ++it )
m_set.emplace( it ); m_set.emplace( it );
} }
public: public:
@ -154,14 +154,14 @@ iterator insert( const Value& value ){
void erase( const Value& value ){ void erase( const Value& value ){
init_set(); init_set();
const auto it = m_set.find( value ); const auto it = m_set.find( value );
ASSERT_MESSAGE( it != m_set.end(), "UnsortedSet::erase: not found" ); ASSERT_MESSAGE( it != m_set.cend(), "UnsortedSet::erase: not found" );
m_values.erase( *it ); m_values.erase( *it );
m_set.erase( it ); m_set.erase( it );
} }
iterator find( const Value& value ){ const_iterator find( const Value& value ){
init_set(); init_set();
const auto it = m_set.find( value ); const auto it = m_set.find( value );
return it == m_set.end()? m_values.end() : *it; return it == m_set.cend()? end() : *it;
} }
}; };

View File

@ -121,6 +121,7 @@ typedef MemberCaller1<SelectableInstance, const Selectable&, &SelectableInstance
#include <list> #include <list>
#include <set> #include <set>
/// It's illegal to modify inserted values directly!
template<typename Selected> template<typename Selected>
class SelectionList class SelectionList
{ {
@ -133,17 +134,17 @@ private:
struct Compare{ struct Compare{
using is_transparent = void; using is_transparent = void;
bool operator()( const iterator& one, const iterator& other ) const { bool operator()( const const_iterator& one, const const_iterator& other ) const {
return *one < *other; return *one < *other;
} }
bool operator()( const Selected* va, const iterator& it ) const { bool operator()( const Selected* va, const const_iterator& it ) const {
return va < *it; return va < *it;
} }
bool operator()( const iterator& it, const Selected* va ) const { bool operator()( const const_iterator& it, const Selected* va ) const {
return *it < va; return *it < va;
} }
}; };
std::multiset<iterator, Compare> m_set; std::multiset<const_iterator, Compare> m_set;
public: public:
SelectionList() = default; SelectionList() = default;
@ -181,8 +182,8 @@ void append( Selected& selected ){
m_set.emplace( --end() ); m_set.emplace( --end() );
} }
void erase( Selected& selected ){ void erase( Selected& selected ){
auto it = m_set.find( &selected ); const auto it = m_set.find( &selected );
ASSERT_MESSAGE( it != m_set.end(), "selection-tracking error" ); ASSERT_MESSAGE( it != m_set.cend(), "selection-tracking error" );
m_selection.erase( *it ); m_selection.erase( *it );
m_set.erase( it ); m_set.erase( it );
} }

View File

@ -743,18 +743,27 @@ void graph_tree_model_row_changed( GraphTreeNode& node );
class GraphTreeNode class GraphTreeNode
{ {
typedef std::map<std::pair<CopiedString, scene::Node*>, GraphTreeNode*> ChildNodes; public:
typedef std::pair<CopiedString, scene::Node*> key_type;
private:
struct Compare{
bool operator()( const key_type& one, const key_type& other ) const {
const int n = string_compare( one.first.c_str(), other.first.c_str() );
return n != 0? n < 0 : one.second < other.second;
}
};
typedef std::map<key_type, GraphTreeNode*, Compare> ChildNodes;
ChildNodes m_childnodes; ChildNodes m_childnodes;
std::list<char> m_list; // dummy list for child index identification struct Dummy{};
std::list<char>::const_iterator m_parentListIterator; // iterator from parent's list std::list<Dummy> m_list; // dummy list for child index identification
std::list<Dummy>::const_iterator m_parentListIterator; // iterator from parent's list
bool m_searchFromEnd = false; //silly optimization bool m_searchFromEnd = false; //silly optimization
public: public:
Reference<scene::Instance> m_instance; Reference<scene::Instance> m_instance;
GraphTreeNode* m_parent; GraphTreeNode* m_parent;
typedef ChildNodes::iterator iterator; typedef ChildNodes::iterator iterator;
typedef ChildNodes::key_type key_type;
typedef ChildNodes::value_type value_type; typedef ChildNodes::value_type value_type;
typedef ChildNodes::size_type size_type; typedef ChildNodes::size_type size_type;
@ -794,10 +803,11 @@ int getIndex() const {
} }
iterator insert( const value_type& value ){ iterator insert( const value_type& value ){
iterator i = m_childnodes.insert( value ).first; auto [ i, inserted ] = m_childnodes.insert( value );
ASSERT_MESSAGE( inserted, "GraphTreeNode::insert: already added" );
( *i ).second->m_parent = this; ( *i ).second->m_parent = this;
const auto pos = std::next( i ) == end()? m_list.end() : std::next( i )->second->m_parentListIterator; const auto pos = std::next( i ) == end()? m_list.end() : std::next( i )->second->m_parentListIterator;
i->second->m_parentListIterator = m_list.insert( pos, 'a' ); i->second->m_parentListIterator = m_list.insert( pos, Dummy() );
return i; return i;
} }
void erase( iterator i ){ void erase( iterator i ){