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

📄 collect1.h

📁 hp snmp++ (support ipv6)
💻 H
字号:
/*_############################################################################  _##   _##  collect1.h    _##  _##  SNMP++v3.2.20  _##  -----------------------------------------------  _##  Copyright (c) 2001-2006 Jochen Katz, Frank Fock  _##  _##  This software is based on SNMP++2.6 from Hewlett Packard:  _##    _##    Copyright (c) 1996  _##    Hewlett-Packard Company  _##    _##  ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.  _##  Permission to use, copy, modify, distribute and/or sell this software   _##  and/or its documentation is hereby granted without fee. User agrees   _##  to display the above copyright notice and this license notice in all   _##  copies of the software and any documentation of the software. User   _##  agrees to assume all liability for the use of the software;   _##  Hewlett-Packard and Jochen Katz make no representations about the   _##  suitability of this software for any purpose. It is provided   _##  "AS-IS" without warranty of any kind, either express or implied. User   _##  hereby grants a royalty-free license to any and all derivatives based  _##  upon this software code base.   _##    _##  Stuttgart, Germany, Sun Jan 15 23:12:08 CET 2006   _##    _##########################################################################*/// $Id: collect1.h,v 1.5 2004/09/05 18:59:48 katz Exp $#ifdef SNMP_PP_NAMESPACEnamespace Snmp_pp {#endiftemplate <class T> class SnmpCollection{  class cBlock  {    public:     cBlock(cBlock *p, cBlock *n) : prev(p), next(n) {};     T *item[MAXT];     cBlock *prev;     cBlock *next;  }; public:  /**   * Create an empty collection.   */  SnmpCollection()    : count(0), data(0,0) {};  /**   * Create a collection using a single template object.   */  SnmpCollection(const T &t)    : count(1), data(0, 0)  {    data.item[0] = (T*) (t.clone());  };  /**   * Create a collection with another collection (copy constructor).   */  SnmpCollection(const SnmpCollection<T> &c)    : count(0), data(0, 0)  {    if (c.count == 0) return;    // load up the new collection    cBlock *current = &data;    cBlock *nextBlock;    int cn = 0;    while (count < c.count)    {      if (cn >= MAXT)      {	nextBlock = new cBlock(current, 0);	current->next = nextBlock;	current = nextBlock;	cn=0;      }      T *tmp;      c.get_element(tmp, count);      current->item[cn] = (T*) (tmp->clone());      count++;      cn++;    }  };  /**   * Destroy the collection.   */  ~SnmpCollection()  {    clear();  // just delete the data  };  /**   * Get the size of the collection.   */  int size() const  {    return count;  };  /**   * Append an item to the collection.   */  SnmpCollection& operator +=(const T &i)  {    cBlock *current = &data;    int cn = (int) count % MAXT;    while (current->next)      current = current->next;    if ((count > 0) && ((count % MAXT) == 0))    {      cBlock *add = new cBlock(current, 0);      if (!add) return *this;      current->next = add;      add->item[0] = (T*) (i.clone());    }    else    {      current->item[cn] = (T*) (i.clone());    }    count++;    return *this;  };  /**   * Assign one collection to another.   */  SnmpCollection &operator =(const SnmpCollection<T> &c)  {    if (this == &c) return *this;  // check for self assignment    clear(); // delete the data    if (c.count == 0) return *this;    // load up the new collection    cBlock *current = &data;    cBlock *nextBlock;    int cn = 0;    count = 0;    while (count < c.count)    {      if (cn >= MAXT)      {	nextBlock = new cBlock(current, 0);	current->next = nextBlock;	current = nextBlock;	cn=0;      }      T *tmp;      c.get_element(tmp, count);      current->item[cn] = (T*) (tmp->clone());      count++;      cn++;    }    return *this;  };  /**   * Access an element in the collection.   *   * @return The requestet element or an empty element if out of bounds.   */  T operator[](const int p) const  {    if ((p < count) && (p >= 0))    {      cBlock const *current = &data;      int bn = (int) (p / MAXT);      int cn = (int) p % MAXT;      for (int z=0; z<bn; z++)	current = current->next;      return *(current->item[cn]);    }    else    {      // return an instance of nothing!!      T t;      return t;    }  };  /**   * Set an element in the collection.   *   * @return 0 on success and -1 on failure.   */  int set_element( const T& i, const int p)  {    if ((p < 0) || (p > count)) return -1; // not found!    cBlock *current = &data;    int bn = (int) p / MAXT;    int cn = (int) p % MAXT;    for (int z=0; z<bn; z++)      current = current->next;    delete current->item[cn];    current->item[cn] = (T*) (i.clone());    return 0;  };  /**   * Get an element in the collection.   *   * @return 0 on success and -1 on failure.   */  int get_element(T &t, const int p) const  {    if ((p < 0) || (p > count)) return -1; // not found!    cBlock const *current = &data;    int bn = (int) p / MAXT;    int cn = (int) p % MAXT;    for (int z=0; z<bn; z++)      current = current->next;    t = *(current->item[cn]);    return 0;  };  /**   * Get a pointer to an element in the collection.   *   * @return 0 on success and -1 on failure.   */  int get_element(T *&t, const int p) const  {    if ((p < 0) || (p > count)) return -1; // not found!    cBlock const *current = &data;    int bn = (int) p / MAXT;    int cn = (int) p % MAXT;    for (int z=0; z<bn; z++)      current = current->next;    t = current->item[cn];    return 0;  };  /**   * Apply an function to the entire collection, iterator.   */  void apply(void f(T&))  {    T temp;    for ( int z=0; z<count; z++)    {      this->get_element(temp, z);      f(temp);    }  };  /**   * Looks for an element in the collection.   *   * @return TRUE if found.   */  int find(const T& i, int &pos) const  {    T temp;    for (int z=0; z<count; z++)    {      this->get_element(temp, z);      if ( temp == i) {	pos = z;	return TRUE;      }    }    return FALSE;  };  /**   * Delete an element in the collection.   */  int remove(const T& i)  {    // first see if we have it    int pos;    if (find(i, pos))    {      SnmpCollection<T> newCollection;      for (int z=0; z<count; z++)      {	if (z != pos)	{	  T item;	  get_element(item, z);	  newCollection += item;	}      }      // assign new collection to 'this'      operator =(newCollection);      return TRUE;    }    return FALSE;   // not found thus not removed  };  /**   * Delete all elements within the collection.   */  void clear()  {    if (count == 0) return;    cBlock *current = &data;    int z=0;    int cn=0;    while ( z< count)    {      if (cn >= MAXT)      {	cn =0;	current = current->next;      }      delete current->item[cn];      cn++;      z++;    }    // delete the blocks    while (current->next)      current = current->next;    while (current->prev)    {      current = current->prev;      delete current->next;    }    count = 0;    data.next=0;    data.prev=0;  }; private:  int count;  cBlock data;};#ifdef SNMP_PP_NAMESPACE}; // end of namespace Snmp_pp#endif 

⌨️ 快捷键说明

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