Happy new year
[yazpp-moved-to-github.git] / src / gdu.cpp
index 676a334..0d8efee 100644 (file)
@@ -1,11 +1,9 @@
-/*
- * Copyright (c) 1998-2005, Index Data.
+/* This file is part of the yazpp toolkit.
+ * Copyright (C) 1998-2011 Index Data and Mike Taylor
  * See the file LICENSE for details.
- * 
- * $Id: gdu.cpp,v 1.1 2005-06-21 17:37:15 adam Exp $
  */
 
-#include <yaz++/gdu.h>
+#include <yazpp/gdu.h>
 
 using namespace yazpp_1;
 
@@ -23,84 +21,79 @@ GDU::GDU(Z_GDU *gdu)
     base(gdu, odr_createmem(ODR_ENCODE));
 }
 
+GDU::GDU()
+{
+    base(0, odr_createmem(ODR_ENCODE));
+}
+
+GDU::GDU(const GDU &g)
+{
+    base(g.get(), odr_createmem(ODR_ENCODE));
+}
+
 void GDU::base(Z_GDU *gdu, ODR encode)
 {
     m_decode = odr_createmem(ODR_DECODE);
     m_gdu = 0;
-    if (z_GDU(encode, &gdu, 0, "encode"))
+    if (gdu && z_GDU(encode, &gdu, 0, "encode"))
     {
-       int len;
-       char *buf = odr_getbuf(encode, &len, 0);
-       
-       odr_setbuf(m_decode, buf, len, 0);
-       z_GDU(m_decode, &m_gdu, 0, 0);
+        int len;
+        char *buf = odr_getbuf(encode, &len, 0);
+        
+        odr_setbuf(m_decode, buf, len, 0);
+        z_GDU(m_decode, &m_gdu, 0, 0);
     }
     odr_destroy(encode);
 }
 
-GDU::~GDU()
+int GDU::get_size()
 {
-    odr_destroy(m_decode);
-}
-
-Z_GDU *GDU::get()
-{
-    return m_gdu;
+    int len = 0;
+    ODR encode = odr_createmem(ODR_ENCODE);
+    if (m_gdu && z_GDU(encode, &m_gdu, 0, "encode"))
+        odr_getbuf(encode, &len, 0);
+    odr_destroy(encode);
+    return len;
 }
 
-void GDU::extract_odr_to(ODR dst)
+GDU &GDU::operator=(const GDU &g)
 {
-    NMEM nmem = odr_extract_mem(m_decode);
-    if (!dst->mem)
-       dst->mem = nmem_create();
-    nmem_transfer(dst->mem, nmem);
-    nmem_destroy(nmem);
-}
-
+    if (this != &g)
+    {
+        odr_destroy(m_decode);
 
-GDUQueue::GDUQueue()
-{
-    m_list = 0;
+        base(g.get(), odr_createmem(ODR_ENCODE));
+    }
+    return *this;
 }
 
-int GDUQueue::size()
+GDU::~GDU()
 {
-    int no = 0;
-    GDUQueue_List *l;
-    for (l = m_list; l; l = l->m_next)
-        no++;
-    return no;
+    odr_destroy(m_decode);
 }
 
-void GDUQueue::enqueue(GDU *gdu)
+Z_GDU *GDU::get() const
 {
-    GDUQueue_List *l = new GDUQueue_List;
-    l->m_next = m_list;
-    l->m_item = gdu;
-    m_list = l;
+    return m_gdu;
 }
 
-GDU *GDUQueue::dequeue()
+void GDU::move_away_gdu(ODR dst, Z_GDU **gdu)
 {
-    GDUQueue_List **l = &m_list;
-    if (!*l)
-        return 0;
-    while ((*l)->m_next)
-       l = &(*l)->m_next;
-    GDU *m = (*l)->m_item;
-    delete *l;
-    *l = 0;
-    return m;
+    *gdu = m_gdu;
+    m_gdu = 0;
+    NMEM nmem = odr_extract_mem(m_decode);
+    if (!dst->mem)
+        dst->mem = nmem_create();
+    nmem_transfer(dst->mem, nmem);
+    nmem_destroy(nmem);
 }
 
-void GDUQueue::clear()
-{
-    GDU *g;
-    while ((g = dequeue()))
-       delete g;
-}
+/*
+ * Local variables:
+ * c-basic-offset: 4
+ * c-file-style: "Stroustrup"
+ * indent-tabs-mode: nil
+ * End:
+ * vim: shiftwidth=4 tabstop=8 expandtab
+ */
 
-GDUQueue::~GDUQueue()
-{
-    clear();
-}