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

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 . C P P  
  15.       
  16.   COLLECTION CLASS DEFINITION
  17.        
  18.   VERSION:
  19.   2.8
  20.   
  21.   RCS INFO:
  22.   $Header: $
  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. #include "collect.h"
  42. #ifdef __unix
  43. // create an empty collection
  44. template <class T>
  45. SnmpCollection<T>::SnmpCollection( void):count(0)
  46.   data.next=0;
  47.   data.prev=0;
  48. };
  49.    
  50. // create a collection using a single template object
  51. template <class T>
  52. SnmpCollection<T>::SnmpCollection( const T &t):count( 1) 
  53.   data.item[0] = new T( t);
  54.   data.next=0;
  55.   data.prev=0;
  56. };
  57. // create a collection with another collection
  58. // copy constructor
  59. template <class T>
  60. SnmpCollection<T>::SnmpCollection( const SnmpCollection<T> &c)
  61. {
  62.   count = 0;
  63.   data.next=0;
  64.   data.prev=0;
  65.   if ( c.count == 0) {
  66.    count = 0;
  67.    return;
  68.   }
  69.   // load up the new collection
  70.   cBlock *current = &data;
  71.   cBlock *nextBlock;
  72.   int cn = 0;
  73.   count = 0;
  74.   while ( count < c.count) {
  75.    if ( cn >= MAXT) {
  76.  nextBlock = new cBlock;
  77.  nextBlock->prev = current;
  78.  nextBlock->next = 0;
  79.  current->next = nextBlock;
  80.  current = nextBlock;
  81.  cn=0;
  82.  }
  83.  current->item[cn] = new T(c[count]);
  84.      count++;
  85.  cn++;
  86.   }
  87. };
  88. // destroy the collection
  89. template <class T>
  90. SnmpCollection<T>::~SnmpCollection()
  91.   if ( count == 0)
  92.  return;
  93.   // delete the data
  94.   cBlock *current = &data;
  95.   int z=0;
  96.   int cn=0;
  97.   while ( z< count) {
  98.     if (cn >= MAXT) {
  99.   cn =0;
  100.   current = current->next;
  101. }
  102.   delete current->item[cn];
  103.   cn++;
  104.   z++;
  105.   }
  106.   // delete the blocks
  107.   while ( current->next != 0)
  108.  current = current->next;
  109.   while ( current->prev != 0) {
  110.     current = current->prev;
  111. delete current->next;
  112.    }
  113. };
  114.    
  115. // get the size of the collection
  116. template <class T>
  117. int SnmpCollection<T>::size()
  118.   return count; 
  119. };
  120. // append an item to the collection
  121. template <class T>
  122. SnmpCollection<T>& SnmpCollection<T>::operator +=( const T &i)
  123.   cBlock *current = &data;
  124.   cBlock *add;
  125.   int cn = (int) count % MAXT;
  126.   while (current->next != 0)
  127.     current = current->next;
  128.   if ((count > 0) && ((count % MAXT)== 0)) {
  129.    add = new cBlock;
  130.    current->next = add;
  131.    add->prev =  current;
  132.    add->next = 0;
  133.    add->item[0] = new T(i);
  134.    }
  135.    else {
  136.      current->item[cn] = new T(i);
  137.  cn++;
  138.    }
  139.    count++;
  140.    return *this; 
  141. };
  142. // assign one collection to another
  143. template <class T>
  144. SnmpCollection<T>& SnmpCollection<T>::operator = ( const SnmpCollection<T> &c)
  145. {
  146.    // delete the data
  147.    cBlock *current = &data;
  148.    int z=0;
  149.    int cn=0;
  150.    while ( z< count) {
  151.       if (cn >= MAXT) {
  152.      cn =0;
  153.      current = current->next;
  154.       }
  155.   delete current->item[cn];
  156.   cn++;
  157.   z++;
  158.    }
  159.    // delete the blocks
  160.    while ( current->next != 0)
  161.       current = current->next;
  162.    while ( current->prev != 0) {
  163.       current = current->prev;
  164.   delete current->next;
  165.    }
  166.    count=0;
  167.    if ( c.count ==0)
  168.  return *this;
  169.    // load up the new collection
  170.    current = &data;
  171.    cBlock *nextBlock;
  172.    cn = 0;
  173.    count = 0;
  174.    while ( count < c.count) {
  175.       if ( cn >= MAXT) {
  176.      nextBlock = new cBlock;
  177.  nextBlock->prev = current;
  178.  nextBlock->next = 0;
  179.  current->next = nextBlock;
  180.  current = nextBlock;
  181.  cn=0;
  182.    }
  183.    current->item[cn] = new T( c[count]);
  184.        count++;
  185.    cn++;
  186.    }
  187.    return *this;
  188. };
  189. // access an element in the collection
  190. template <class T>
  191. T SnmpCollection<T>::operator[]( int p) const
  192.    if (p<count) {
  193.      cBlock const *current = &data;
  194.      int bn = (int) (p / MAXT);
  195.  for (int z=0; z<bn; z++)
  196.     current = current->next;
  197.  int cn = (int) p % MAXT;
  198.  return (T) *(current->item[cn]);
  199.    }
  200.    else {   // return an instance of nothing!!
  201.       T t;
  202.   return (T) (t);
  203.    }
  204. };
  205. // set an element in the collection
  206. template <class T>
  207. int SnmpCollection<T>::set_element( const T& i, const int p)
  208.    cBlock *current = &data;
  209.    if ( p > count)
  210.       return -1; // not found!
  211.    int bn = (int) p / MAXT;
  212.    int cn = (int) p % MAXT;
  213.    for (int z=0; z<bn; z++)
  214.       current = current->next;
  215.    delete current->item[cn];
  216.    current->item[cn] = new T(i);
  217.    return 0;
  218. };
  219. // get an element in the collection
  220. template <class T>
  221. int SnmpCollection<T>::get_element( T& i, const int p) const
  222.    cBlock const *current = &data;
  223.    if ( p > count)
  224.       return -1; // not found!
  225.    int bn = (int) p / MAXT;
  226.    int cn = (int) p % MAXT;
  227.    for (int z=0; z<bn; z++)
  228.       current = current->next;
  229.    i = *(current->item[cn]);
  230.    return 0;
  231. };
  232. // apply an function to the entire collection, iterator
  233. template <class T>
  234. void SnmpCollection<T>::apply( void f( T&))
  235.    T temp;
  236.    for ( int z=0;z<count;z++) {
  237.       this->get_element( temp,z);
  238.   f( temp);
  239.    }
  240. }
  241. // looks for an element in the collection
  242. // returns TRUE if found
  243. template <class T>
  244. int SnmpCollection<T>::find( const T& i)
  245. {
  246.    T temp;
  247.    for ( int z=0;z<count;z++) {
  248.       this->get_element( temp,z);
  249.   if ( temp == i)
  250.     return TRUE;
  251.    }
  252.    return FALSE;
  253. }
  254. #endif  // end if __unix