⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 routert.hh

📁 COPE the first practical network coding scheme which is developped on click
💻 HH
字号:
// -*- c-basic-offset: 4 -*-#ifndef CLICK_ROUTERT_HH#define CLICK_ROUTERT_HH#include "elementt.hh"#include "eclasst.hh"#include <click/error.hh>#include <click/hashmap.hh>#include <click/archive.hh>typedef HashMap<String, int> StringMap;class RouterT : public ElementClassT { public:    RouterT();    RouterT(const String &name, const String &landmark, RouterT *declaration_scope = 0);    virtual ~RouterT();    // ELEMENTS    int nelements() const		{ return _elements.size(); }    int n_live_elements() const		{ return _n_live_elements; }        inline const ElementT *element(const String &) const;    inline ElementT *element(const String &);    int eindex(const String &s) const	{ return _element_name_map[s]; }        const ElementT *element(int i) const{ return _elements[i]; }    ElementT *element(int i)		{ return _elements[i]; }        class iterator;    class const_iterator;    class type_iterator;    class const_type_iterator;    inline iterator begin_elements();    inline const_iterator begin_elements() const;    inline type_iterator begin_elements(ElementClassT *);    inline const_type_iterator begin_elements(ElementClassT *) const;    inline iterator end_elements();    inline const_iterator end_elements() const;        bool elive(int i) const		{ return _elements[i]->live(); }    bool edead(int i) const		{ return _elements[i]->dead(); }    inline String ename(int) const;    inline ElementClassT *etype(int) const;    inline String etype_name(int) const;        ElementT *get_element(const String &name, ElementClassT *, const String &configuration, const String &landmark);    ElementT *add_anon_element(ElementClassT *, const String &configuration = String(), const String &landmark = String());    void change_ename(int, const String &);    void deanonymize_elements();    void free_element(ElementT *);    void free_dead_elements();    void set_new_eindex_collector(Vector<int> *v) { _new_eindex_collector=v; }    // TYPES    ElementClassT *locally_declared_type(const String &) const;    inline ElementClassT *declared_type(const String &) const;    void add_declared_type(ElementClassT *, bool anonymous);    void collect_types(HashMap<ElementClassT *, int> &) const;    void collect_locally_declared_types(Vector<ElementClassT *> &) const;    void collect_overloads(Vector<ElementClassT *> &) const;    // CONNECTIONS    int nconnections() const			{ return _conn.size(); }    const Vector<ConnectionT> &connections() const { return _conn; }    const ConnectionT &connection(int c) const	{ return _conn[c]; }    bool connection_live(int c) const		{ return _conn[c].live(); }    void add_tunnel(const String &, const String &, const String &, ErrorHandler *);    bool add_connection(const PortT &, const PortT &, const String &landmark = String());    inline bool add_connection(ElementT *, int, ElementT *, int, const String &landmark = String());    void kill_connection(int);    void kill_bad_connections();    void compact_connections();    inline bool has_connection(const PortT &, const PortT &) const;    int find_connection(const PortT &, const PortT &) const;    void change_connection_to(int, PortT);    void change_connection_from(int, PortT);    bool find_connection_from(const PortT &, PortT &) const;    void find_connections_from(const PortT &, Vector<PortT> &) const;    void find_connections_from(const PortT &, Vector<int> &) const;    void find_connections_to(const PortT &, Vector<PortT> &) const;    void find_connections_to(const PortT &, Vector<int> &) const;    void find_connection_vector_from(ElementT *, Vector<int> &) const;    void find_connection_vector_to(ElementT *, Vector<int> &) const;    bool insert_before(const PortT &, const PortT &);    bool insert_after(const PortT &, const PortT &);    inline bool insert_before(ElementT *, const PortT &);    inline bool insert_after(ElementT *, const PortT &);    // REQUIREMENTS    void add_requirement(const String &);    void remove_requirement(const String &);    const Vector<String> &requirements() const	{ return _requirements; }    // ARCHIVE    void add_archive(const ArchiveElement &);    int narchive() const			{ return _archive.size(); }    int archive_index(const String &s) const	{ return _archive_map[s]; }    const Vector<ArchiveElement> &archive() const{ return _archive; }    ArchiveElement &archive(int i)		{ return _archive[i]; }    const ArchiveElement &archive(int i) const	{ return _archive[i]; }    inline ArchiveElement &archive(const String &s);    inline const ArchiveElement &archive(const String &s) const;    void add_components_to(RouterT *, const String &prefix = String()) const;    // CHECKING, FLATTENING AND EXPANDING    void check() const;    void remove_duplicate_connections();    void remove_dead_elements(ErrorHandler * = 0);    void remove_compound_elements(ErrorHandler *);    void remove_tunnels(ErrorHandler * = 0);    void expand_into(RouterT *, const String &prefix, const VariableEnvironment &, ErrorHandler *);    void flatten(ErrorHandler *);    // UNPARSING    void unparse(StringAccum &, const String & = String()) const;    void unparse_requirements(StringAccum &, const String & = String()) const;    void unparse_declarations(StringAccum &, const String & = String()) const;    void unparse_connections(StringAccum &, const String & = String()) const;    String configuration_string() const;    // COMPOUND ELEMENTS    String landmark() const		{ return _type_landmark; }    const ElementTraits *find_traits() const;        bool primitive() const		{ return false; }        int nformals() const		{ return _formals.size(); }    const Vector<String> &formals() const { return _formals; }    const Vector<String> &formal_types() const { return _formal_types; }    inline void add_formal(const String &fname, const String &ftype);    int ninputs() const			{ return _ninputs; }    int noutputs() const		{ return _noutputs; }        RouterT *declaration_scope() const	{ return _declaration_scope; }    int declaration_depth() const	{ return _declaration_depth; }    ElementClassT *overload_type() const { return _overload_type; }    void set_overload_type(ElementClassT *);    int finish_type(ErrorHandler *);        ElementClassT *resolve(int, int, Vector<String> &, ErrorHandler *, const String &landmark);    ElementT *complex_expand_element(ElementT *, const String &, Vector<String> &, RouterT *, const String &prefix, const VariableEnvironment &, ErrorHandler *);    String unparse_signature() const;    void unparse_declaration(StringAccum &, const String &, UnparseKind, ElementClassT *);        RouterT *cast_router()		{ return this; }  private:      struct Pair {	int from;	int to;	Pair() : from(-1), to(-1) { }	Pair(int f, int t) : from(f), to(t) { }    };    struct ElementType {	ElementClassT * const type;	int scope_cookie;	int prev_name;	ElementType(ElementClassT *c, int sc, int pn) : type(c), scope_cookie(sc), prev_name(pn) { assert(type); type->use(); }	ElementType(const ElementType &o) : type(o.type), scope_cookie(o.scope_cookie), prev_name(o.prev_name) { type->use(); }	~ElementType()			{ type->unuse(); }	const String &name() const	{ return type->name(); }      private:	ElementType &operator=(const ElementType &);    };    StringMap _element_name_map;    Vector<ElementT *> _elements;    ElementT *_free_element;    int _n_live_elements;    Vector<int> *_new_eindex_collector;    Vector<ConnectionT> _conn;    Vector<Pair> _first_conn;    int _free_conn;        StringMap _declared_type_map;    Vector<ElementType> _declared_types;    Vector<String> _requirements;    StringMap _archive_map;    Vector<ArchiveElement> _archive;    RouterT *_declaration_scope;    int _declaration_scope_cookie;    int _declaration_depth;    int _scope_cookie;    Vector<String> _formals;    Vector<String> _formal_types;    int _ninputs;    int _noutputs;    ElementClassT *_overload_type;    String _type_landmark;    mutable ElementTraits _traits;    bool _circularity_flag;        RouterT(const RouterT &);    RouterT &operator=(const RouterT &);    ElementClassT *declared_type(const String &, int scope_cookie) const;    void update_noutputs(int);    void update_ninputs(int);    ElementT *add_element(const ElementT &);    void assign_element_name(int);    void free_connection(int ci);    void unlink_connection_from(int ci);    void unlink_connection_to(int ci);    void expand_tunnel(Vector<PortT> *port_expansions, const Vector<PortT> &ports, bool is_output, int which, ErrorHandler *) const;    String interpolate_arguments(const String &, const Vector<String> &) const;    friend class RouterUnparserT;    };class RouterT::const_iterator { public:    operator bool() const		{ return _e; }    int eindex() const			{ return _e->eindex(); }    void operator++(int)		{ if (_e) step(_e->router(), eindex()+1);}    void operator++()			{ (*this)++; }    operator const ElementT *() const	{ return _e; }    const ElementT *operator->() const	{ return _e; }    const ElementT &operator*() const	{ return *_e; }  private:    const ElementT *_e;    const_iterator()			: _e(0) { }    const_iterator(const RouterT *r, int ei) { step(r, ei); }    void step(const RouterT *, int);    friend class RouterT;    friend class RouterT::iterator;};class RouterT::iterator : public RouterT::const_iterator { public:    operator ElementT *() const		{ return const_cast<ElementT *>(_e); }    ElementT *operator->() const	{ return const_cast<ElementT *>(_e); }    ElementT &operator*() const		{ return const_cast<ElementT &>(*_e); }  private:    iterator()				: const_iterator() { }    iterator(RouterT *r, int ei)	: const_iterator(r, ei) { }    friend class RouterT;};class RouterT::const_type_iterator { public:    operator bool() const		{ return _e; }    int eindex() const			{ return _e->eindex(); }    inline void operator++(int);    inline void operator++();    operator const ElementT *() const	{ return _e; }    const ElementT *operator->() const	{ return _e; }    const ElementT &operator*() const	{ return *_e; }  private:    const ElementT *_e;    const_type_iterator()		: _e(0) { }    const_type_iterator(const RouterT *r, ElementClassT *t, int i) { step(r, t, i); }    void step(const RouterT *, ElementClassT *, int);    friend class RouterT;    friend class RouterT::type_iterator;};class RouterT::type_iterator : public RouterT::const_type_iterator { public:    operator ElementT *() const		{ return const_cast<ElementT *>(_e); }    ElementT *operator->() const	{ return const_cast<ElementT *>(_e); }    ElementT &operator*() const		{ return const_cast<ElementT &>(*_e); }  private:    type_iterator()			: const_type_iterator() { }    type_iterator(RouterT *r, ElementClassT *t, int ei)	: const_type_iterator(r, t, ei) { }    friend class RouterT;};inline RouterT::iteratorRouterT::begin_elements(){    return iterator(this, 0);}inline RouterT::const_iteratorRouterT::begin_elements() const{    return const_iterator(this, 0);}inline RouterT::type_iteratorRouterT::begin_elements(ElementClassT *t){    return type_iterator(this, t, 0);}inline RouterT::const_type_iteratorRouterT::begin_elements(ElementClassT *t) const{    return const_type_iterator(this, t, 0);}inline RouterT::const_iteratorRouterT::end_elements() const{    return const_iterator();}inline RouterT::iteratorRouterT::end_elements(){    return iterator();}inline voidRouterT::const_type_iterator::operator++(int){    if (_e)	step(_e->router(), _e->type(), _e->eindex() + 1);}inline voidRouterT::const_type_iterator::operator++(){    (*this)++;}inline const ElementT *RouterT::element(const String &s) const{    int i = _element_name_map[s];    return (i >= 0 ? _elements[i] : 0);}inline ElementT *RouterT::element(const String &s){    int i = _element_name_map[s];    return (i >= 0 ? _elements[i] : 0);}inline StringRouterT::ename(int e) const{    return _elements[e]->name();}inline ElementClassT *RouterT::etype(int e) const{    return _elements[e]->type();}inline StringRouterT::etype_name(int e) const{    return _elements[e]->type()->name();}inline ElementClassT *RouterT::declared_type(const String &name) const{    return declared_type(name, 0x7FFFFFFF);}inline boolRouterT::add_connection(ElementT *from_elt, int from_port, ElementT *to_elt,			int to_port, const String &landmark){    return add_connection(PortT(from_elt, from_port), PortT(to_elt, to_port), landmark);}inline boolRouterT::has_connection(const PortT &hfrom, const PortT &hto) const{    return find_connection(hfrom, hto) >= 0;}inline boolRouterT::insert_before(ElementT *e, const PortT &h){    return insert_before(PortT(e, 0), h);}inline boolRouterT::insert_after(ElementT *e, const PortT &h){    return insert_after(PortT(e, 0), h);}inline ArchiveElement &RouterT::archive(const String &name){    return _archive[_archive_map[name]];}inline const ArchiveElement &RouterT::archive(const String &name) const{    return _archive[_archive_map[name]];}inline voidRouterT::add_formal(const String &fname, const String &ftype){    _formals.push_back(fname);    _formal_types.push_back(ftype);}inline booloperator==(const RouterT::const_iterator &i, const RouterT::const_iterator &j){    return i.operator->() == j.operator->();}inline booloperator!=(const RouterT::const_iterator &i, const RouterT::const_iterator &j){    return i.operator->() != j.operator->();}inline booloperator==(const RouterT::const_type_iterator &i, const RouterT::const_type_iterator &j){    return i.operator->() == j.operator->();}inline booloperator!=(const RouterT::const_type_iterator &i, const RouterT::const_type_iterator &j){    return i.operator->() != j.operator->();}inline booloperator==(const RouterT::const_type_iterator &i, const RouterT::const_iterator &j){    return i.operator->() == j.operator->();}inline booloperator!=(const RouterT::const_type_iterator &i, const RouterT::const_iterator &j){    return i.operator->() != j.operator->();}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -