home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / yeah09.zip / source / lib / MTSequenceEA.cpp < prev    next >
C/C++ Source or Header  |  1996-05-25  |  4KB  |  173 lines

  1. //------------------------------------------------------------
  2. //
  3. // Name:     MTSequenceEA.CPP
  4. // Version:  0.9
  5. // Author:   Björn Fahller.
  6. //
  7. // Copyright (C) Björn Fahller, 1996.
  8. //
  9. // Purpose:  Implementation of multi value multi type extended
  10. //           attributes (EAT_MVMT) based on ISequence from
  11. //           IBM Open Class Library and EA (through TEA) from
  12. //           YEAH.
  13. //
  14. // History:
  15. //          Ver.  Date         What
  16. //          0.9   1996-05-26   First official release.
  17. //
  18. //------------------------------------------------------------
  19.  
  20. #include "yea.h"
  21. #include <strstrea.h>
  22.  
  23. EA* error(EA::Identifier);
  24.  
  25. MTSequenceEA::ErrorFunction MTSequenceEA::errorFunction = error;
  26.  
  27. MTSequenceEA::MTSequenceEA(const EA::CreatorMap* pcrm)
  28.  : pCreatorMap(pcrm)
  29. {
  30. }
  31.  
  32. MTSequenceEA::MTSequenceEA(const MTSequenceEA& mvea)
  33.   : TEA<MTSequenceEA, MTSequenceEA::id>(mvea),
  34.     pCreatorMap(mvea.pCreatorMap)
  35. {
  36.   Cursor c(mvea);
  37.   forCursor(c)
  38.   {
  39.     addAsLast(c.element()->clone());
  40.   }
  41. }
  42.  
  43. MTSequenceEA::MTSequenceEA(const ISequence<EA*>& seq,
  44.                            const EA::CreatorMap* pcrm)
  45.   : pCreatorMap(pcrm)
  46. {
  47.   Cursor c(seq);
  48.   forCursor(c)
  49.   {
  50.     addAsLast(c.element()->clone());
  51.   }
  52. }
  53.  
  54. MTSequenceEA::MTSequenceEA(const IString& filename,
  55.                            const IString& eaname,
  56.                            const EA::CreatorMap* pcrm)
  57.   : pCreatorMap(pcrm)
  58. {
  59.    getFrom(filename, eaname);
  60. }
  61.  
  62. MTSequenceEA::MTSequenceEA(fstreambase& file,
  63.                            const IString& eaname,
  64.                            const EA::CreatorMap* pcrm)
  65.   : pCreatorMap(pcrm)
  66. {
  67.    getFrom(file, eaname);
  68. }
  69.  
  70. const MTSequenceEA& MTSequenceEA::operator=(const MTSequenceEA& mvea)
  71. {
  72.   if (&mvea == this)
  73.   {
  74.     return *this;
  75.   }
  76.   pCreatorMap = mvea.pCreatorMap;
  77.   while (numberOfElements())
  78.   {
  79.     EA* p = firstElement();
  80.     removeFirst();
  81.     delete p;
  82.   }
  83.   TEA<MTSequenceEA, MTSequenceEA::id>::operator=(mvea);
  84.   Cursor c(mvea);
  85.   forCursor(c)
  86.   {
  87.     addAsLast(c.element()->clone());
  88.   }
  89.   return *this;
  90. }
  91.  
  92. const MTSequenceEA& MTSequenceEA::operator=(const ISequence<EA*>& isea)
  93. {
  94.   while (numberOfElements())
  95.   {
  96.     EA* p = firstElement();
  97.     removeFirst();
  98.     delete p;
  99.   }
  100.   Cursor c(isea);
  101.   forCursor(c)
  102.   {
  103.     addAsLast(c.element()->clone());
  104.   }
  105.   return *this;
  106. }
  107.  
  108. MTSequenceEA::~MTSequenceEA(void)
  109. {
  110.   while (numberOfElements())
  111.   {
  112.     EA* p = firstElement();
  113.     removeFirst();
  114.     delete p;
  115.   }
  116. }
  117.  
  118.  
  119. istrstream& MTSequenceEA::readFrom(istrstream& is)
  120. {
  121.   is.read((char*)(&cp), sizeof(cp));
  122.   unsigned short entries;
  123.   is.read((char*)(&entries), sizeof(entries));
  124.   while (entries--)
  125.   {
  126.     EA::Identifier type;
  127.     is.read((char*)(&type), sizeof(type));
  128.     EA* pea = 0;
  129.     EA::CreatorMap::Cursor c(*pCreatorMap);
  130.     if (pCreatorMap->locateElementWithKey(type, c))
  131.     {
  132.       pea = c.element().c(is,c.element().pSubMap);
  133.       pea->setCreatorMap(pCreatorMap);
  134.       EA::read(pea, is);
  135.     }
  136.     else
  137.     {
  138.       pea = errorFunction(type);
  139.     }
  140.     add(pea);
  141.   }
  142.   return is;
  143. }
  144.  
  145. ostrstream& MTSequenceEA::writeTo(ostrstream& os)
  146. {
  147.   os.write((char*)(&cp), sizeof(cp));
  148.   unsigned short entries = (unsigned short)numberOfElements();
  149.   os.write((char*)(&entries), sizeof(entries));
  150.   Cursor c(*this);
  151.   forCursor(c)
  152.   {
  153.     EA* p = c.element();
  154.     EA::Identifier type = p->attributeId();
  155.     os.write((char*)(&type), sizeof(type));
  156.     EA::write(p, os);
  157.   }
  158.   return os;
  159. }
  160.  
  161. MTSequenceEA* MTSequenceEA::clone(void) const
  162. {
  163.   return new MTSequenceEA(*this);
  164. }
  165.  
  166.  
  167. EA* error(EA::Identifier i)
  168. {
  169.   EA::errorHandler(EA::TypeMismatchError, i);
  170.   return 0;
  171. }
  172.  
  173.