#ifndef PSEARCH_NODE_H_
#define PSEARCH_NODE_H_
#include "psearch_core.h"
namespace psearch {
/////////////////////////////////////////////////////////////////////////////////////////
// class Node
//
// The set of patterns attribute to Node correspond to the patterns for which
// this node is included in their neccessairy and sufficient criteria (nsc.)
/////////////////////////////////////////////////////////////////////////////////////////
class Node: public PSBase
{
public:
inline Node(PSearchDB * db_p, index_type index):
PSBase(db_p, index),
m_rules(),
m_patterns(),
m_skip_pattern_activation(false)
{};
inline node_index_type
get_node_index()const
{
return this;
};
//////////////////////////////////////////////////////////////////////////////////////
// relationship with Rule
/////////////////////////////////////////////////////////////////////////////////////
// returns true if this node is included in the pattern's c1 set.
inline bool
is_c1_to_rule(rule_index_type pindex)const
{
return m_rules.find(pindex) != m_rules.end();
};
inline rule_const_iterator_type
get_rules_begin()const
{
return m_rules.begin();
};
inline rule_const_iterator_type
get_rules_end()const
{
return m_rules.end();
};
inline rule_set_const_iterator
get_rules_iterator()const
{
return rule_set_const_iterator(get_rules_begin(), get_rules_end());
};
inline size_t
get_nbr_rules()const
{
return m_rules.size();
};
//////////////////////////////////////////////////////////////////////////////////////
// relationship with Pattern
/////////////////////////////////////////////////////////////////////////////////////
inline bool
is_skip_pattern_activation() const
{
return m_skip_pattern_activation;
};
// returns true if this node is included in the pattern's c1 set.
inline bool
is_c1_to_pattern(pattern_index_type pindex)const
{
return m_patterns.find(pindex) != m_patterns.end();
};
inline pattern_const_iterator_type
get_patterns_begin()const
{
return m_patterns.begin();
};
inline pattern_const_iterator_type
get_patterns_end()const
{
return m_patterns.end();
};
inline pattern_set_const_iterator
get_patterns_iterator()const
{
return pattern_set_const_iterator(get_patterns_begin(), get_patterns_end());
};
inline size_t
get_nbr_patterns()const
{
return m_patterns.size();
};
///////////////////////////////////////////////////////////////////////////////////////
// relationship to Category
//////////////////////////////////////////////////////////////////////////////////////
inline bool
has_category(category_index_type category_index)const
{
return m_categories.find(category_index) != m_categories.end();
};
inline category_const_iterator_type
get_categories_begin()const
{
return m_categories.begin();
};
inline category_const_iterator_type
get_categories_end()const
{
return m_categories.end();
};
inline category_set_const_iterator
get_categories_iterator()const
{
return category_set_const_iterator(get_categories_begin(), get_categories_end());
};
inline size_t
get_nbr_categories()const
{
return m_categories.size();
};
protected:
inline void
set_skip_pattern_activation(bool b)
{
m_skip_pattern_activation = b;
};
//////////////////////////////////////////////////////////////
// rule
//////////////////////////////////////////////////////////////
inline void
add_rule(rule_index_type rule_index)
{
if(!rule_index) return;
m_rules.insert(rule_index);
};
inline void
remove_rule(rule_index_type rule_index)
{
m_rules.erase(rule_index);
};
inline void
remove_all_rules()
{
m_rules.clear();
};
//////////////////////////////////////////////////////////////
// pattern
//////////////////////////////////////////////////////////////
inline void
add_pattern(pattern_index_type pattern_index)
{
if(!pattern_index) return;
m_patterns.insert(pattern_index);
};
inline void
remove_pattern(pattern_index_type pattern_index)
{
m_patterns.erase(pattern_index);
};
inline void
remove_all_patterns()
{
m_patterns.clear();
};
inline void
add_category(category_index_type category_index)
{
if(!category_index) return;
m_categories.insert(category_index);
};
inline void
remove_category(category_index_type category_index)
{
m_categories.erase(category_index);
};
inline void
remove_all_categories()
{
m_categories.clear();
};
private:
friend class PSearchDB;
friend class Rule;
friend std::ostream& operator<<(std::ostream& out, Node const& node);
friend std::ostream& operator<<(std::ostream& out, node_index_type node_index);
rule_set_type m_rules;
pattern_set_type m_patterns;
category_set_type m_categories;
bool m_skip_pattern_activation;
};
inline std::ostream& operator<<(std::ostream& out, node_index_type node_index)
{
out << *node_index;
return out;
};
}; /* psearch namespace */
#endif /*PSEARCH_NODE_H_*/