WIP using the reverse index to find out the Command-ID
this includes using a Command* as key within a std::map
This commit is contained in:
parent
4c9af94e1d
commit
7fccecacce
4 changed files with 45 additions and 12 deletions
|
|
@ -99,7 +99,7 @@ namespace util {
|
||||||
/** shortcut for containment test on a map */
|
/** shortcut for containment test on a map */
|
||||||
template <typename MAP>
|
template <typename MAP>
|
||||||
inline bool
|
inline bool
|
||||||
contains (MAP& map, typename MAP::key_type& key)
|
contains (MAP& map, typename MAP::key_type const& key)
|
||||||
{
|
{
|
||||||
return map.find(key) != map.end();
|
return map.find(key) != map.end();
|
||||||
}
|
}
|
||||||
|
|
@ -132,6 +132,19 @@ namespace util {
|
||||||
return end != std::find(begin,end, val);
|
return end != std::find(begin,end, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** fetch value from a Map, or return a default if not found */
|
||||||
|
template <typename MAP>
|
||||||
|
inline typename MAP::value_type
|
||||||
|
getValue_or_default (MAP& map, typename MAP::key_type const& key
|
||||||
|
, typename MAP::value_type defaultVal)
|
||||||
|
{
|
||||||
|
typename MAP::iterator pos = map.find (key);
|
||||||
|
if (pos != map.end())
|
||||||
|
return pos->second;
|
||||||
|
else
|
||||||
|
return defaultVal;
|
||||||
|
}
|
||||||
|
|
||||||
/** shortcut for removing all copies of an Element
|
/** shortcut for removing all copies of an Element
|
||||||
* in any sequential collection */
|
* in any sequential collection */
|
||||||
template <typename SEQ>
|
template <typename SEQ>
|
||||||
|
|
|
||||||
|
|
@ -71,8 +71,23 @@ namespace control {
|
||||||
// using std::ostream;
|
// using std::ostream;
|
||||||
using std::string;
|
using std::string;
|
||||||
using util::contains;
|
using util::contains;
|
||||||
|
using util::getValue_or_default;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper for building a std::map with
|
||||||
|
* Command* as keys. Defines the order
|
||||||
|
* by the address of the Command's
|
||||||
|
* implementation object.
|
||||||
|
*/
|
||||||
|
struct order_by_impl
|
||||||
|
{
|
||||||
|
bool
|
||||||
|
operator() (Command* pC1, Command* pC2)
|
||||||
|
{
|
||||||
|
return ( pC1 && pC2 && (*pC1 < *pC2));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -84,7 +99,7 @@ namespace control {
|
||||||
{
|
{
|
||||||
// using a hashtable to implement the index
|
// using a hashtable to implement the index
|
||||||
typedef unordered_map<Symbol, Command, hash<Symbol> > CmdIndex;
|
typedef unordered_map<Symbol, Command, hash<Symbol> > CmdIndex;
|
||||||
typedef std::map< void*, Symbol> ReverseIndex;
|
typedef std::map<Command*, Symbol, order_by_impl> ReverseIndex;
|
||||||
|
|
||||||
CmdIndex index_;
|
CmdIndex index_;
|
||||||
ReverseIndex ridx_;
|
ReverseIndex ridx_;
|
||||||
|
|
@ -140,12 +155,8 @@ namespace control {
|
||||||
queryIndex (Symbol cmdID)
|
queryIndex (Symbol cmdID)
|
||||||
{
|
{
|
||||||
Lock sync(this);
|
Lock sync(this);
|
||||||
|
return getValue_or_default (index_, cmdID, Command() );
|
||||||
if (contains (index_,cmdID))
|
} //if not found
|
||||||
return index_[cmdID];
|
|
||||||
else
|
|
||||||
return Command();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/** search the command index for a definition
|
/** search the command index for a definition
|
||||||
|
|
@ -155,14 +166,15 @@ namespace control {
|
||||||
const char*
|
const char*
|
||||||
findDefinition (Command const& cmdInstance) const
|
findDefinition (Command const& cmdInstance) const
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED ("try to find a registration in the index for a given command instance");
|
// Lock sync(this); ////////////////////////////////////TICKET #272 Lock should also be usable in const methods
|
||||||
}
|
return getValue_or_default (ridx_, &cmdInstance, 0 );
|
||||||
|
} //used as Key
|
||||||
|
|
||||||
|
|
||||||
size_t
|
size_t
|
||||||
index_size() const
|
index_size() const
|
||||||
{
|
{
|
||||||
UNIMPLEMENTED ("number of defs in the index");
|
return index_.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -200,7 +200,7 @@ namespace control {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** is this a valid command definition frame? especially
|
/** is this a valid command definition? especially..
|
||||||
* - the prototype command is initialised properly
|
* - the prototype command is initialised properly
|
||||||
* - there is a command definition registered for our command ID
|
* - there is a command definition registered for our command ID
|
||||||
* - and the registered command uses the same underlying command impl
|
* - and the registered command uses the same underlying command impl
|
||||||
|
|
|
||||||
|
|
@ -165,6 +165,7 @@ namespace control {
|
||||||
|
|
||||||
operator string() const;
|
operator string() const;
|
||||||
friend bool operator== (Command const&, Command const&);
|
friend bool operator== (Command const&, Command const&);
|
||||||
|
friend bool operator< (Command const&, Command const&);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -212,6 +213,13 @@ namespace control {
|
||||||
return ! (c1 == c2);
|
return ! (c1 == c2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** allow for sets and associative containers */
|
||||||
|
inline bool
|
||||||
|
operator< (Command const& c1, Command const& c2)
|
||||||
|
{
|
||||||
|
return ( c1 && c2 && (&c1.impl() < &c2.impl()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue