collect.h
上传用户:czjinwang
上传日期:2007-01-12
资源大小:2484k
文件大小:13k
源码类别:

SNMP编程

开发平台:

Visual C++

  1. /*===================================================================
  2.   Copyright (c) 1999
  3.   Hewlett-Packard Company
  4.   ATTENTION: USE OF THIS SOFTWARE IS SUBJECT TO THE FOLLOWING TERMS.
  5.   Permission to use, copy, modify, distribute and/or sell this software 
  6.   and/or its documentation is hereby granted without fee. User agrees 
  7.   to display the above copyright notice and this license notice in all 
  8.   copies of the software and any documentation of the software. User 
  9.   agrees to assume all liability for the use of the software; Hewlett-Packard 
  10.   makes no representations about the suitability of this software for any 
  11.   purpose. It is provided "AS-IS without warranty of any kind,either express 
  12.   or implied. User hereby grants a royalty-free license to any and all 
  13.   derivatives based upon this software code base. 
  14.   SNMP++ C O L L E C T . H   
  15.       
  16.   COLLECTION CLASS DEFINITION
  17.        
  18.   VERSION:
  19.   2.8
  20.   
  21.   RCS INFO:
  22.   $Header: collect.h,v 1.12 97/03/26 09:35:52 hmgr Exp $
  23.        
  24.   DESIGN:
  25.   Peter E Mellquist
  26.                 
  27.   AUTHOR:      
  28.   Peter E Mellquist
  29.               
  30.   LANGUAGE:
  31.   ANSI C++ 
  32.       
  33.   OPERATING SYSTEMS:
  34.   Win 32
  35.   BSD UNIX
  36.       
  37.   DESCRIPTION:
  38.   Simple Collection classes for SNMP++ classes.
  39.       
  40. =====================================================================*/ 
  41. #ifndef _COLLECTION
  42. #define _COLLECTION
  43. #ifndef TRUE
  44. #define TRUE 1
  45. #endif
  46. #ifndef FALSE
  47. #define FALSE 0
  48. #endif
  49. #define MAXT 25     // elements per block
  50. #ifdef GCC
  51. template <class T> class SnmpCollection
  52. {
  53.    class cBlock {
  54.    public:
  55.    T *item[MAXT];
  56.    cBlock *next;
  57.    cBlock *prev;
  58.    };
  59. public:
  60.    
  61.    // create an empty collection
  62.    SnmpCollection( void):count(0)
  63.    { 
  64.  data.next=0;
  65.      data.prev=0;
  66.    };
  67.    
  68.    // create a collection using a single template object
  69.    SnmpCollection( const T &t):count( 1) 
  70.    { 
  71.      data.item[0] = new T( t);
  72.      data.next=0;
  73.  data.prev=0;
  74.    };
  75.    // create a collection with another collection
  76.    // copy constructor
  77.    SnmpCollection( const SnmpCollection<T> &c)
  78.    {
  79.  count = 0;
  80.  data.next=0;
  81.      data.prev=0;
  82.  if ( c.count == 0) {
  83.  count = 0;
  84.  return;
  85.  }
  86.  // load up the new collection
  87.  cBlock *current = &data;
  88.  cBlock *nextBlock;
  89.  int cn = 0;
  90.  count = 0;
  91.  while ( count < c.count) {
  92.  if ( cn >= MAXT) {
  93.  nextBlock = new cBlock;
  94.  nextBlock->prev = current;
  95.  nextBlock->next = 0;
  96.  current->next = nextBlock;
  97.  current = nextBlock;
  98.  cn=0;
  99.  }
  100.  current->item[cn] = new T(c[count]);
  101.          count++;
  102.  cn++;
  103.  }
  104.    };
  105.    // destroy the collection
  106.    ~SnmpCollection()
  107.    { 
  108.  if ( count == 0)
  109.  return;
  110.  // delete the data
  111.  cBlock *current = &data;
  112.  int z=0;
  113.      int cn=0;
  114.  while ( z< count) {
  115.           if (cn >= MAXT) {
  116.   cn =0;
  117.   current = current->next;
  118.   }
  119.   delete current->item[cn];
  120.   cn++;
  121.   z++;
  122.  }
  123.  // delete the blocks
  124.  while ( current->next != 0)
  125.  current = current->next;
  126.  while ( current->prev != 0) {
  127.  current = current->prev;
  128.  delete current->next;
  129.  }
  130.    };
  131.    
  132.    // get the size of the collection
  133.    int size()
  134.    { 
  135.      return count; 
  136.    };
  137.    // append an item to the collection
  138.    SnmpCollection& operator +=( const T &i)
  139.    { 
  140.  cBlock *current = &data;
  141.  cBlock *add;
  142.  int cn = (int) count % MAXT;
  143.  while (current->next != 0)
  144.  current = current->next;
  145.  if ((count > 0) && ((count % MAXT)== 0)) {
  146.  add = new cBlock;
  147.  current->next = add;
  148.  add->prev =  current;
  149.  add->next = 0;
  150.  add->item[0] = new T(i);
  151.  }
  152.  else {
  153.  current->item[cn] = new T(i);
  154.  cn++;
  155.  }
  156.  count++;
  157.      return *this; 
  158.    };
  159.    // assign one collection to another
  160.    SnmpCollection & operator = ( const SnmpCollection<T> &c)
  161.    {
  162.     // delete the data
  163.  cBlock *current = &data;
  164.  int z=0;
  165.      int cn=0;
  166.  while ( z< count) {
  167.           if (cn >= MAXT) {
  168.   cn =0;
  169.   current = current->next;
  170.   }
  171.   delete current->item[cn];
  172.   cn++;
  173.   z++;
  174.  }
  175.  // delete the blocks
  176.  while ( current->next != 0)
  177.  current = current->next;
  178.  while ( current->prev != 0) {
  179.  current = current->prev;
  180.  delete current->next;
  181.  }
  182.  count=0;
  183.  if ( c.count ==0)
  184.  return *this;
  185.  // load up the new collection
  186.  current = &data;
  187.  cBlock *nextBlock;
  188.  cn = 0;
  189.  count = 0;
  190.  while ( count < c.count) {
  191.  if ( cn >= MAXT) {
  192.  nextBlock = new cBlock;
  193.  nextBlock->prev = current;
  194.  nextBlock->next = 0;
  195.  current->next = nextBlock;
  196.  current = nextBlock;
  197.  cn=0;
  198.  }
  199.  current->item[cn] = new T( c[count]);
  200.          count++;
  201.  cn++;
  202.  }
  203.  return *this;
  204.    };
  205.    // access an element in the collection
  206.    T operator[]( int p) const
  207.    { 
  208.  if (p<count) {
  209. cBlock const *current = &data;
  210. int bn = (int) (p / MAXT);
  211. for (int z=0; z<bn; z++)
  212.        current = current->next;
  213.     int cn = (int) p % MAXT;
  214. return (T) *(current->item[cn]);
  215.  }
  216.  else {   // return an instance of nothing!!
  217.  T t;
  218.  return (T) (t);
  219.  }
  220.    };
  221.    // set an element in the collection
  222.    int set_element( const T& i, const int p)
  223.    { 
  224.  cBlock *current = &data;
  225.  if ( p > count)
  226.  return -1; // not found!
  227.  int bn = (int) p / MAXT;
  228.  int cn = (int) p % MAXT;
  229.  for (int z=0; z<bn; z++)
  230.      current = current->next;
  231.  delete current->item[cn];
  232.  current->item[cn] = new T(i);
  233.  return 0;
  234.    };
  235.    // get an element in the collection
  236.    int get_element( T& i, const int p) const
  237.    { 
  238.  cBlock const *current = &data;
  239.  if ( p > count)
  240.  return -1; // not found!
  241.  int bn = (int) p / MAXT;
  242.  int cn = (int) p % MAXT;
  243.  for (int z=0; z<bn; z++)
  244.      current = current->next;
  245.  i = *(current->item[cn]);
  246.  return 0;
  247.    };
  248.    // apply an function to the entire collection, iterator
  249.    void apply( void f( T&))
  250.    { 
  251.  T temp;
  252.      for ( int z=0;z<count;z++) {
  253.  this->get_element( temp,z);
  254.  f( temp);
  255.  }
  256.    }
  257.    // looks for an element in the collection
  258.    // returns TRUE if found
  259.    int find( const T& i)
  260.    {
  261.  T temp;
  262.  for ( int z=0;z<count;z++) {
  263.  this->get_element( temp,z);
  264.  if ( temp == i)
  265.  return TRUE;
  266.  }
  267.  return FALSE;
  268.    }
  269. private:
  270.    int count;
  271.    cBlock data;
  272. }; // end template collection class def
  273. #endif // GCC
  274. #ifdef WIN32
  275. #ifndef __unix
  276. template <class T> class SnmpCollection
  277. {
  278.    class cBlock {
  279.    public:
  280.    T *item[MAXT];
  281.    cBlock *next;
  282.    cBlock *prev;
  283.    };
  284. public:
  285.    
  286.    // create an empty collection
  287.    SnmpCollection( void):count(0)
  288.    { 
  289.  data.next=0;
  290.      data.prev=0;
  291.    };
  292.    
  293.    // create a collection using a single template object
  294.    SnmpCollection( const T &t):count( 1) 
  295.    { 
  296.      data.item[0] = new T( t);
  297.      data.next=0;
  298.  data.prev=0;
  299.    };
  300.    // create a collection with another collection
  301.    // copy constructor
  302.    SnmpCollection( const SnmpCollection<T> &c)
  303.    {
  304.  count = 0;
  305.  data.next=0;
  306.      data.prev=0;
  307.  if ( c.count == 0) {
  308.  count = 0;
  309.  return;
  310.  }
  311.  // load up the new collection
  312.  cBlock *current = &data;
  313.  cBlock *nextBlock;
  314.  int cn = 0;
  315.  count = 0;
  316.  while ( count < c.count) {
  317.  if ( cn >= MAXT) {
  318.  nextBlock = new cBlock;
  319.  nextBlock->prev = current;
  320.  nextBlock->next = 0;
  321.  current->next = nextBlock;
  322.  current = nextBlock;
  323.  cn=0;
  324.  }
  325.  current->item[cn] = new T(c[count]);
  326.          count++;
  327.  cn++;
  328.  }
  329.    };
  330.    // destroy the collection
  331.    ~SnmpCollection()
  332.    { 
  333.  if ( count == 0)
  334.  return;
  335.  // delete the data
  336.  cBlock *current = &data;
  337.  int z=0;
  338.      int cn=0;
  339.  while ( z< count) {
  340.           if (cn >= MAXT) {
  341.   cn =0;
  342.   current = current->next;
  343.   }
  344.   delete current->item[cn];
  345.   cn++;
  346.   z++;
  347.  }
  348.  // delete the blocks
  349.  while ( current->next != 0)
  350.  current = current->next;
  351.  while ( current->prev != 0) {
  352.  current = current->prev;
  353.  delete current->next;
  354.  }
  355.    };
  356.    
  357.    // get the size of the collection
  358.    int size()
  359.    { 
  360.      return count; 
  361.    };
  362.    // append an item to the collection
  363.    SnmpCollection& operator +=( const T &i)
  364.    { 
  365.  cBlock *current = &data;
  366.  cBlock *add;
  367.  int cn = (int) count % MAXT;
  368.  while (current->next != 0)
  369.  current = current->next;
  370.  if ((count > 0) && ((count % MAXT)== 0)) {
  371.  add = new cBlock;
  372.  current->next = add;
  373.  add->prev =  current;
  374.  add->next = 0;
  375.  add->item[0] = new T(i);
  376.  }
  377.  else {
  378.  current->item[cn] = new T(i);
  379.  cn++;
  380.  }
  381.  count++;
  382.      return *this; 
  383.    };
  384.    // assign one collection to another
  385.    SnmpCollection & operator = ( const SnmpCollection<T> &c)
  386.    {
  387.     // delete the data
  388.  cBlock *current = &data;
  389.  int z=0;
  390.      int cn=0;
  391.  while ( z< count) {
  392.           if (cn >= MAXT) {
  393.   cn =0;
  394.   current = current->next;
  395.   }
  396.   delete current->item[cn];
  397.   cn++;
  398.   z++;
  399.  }
  400.  // delete the blocks
  401.  while ( current->next != 0)
  402.  current = current->next;
  403.  while ( current->prev != 0) {
  404.  current = current->prev;
  405.  delete current->next;
  406.  }
  407.  count=0;
  408.  if ( c.count ==0)
  409.  return *this;
  410.  // load up the new collection
  411.  current = &data;
  412.  cBlock *nextBlock;
  413.  cn = 0;
  414.  count = 0;
  415.  while ( count < c.count) {
  416.  if ( cn >= MAXT) {
  417.  nextBlock = new cBlock;
  418.  nextBlock->prev = current;
  419.  nextBlock->next = 0;
  420.  current->next = nextBlock;
  421.  current = nextBlock;
  422.  cn=0;
  423.  }
  424.  current->item[cn] = new T( c[count]);
  425.          count++;
  426.  cn++;
  427.  }
  428.  return *this;
  429.    };
  430.    // access an element in the collection
  431.    T operator[]( int p) const
  432.    { 
  433.  if (p<count) {
  434. cBlock const *current = &data;
  435. int bn = (int) (p / MAXT);
  436. for (int z=0; z<bn; z++)
  437.        current = current->next;
  438.     int cn = (int) p % MAXT;
  439. return (T) *(current->item[cn]);
  440.  }
  441.  else {   // return an instance of nothing!!
  442.  T t;
  443.  return (T) (t);
  444.  }
  445.    };
  446.    // set an element in the collection
  447.    int set_element( const T& i, const int p)
  448.    { 
  449.  cBlock *current = &data;
  450.  if ( p > count)
  451.  return -1; // not found!
  452.  int bn = (int) p / MAXT;
  453.  int cn = (int) p % MAXT;
  454.  for (int z=0; z<bn; z++)
  455.      current = current->next;
  456.  delete current->item[cn];
  457.  current->item[cn] = new T(i);
  458.  return 0;
  459.    };
  460.    // get an element in the collection
  461.    int get_element( T& i, const int p) const
  462.    { 
  463.  cBlock const *current = &data;
  464.  if ( p > count)
  465.  return -1; // not found!
  466.  int bn = (int) p / MAXT;
  467.  int cn = (int) p % MAXT;
  468.  for (int z=0; z<bn; z++)
  469.      current = current->next;
  470.  i = *(current->item[cn]);
  471.  return 0;
  472.    };
  473.    // apply an function to the entire collection, iterator
  474.    void apply( void f( T&))
  475.    { 
  476.  T temp;
  477.      for ( int z=0;z<count;z++) {
  478.  this->get_element( temp,z);
  479.  f( temp);
  480.  }
  481.    }
  482.    // looks for an element in the collection
  483.    // returns TRUE if found
  484.    int find( const T& i)
  485.    {
  486.  T temp;
  487.  for ( int z=0;z<count;z++) {
  488.  this->get_element( temp,z);
  489.  if ( temp == i)
  490.  return TRUE;
  491.  }
  492.  return FALSE;
  493.    }
  494. private:
  495.    int count;
  496.    cBlock data;
  497. }; // end template collection class def
  498. #endif  // ifndef __unix
  499. #endif  // end if WIN32
  500. #ifdef __unix
  501. #ifndef GCC
  502. template <class T> class SnmpCollection
  503. {
  504.    class cBlock {
  505.    public:
  506.    T *item[MAXT];
  507.    cBlock *next;
  508.    cBlock *prev;
  509.    };
  510. public:
  511.    
  512.    // create an empty collection
  513.    SnmpCollection( void);
  514.    
  515.    // create a collection using a single template object
  516.    SnmpCollection( const T &t); 
  517.    // create a collection with another collection
  518.    // copy constructor
  519.    SnmpCollection( const SnmpCollection<T> &c);
  520.    // destroy the collection
  521.    ~SnmpCollection();
  522.    
  523.    // get the size of the collection
  524.    int size();
  525.    // append an item to the collection
  526.    SnmpCollection& operator +=( const T &i);
  527.    // assign one collection to another
  528.    SnmpCollection & operator = ( const SnmpCollection<T> &c);
  529.    // access an element in the collection
  530.    T operator[]( int p) const;
  531.    // set an element in the collection
  532.    int set_element( const T& i, const int p);
  533.    // get an element in the collection
  534.    int get_element( T& i, const int p) const;
  535.    // apply an function to the entire collection, iterator
  536.    void apply( void f( T&));
  537.    // looks for an element in the collection
  538.    // returns TRUE if found
  539.    int find( const T& i);
  540. private:
  541.    int count;
  542.    cBlock data;
  543. }; // end template collection class def
  544. #endif  // end if __unix
  545. #endif  // GCC
  546. #endif  // end if _COLLECTION