ObjectProducer.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (c) 2004 CSIRO ICT Centre
00003  *
00004  * $Id: ObjectProducer.cpp 587 2004-12-03 15:06:33Z nch $
00005  */
00006 
00007 #include "ObjectProducer.h"
00008 #include "ObjectReader.h"
00009 
00010 
00011 ObjectProducer::ObjectProducer(ObjectReader * r, bool setMaxSDs)
00012     : reader(r),
00013       hasMore(false),
00014       isCurrent(false),
00015       maxOrthoSD(0.0),
00016       maxDecSD(0.0)
00017 {
00018   reader->open();
00019 
00020   if (setMaxSDs)
00021   {
00022     scanForMaxSDs();
00023   }
00024 }
00025 
00026 ObjectProducer::ObjectProducer(ObjectReader * r, double maxSD)
00027     : reader(r),
00028       hasMore(false),
00029       isCurrent(false),
00030       maxOrthoSD(maxSD),
00031       maxDecSD(maxSD)
00032 {
00033   reader->open();
00034 }
00035 
00036 ObjectProducer::ObjectProducer(ObjectReader * r, double mOSD, double mDSD)
00037     : reader(r),
00038       hasMore(false),
00039       isCurrent(false),
00040       maxOrthoSD(mOSD),
00041       maxDecSD(mDSD)
00042 {
00043   reader->open();
00044 }
00045 
00046 ObjectProducer::~ObjectProducer()
00047 {
00048   reader->close();
00049   delete reader;
00050 }
00051 
00052 void ObjectProducer::scanForMaxSDs() const
00053 {
00054   std::cout << "Scanning for max SDs!" << std::endl;
00055   maxDecSD = 0.0;
00056   maxOrthoSD = 0.0;
00057 
00058   unsigned long long cnt = 0;
00059   while (hasNext())
00060   {
00061     cnt++;
00062     Object * obj = next();
00063 
00064     if (obj->getDecSD() > maxDecSD)
00065       maxDecSD = obj->getDecSD();
00066     if (obj->getOrthoSD() > maxOrthoSD)
00067       maxOrthoSD = obj->getOrthoSD();
00068 
00069     delete obj;
00070   }
00071 
00072   std::cout << "Num records: " << cnt << std::endl;
00073 
00074   reader->reopen();
00075 }
00076 
00077 bool ObjectProducer::hasNext() const
00078 {
00079   if (isCurrent)
00080     return hasMore; // no next() call since last hasNext()
00081 
00082   current = reader->read();         // read the next object
00083 
00084   bool success = (current != 0);    // check if successfull
00085   hasMore = success;
00086   isCurrent = success;
00087 
00088   return success;
00089 }
00090   
00091 Object * ObjectProducer::next() const
00092 {
00093   bool ok = true;
00094 
00095   if (!isCurrent)
00096   {                         // either hasNext() hasn't been called, or it
00097                             // returned false.
00098     if (!hasNext())         // if true, then isCurrent set true as side-effect
00099     {
00100       ok = false;
00101     }
00102   }
00103     
00104   // isCurrent is true now.
00105   if (ok)
00106   {
00107     isCurrent = false; // don't use the current data again
00108   }
00109 
00110   return current;
00111 }
Generated on Mon Oct 4 10:39:55 2010 for Matching.kdevelop by  doxygen 1.6.3