summaryrefslogtreecommitdiff
path: root/ASNMP/asnmp/collect.h
diff options
context:
space:
mode:
Diffstat (limited to 'ASNMP/asnmp/collect.h')
-rw-r--r--ASNMP/asnmp/collect.h370
1 files changed, 370 insertions, 0 deletions
diff --git a/ASNMP/asnmp/collect.h b/ASNMP/asnmp/collect.h
new file mode 100644
index 00000000000..f2d416806b9
--- /dev/null
+++ b/ASNMP/asnmp/collect.h
@@ -0,0 +1,370 @@
+/* -*-C++-*- */
+#ifndef _COLLECTION
+#define _COLLECTION
+// ============================================================================
+//
+// = LIBRARY
+// asnmp
+//
+// = FILENAME
+// collect.h
+//
+// = DESCRIPTION
+// Address class definition. Encapsulates various network
+// addresses into easy to use, safe and portable classes.
+//
+// = AUTHOR
+// Peter E Mellquist
+//
+// ============================================================================
+/*===================================================================
+
+ 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
+ makes 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.
+=====================================================================*/
+
+
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#define MAXT 25 // elements per block
+
+
+#ifdef WIN32
+template <class T> class SnmpCollection
+{
+ class cBlock
+ {
+ public:
+ T *item[MAXT];
+ cBlock *next;
+ cBlock *prev;
+ };
+
+public:
+
+ // create an empty collection
+ SnmpCollection( void):count(0)
+ {
+ data.next=0;
+ data.prev=0;
+ };
+
+
+ // create a collection using a single template object
+ SnmpCollection( const T &t):count( 1)
+ {
+ data.item[0] = new T( t);
+ data.next=0;
+ data.prev=0;
+ };
+
+ // create a collection with another collection
+ // copy constructor
+ SnmpCollection( const SnmpCollection<T> &c)
+ {
+ count = 0;
+ data.next=0;
+ data.prev=0;
+
+ if ( c.count == 0) {
+ count = 0;
+ return;
+ }
+
+ // 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;
+ nextBlock->prev = current;
+ nextBlock->next = 0;
+ current->next = nextBlock;
+ current = nextBlock;
+ cn=0;
+ }
+ current->item[cn] = new T(c[count]);
+ count++;
+ cn++;
+ }
+ };
+
+ // destroy the collection
+ ~SnmpCollection()
+ {
+ if ( count == 0)
+ return;
+
+ // delete the data
+ 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 != 0)
+ current = current->next;
+ while ( current->prev != 0) {
+ current = current->prev;
+ delete current->next;
+ }
+
+ };
+
+ // get the size of the collection
+ int size()
+ {
+ return count;
+ };
+
+ // append an item to the collection
+ SnmpCollection& operator +=( const T &i)
+ {
+
+ cBlock *current = &data;
+ cBlock *add;
+ int cn = (int) count % MAXT;
+ while (current->next != 0)
+ current = current->next;
+ if ((count > 0) && ((count % MAXT)== 0)) {
+ add = new cBlock;
+ current->next = add;
+ add->prev = current;
+ add->next = 0;
+ add->item[0] = new T(i);
+ }
+ else {
+ current->item[cn] = new T(i);
+ cn++;
+ }
+ count++;
+
+ return *this;
+ };
+
+
+ // assign one collection to another
+ SnmpCollection & operator = ( const SnmpCollection<T> &c)
+ {
+
+ // delete the data
+ 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 != 0)
+ current = current->next;
+ while ( current->prev != 0) {
+ current = current->prev;
+ delete current->next;
+ }
+ count=0;
+
+ if ( c.count ==0)
+ return *this;
+
+
+ // load up the new collection
+ current = &data;
+ cBlock *nextBlock;
+ cn = 0;
+ count = 0;
+ while ( count < c.count) {
+ if ( cn >= MAXT) {
+ nextBlock = new cBlock;
+ nextBlock->prev = current;
+ nextBlock->next = 0;
+ current->next = nextBlock;
+ current = nextBlock;
+ cn=0;
+ }
+ current->item[cn] = new T( c[count]);
+ count++;
+ cn++;
+ }
+
+ return *this;
+ };
+
+ // access an element in the collection
+ T operator[]( int p) const
+ {
+ if (p<count) {
+ cBlock const *current = &data;
+ int bn = (int) (p / MAXT);
+ for (int z=0; z<bn; z++)
+ current = current->next;
+ int cn = (int) p % MAXT;
+ return (T) *(current->item[cn]);
+ }
+ else { // return an instance of nothing!!
+ T t;
+ return (T) (t);
+ }
+
+ };
+
+ // set an element in the collection
+ int set_element( const T& i, const int p)
+ {
+
+ cBlock *current = &data;
+ if ( p > count)
+ return -1; // not found!
+ 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] = new T(i);
+ return 0;
+
+ };
+
+ // get an element in the collection
+ int get_element( T& i, const int p) const
+ {
+
+ cBlock const *current = &data;
+ if ( p > count)
+ return -1; // not found!
+ int bn = (int) p / MAXT;
+ int cn = (int) p % MAXT;
+ for (int z=0; z<bn; z++)
+ current = current->next;
+ i = *(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
+ // returns TRUE if found
+ int find( const T& i)
+ {
+ T temp;
+ for ( int z=0;z<count;z++) {
+ this->get_element( temp,z);
+ if ( temp == i)
+ return TRUE;
+ }
+ return FALSE;
+ }
+
+
+private:
+ int count;
+ cBlock data;
+
+}; // end template collection class def
+#endif // end if WIN32
+
+#ifdef __unix
+
+template <class T> class SnmpCollection
+{
+
+ class cBlock {
+ public:
+ T *item[MAXT];
+ cBlock *next;
+ cBlock *prev;
+ };
+
+public:
+
+ // create an empty collection
+ SnmpCollection( void);
+
+
+ // create a collection using a single template object
+ SnmpCollection( const T &t);
+
+ // create a collection with another collection
+ // copy constructor
+ SnmpCollection( const SnmpCollection<T> &c);
+
+ // destroy the collection
+ ~SnmpCollection();
+
+ // get the size of the collection
+ int size();
+
+ // append an item to the collection
+ SnmpCollection& operator +=( const T &i);
+
+ // assign one collection to another
+ SnmpCollection & operator = ( const SnmpCollection<T> &c);
+
+ // access an element in the collection
+ T operator[]( int p) const;
+
+ // set an element in the collection
+ int set_element( const T& i, const int p);
+
+ // get an element in the collection
+ int get_element( T& i, const int p) const;
+
+ // apply an function to the entire collection, iterator
+ void apply( void f( T&));
+
+ // looks for an element in the collection
+ // returns TRUE if found
+ int find( const T& i);
+
+private:
+ int count;
+ cBlock data;
+
+}; // end template collection class def
+
+#endif // end if __unix
+
+#endif // end if _COLLECTION
+