BSD 4_3_Net_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 29 Mar 1989 20:00:03 +0000 (12:00 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Wed, 29 Mar 1989 20:00:03 +0000 (12:00 -0800)
Work on file usr/src/lib/libg++/grot/etc/ADT-examples/generic-q.cc
Work on file usr/src/lib/libg++/grot/etc/typemacros.h

Synthesized-from: CSRG/cd2/net.2

usr/src/lib/libg++/grot/etc/ADT-examples/generic-q.cc [new file with mode: 0644]
usr/src/lib/libg++/grot/etc/typemacros.h [new file with mode: 0644]

diff --git a/usr/src/lib/libg++/grot/etc/ADT-examples/generic-q.cc b/usr/src/lib/libg++/grot/etc/ADT-examples/generic-q.cc
new file mode 100644 (file)
index 0000000..679001d
--- /dev/null
@@ -0,0 +1,102 @@
+// From: "Douglas C. Schmidt" <schmidt@glacier.ics.uci.edu>
+// Date: Sun, 25 Sep 88 16:19:35 -0700
+
+#include <stream.h>
+#include <ctype.h>
+#include <String.h>
+#include <generic.h>
+
+#define queue(type) name2(type,queue)
+#define list(type) name2(type,list)
+#define queuedeclare(type)                     \
+class queue(type) {                            \
+   struct list(type) {                         \
+      type item;                               \
+      list(type) *next;                        \
+   } *head;                                    \
+   int sz;                                     \
+public:                                        \
+   queue(type)(void) {head = 0;sz = 0;}        \
+   ~queue(type)(void) {                        \
+      list(type) *temp;                        \
+      while (head) {                           \
+         temp = head;                          \
+         head = head->next;                    \
+         delete temp;                          \
+      }                                        \
+   }                                           \
+   int  empty(void) {return(!head);}           \
+   int  size(void) {return(sz);}               \
+   void enqueue(type new_item);                \
+   type front(void) {                          \
+      return(head->next->item);                \
+   }                                           \
+   type dequeue(void);                         \
+};
+
+#define queueimplement(type)                   \
+type queue(type)::dequeue(void) {              \
+   if (head) {                                 \
+      type temp = head->next->item;            \
+      list(type) *temp_ptr;                    \
+      if ((temp_ptr = head->next) == head) {   \
+         head = 0;                             \
+      }                                        \
+      else {                                   \
+         head->next = temp_ptr->next;          \
+      }                                        \
+      delete temp_ptr;                         \
+      sz--;                                    \
+      return(temp);                            \
+   }                                           \
+}                                              \
+void queue(type)::enqueue(type new_item) {     \
+   if (!head) {                                \
+      head       = new list(type);             \
+      head->item = new_item;                   \
+      head->next = head;                       \
+   }                                           \
+   else {                                      \
+      list(type) *temp_node  = new list(type); \
+      temp_node->item  = new_item;             \
+      temp_node->next  = head->next;           \
+      head->next       = temp_node;            \
+      head             = temp_node;            \
+   }                                           \
+   sz++;                                       \
+}                                              \ 
+
+
+queuedeclare(String);
+queueimplement(String);
+queuedeclare(double);
+queueimplement(double);
+
+main() {
+   String Buf;
+   queue(String) Q_String;
+   queue(double) Q_double;
+
+   while (cin >> Buf) {
+      if (Buf.matches(RXalpha)) {
+         Q_String.enqueue(String(Buf));
+      }
+      else if (Buf.matches(RXdouble)) {
+         Q_double.enqueue(atof(Buf));
+      }   
+   }
+
+   while (!Q_String.empty()) {
+      cout << "Size = " << Q_String.size() << ",Item = " 
+           << Q_String.front() << "\n";
+      void(Q_String.dequeue());
+   }
+
+   while (!Q_double.empty()) {
+      cout << "Size = " << Q_double.size() << ",Item = " 
+           << Q_double.front() << "\n";
+      void(Q_double.dequeue());
+   }
+   return (0);
+}
+
diff --git a/usr/src/lib/libg++/grot/etc/typemacros.h b/usr/src/lib/libg++/grot/etc/typemacros.h
new file mode 100644 (file)
index 0000000..f2bd787
--- /dev/null
@@ -0,0 +1,8 @@
+#define _T(type) typeof(type)
+#define pointer_to(type) _T(_T(type)*)
+#define member_of(cls,type) _T(_T(type) cls::)
+#define function(res, args) _T(_T(res) args)
+
+#define _xq_yq(x,y) x ## _ ## y
+#define _x_y(x,y) _xq_yq(x,y) 
+#define _gensym(stem) _x_y(stem, __LINE__)