hvalues.hh
来自「Click is a modular router toolkit. To us」· HH 代码 · 共 287 行
HH
287 行
#ifndef CLICKY_HVALUES_HH#define CLICKY_HVALUES_HH 1#include <click/string.hh>#include <click/hashtable.hh>#include <gtk/gtk.h>namespace clicky {class handler_value;class handler_values;class handler_value_iterator;class crouter;enum { hflag_r = 1 << 0, hflag_w = 1 << 1, hflag_rparam = 1 << 2, hflag_raw = 1 << 3, hflag_special = 1 << 4, hflag_have_hvalue = 1 << 5, hflag_autorefresh = 1 << 6, hflag_notify_whandlers = 1 << 7, hflag_notify_delt = 1 << 8, hflag_always_notify_delt = 1 << 9, hflag_calm = 1 << 10, hflag_expensive = 1 << 11, hflag_multiline = 1 << 12, hflag_button = 1 << 13, hflag_checkbox = 1 << 14, hflag_collapse = 1 << 15, hflag_visible = 1 << 16, hflag_refresh = 1 << 17, hflag_deprecated = 1 << 18, hflag_uncommon = 1 << 19, hflag_preferences = 1 << 20, hflag_outstanding = 1 << 21, hflag_dead = 1 << 22, hflag_mandatory_driver_mask = hflag_r | hflag_w | hflag_rparam | hflag_raw | hflag_special | hflag_dead, hflag_default_driver_mask = hflag_mandatory_driver_mask | hflag_calm | hflag_expensive | hflag_multiline | hflag_button | hflag_checkbox | hflag_collapse | hflag_visible | hflag_refresh | hflag_deprecated, hflag_private_mask = hflag_outstanding};class handler_value { public: typedef String key_type; typedef const String &key_const_reference; handler_value(const String &hname) : _hname(hname), _flags(0), _driver_flags(0), _driver_mask(hflag_default_driver_mask), _autorefresh_period(1000), _autorefresh_source(0), _next(0) { _name_offset = hname.find_right('.'); _name_offset = (_name_offset < 0 ? 0 : _name_offset + 1); } ~handler_value() { if (_autorefresh_source) g_source_remove(_autorefresh_source); } const String &hashkey() const { return _hname; } const String &hname() const { return _hname; } String element_name() const { if (_name_offset) return _hname.substring(0, _name_offset - 1); else return String(); } String handler_name() const { return _hname.substring(_name_offset); } const String &hparam() const { return _hparam; } bool have_required_hparam() const { return (_flags & (hflag_rparam | hflag_have_hvalue)) != hflag_rparam; } const String &hvalue() const { return _hvalue; } bool have_hvalue() const { return (_flags & hflag_have_hvalue) != 0; } void clear_hvalue() { _hvalue = String(); _flags &= ~hflag_have_hvalue; } void set_hvalue(const String &hvalue) { _hvalue = hvalue; _flags = (_flags & ~hflag_outstanding) | hflag_have_hvalue; } bool empty() const { return (_flags & (hflag_r | hflag_rparam | hflag_w)) == 0; } bool readable() const { return (_flags & hflag_r) != 0; } bool read_param() const { return (_flags & hflag_rparam) != 0; } bool writable() const { return (_flags & hflag_w) != 0; } bool editable() const { return (_flags & (hflag_w | hflag_rparam)) != 0; } bool write_only() const { return (_flags & (hflag_r | hflag_w)) == hflag_w; } bool visible() const { return (_flags & hflag_visible) != 0; } bool refreshable() const { return (_flags & hflag_refresh) != 0; } static bool default_refreshable(int flags) { return (flags & (hflag_r | hflag_special | hflag_expensive)) == hflag_r; } bool special() const { return (_flags & hflag_special) != 0; } bool notify_whandlers() const { return (_flags & hflag_notify_whandlers) != 0; } bool notify_delt() const { return (_flags & hflag_notify_delt) != 0; } bool notify_delt(bool changed) const { return (_flags & hflag_notify_delt) != 0 && (changed || (_flags & hflag_always_notify_delt) != 0); } int flags() const { return _flags; } int autorefresh_period() const { return _autorefresh_period; } void set_autorefresh_period(int p) { _autorefresh_period = p; } void refresh(crouter *cr, bool clear_outstanding = false); gboolean on_autorefresh(crouter *cr, int period); void set_driver_flags(crouter *cr, int new_flags); void set_flags(crouter *cr, int new_flags); static const String no_hvalue_string; private: String _hname; int _name_offset; String _hparam; String _hvalue; int _flags; int _driver_flags; int _driver_mask; int _autorefresh_period; guint _autorefresh_source; handler_value *_next; friend class handler_values; friend class handler_value_iterator; void create_autorefresh(crouter *cr);};struct handler_value_iterator { inline void operator++(int) { _v = _v->_next; } inline void operator++() { _v = _v->_next; } inline handler_value *operator->() const { return _v; } inline handler_value &operator*() const { return *_v; } private: inline handler_value_iterator(handler_value *v) : _v(v) { } handler_value *_v; friend class handler_values; friend bool operator==(handler_value_iterator, handler_value_iterator); friend bool operator!=(handler_value_iterator, handler_value_iterator);};inline bool operator==(handler_value_iterator a, handler_value_iterator b) { return a._v == b._v;}inline bool operator!=(handler_value_iterator a, handler_value_iterator b) { return a._v != b._v;}struct handler_values { handler_values(crouter *cr); typedef handler_value_iterator iterator; iterator begin(const String &ename); inline iterator end() { return iterator(0); } handler_value *find(const String &hname) { return _hv.find(hname).get(); } handler_value *find_placeholder(const String &hname, int flags, int autorefresh_period = 0) { if (handler_value *hv = _hv.find(hname).get()) { hv->_flags |= flags; if (autorefresh_period > 0 && hv->autorefresh_period() > autorefresh_period) hv->set_autorefresh_period(autorefresh_period); return hv; } else return hard_find_placeholder(hname, flags, autorefresh_period); } handler_value *find_force(const String &hname) { return _hv.find_insert(hname).get(); } inline bool empty() const { return _hv.empty(); } void clear() { _hv.clear(); } handler_value *set(const String &hname, const String &hparam, const String &hvalue, bool &changed); private: crouter *_cr; HashTable<handler_value> _hv; handler_value *hard_find_placeholder(const String &hname, int flags, int autorefresh_period); void set_handlers(const String &hname, const String &hparam, const String &hvalue);};inline void handler_value::set_driver_flags(crouter *cr, int new_driver_flags){ _driver_flags = new_driver_flags & ~hflag_private_mask; int new_flags = (_flags & ~_driver_mask) | (_driver_flags & _driver_mask); if (new_flags != _flags) set_flags(cr, new_flags);}}#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?