Changeset 17751


Ignore:
Timestamp:
05/01/14 18:51:14 (11 years ago)
Author:
tbretz
Message:
I realized that we were one level too high with deriving the class. Not only there was no possibility to use open/close, furthermore the close funtion was not virtual and therefore not necessarily correctly called. By writing a ofstream type class, both is now solved.
Location:
trunk/Mars/mcore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Mars/mcore/ofits.h

    r17559 r17751  
    4242// units: m kg s rad sr K A mol cd Hz J W V N Pa C Ohm S F Wb T Hlm lx
    4343
    44 class ofits : public std::ofstream
     44class ofits : public std::ostream
    4545{
     46protected:
     47    std::filebuf fFilebuf;
     48
    4649public:
    4750    struct Key
     
    225228        Checksum checksum;
    226229
    227         void Out(std::ofstream &fout)
     230        void Out(std::ostream &fout)
    228231        {
    229232            if (!changed)
     
    359362
    360363public:
    361     ofits() : fCommentTrimming(false),
    362               fManualExtName(false)
    363     {
    364     }
    365     ofits(const char *fname) : std::ofstream(),
    366                                fCommentTrimming(false),
    367                                fManualExtName(false)
    368     {
    369         this->open(fname);
    370     }
    371     virtual ~ofits() { if (is_open()) close(); }
    372 
    373     virtual void open(const char * filename, bool addEXTNAMEKey=true)
     364    ofits()
     365        : std::ostream(), fFilebuf(), fCommentTrimming(false), fManualExtName(false)
     366    {
     367        init(&fFilebuf);
     368    }
     369
     370    ofits(const char *fname)
     371        : std::ostream(), fFilebuf(), fCommentTrimming(false), fManualExtName(false)
     372    {
     373        init(&fFilebuf);
     374        open(fname);
     375    }
     376
     377#ifdef __GXX_EXPERIMENTAL_CXX0X__
     378    ofits(const std::string &fname)
     379        : std::ostream(), fCommentTrimming(false), fManualExtName(false)
     380    {
     381        init(&fFilebuf);
     382        open(fname);
     383    }
     384#endif
     385
     386    virtual ~ofits()
     387    {
     388        if (is_open())
     389            close();
     390    }
     391/*
     392    filebuf *rdbuf() const
     393    {
     394        return const_cast<filebuf*>(&fFilebuf);
     395    }
     396*/
     397    bool is_open()
     398    {
     399        return fFilebuf.is_open();
     400    }
     401
     402    bool is_open() const
     403    {
     404        return fFilebuf.is_open();
     405    }
     406
     407    virtual void open(const char *filename, bool addEXTNAMEKey=true)
    374408    {
    375409        fDataSum  = 0;
     
    380414
    381415        SetStr("XTENSION", "BINTABLE", "binary table extension");
    382         SetInt("BITPIX",                     8, "8-bit bytes");
    383         SetInt("NAXIS",                      2, "2-dimensional binary table");
    384         SetInt("NAXIS1",                     0, "width of table in bytes");
    385         SetInt("NAXIS2",                     0, "number of rows in table");
    386         SetInt("PCOUNT",                     0, "size of special data area");
    387         SetInt("GCOUNT",                     1, "one data group (required keyword)");
    388         SetInt("TFIELDS",                    0, "number of fields in each row");
     416        SetInt("BITPIX",  8, "8-bit bytes");
     417        SetInt("NAXIS",   2, "2-dimensional binary table");
     418        SetInt("NAXIS1",  0, "width of table in bytes");
     419        SetInt("NAXIS2",  0, "number of rows in table");
     420        SetInt("PCOUNT",  0, "size of special data area");
     421        SetInt("GCOUNT",  1, "one data group (required keyword)");
     422        SetInt("TFIELDS", 0, "number of fields in each row");
    389423        if (addEXTNAMEKey)
    390424            SetStr("EXTNAME", "", "name of extension table");
     
    394428        SetStr("DATASUM",  "         0", "Checksum for the data block");
    395429
    396         std::ofstream::open(filename);
     430        if (!fFilebuf.open(filename, ios_base::out|ios_base::trunc))
     431            setstate(ios_base::failbit);
     432        else
     433            clear();
     434    }
     435
     436    virtual void open(const std::string &filename, bool addEXTNAMEKey=true)
     437    {
     438        open(filename.c_str(), addEXTNAMEKey);
    397439    }
    398440
     
    740782
    741783
    742     Checksum WriteHeader(std::ofstream &fout)
     784    Checksum WriteHeader(std::ostream &fout)
    743785    {
    744786        Checksum sum;
     
    930972    Checksum UpdateHeaderChecksum()
    931973    {
    932 
    933974        std::ostringstream dataSumStr;
    934975        dataSumStr << fDataSum.val();
     
    951992
    952993        // We don't have to jump back to the end of the file
    953         SetInt("NAXIS2",  fTable.num_rows);
    954 
     994        SetInt("NAXIS2", fTable.num_rows);
    955995
    956996        const Checksum chk = UpdateHeaderChecksum();
    957997
    958         std::ofstream::close();
     998        if (!fFilebuf.close())
     999            setstate(ios_base::failbit);
    9591000
    9601001        if ((chk+fDataSum).valid())
  • trunk/Mars/mcore/zofits.h

    r17677 r17751  
    106106               uint32_t numTiles    = DefaultMaxNumTiles(),
    107107               uint32_t rowPerTile  = DefaultNumRowsPerTile(),
    108                uint32_t maxUsableMem= DefaultMaxMemory()) : ofits(fname),
    109                    fMemPool(0, maxUsableMem*1000),
    110                    fWriteToDiskQueue(std::bind(&zofits::WriteBufferToDisk, this, std::placeholders::_1), false)
    111         {
     108               uint32_t maxUsableMem= DefaultMaxMemory()) : ofits(),
     109            fMemPool(0, maxUsableMem*1000),
     110            fWriteToDiskQueue(std::bind(&zofits::WriteBufferToDisk, this, std::placeholders::_1), false)
     111        {
     112            open(fname);
     113            InitMemberVariables(numTiles, rowPerTile, maxUsableMem*1000);
     114            SetNumThreads(DefaultNumThreads());
     115        }
     116
     117        zofits(const std::string &fname,
     118               uint32_t numTiles    = DefaultMaxNumTiles(),
     119               uint32_t rowPerTile  = DefaultNumRowsPerTile(),
     120               uint32_t maxUsableMem= DefaultMaxMemory()) : ofits(),
     121            fMemPool(0, maxUsableMem*1000),
     122            fWriteToDiskQueue(std::bind(&zofits::WriteBufferToDisk, this, std::placeholders::_1), false)
     123        {
     124            open(fname);
    112125            InitMemberVariables(numTiles, rowPerTile, maxUsableMem*1000);
    113126            SetNumThreads(DefaultNumThreads());
     
    199212            fCatalogSum.reset();
    200213            fRawSum.reset();
     214        }
     215
     216        void open(const std::string &filename, bool addEXTNAMEKey=true)
     217        {
     218            open(filename.c_str(), addEXTNAMEKey);
    201219        }
    202220
     
    513531            const Checksum checksm = UpdateHeaderChecksum();
    514532
    515             std::ofstream::close();
     533            if (!fFilebuf.close())
     534                setstate(ios_base::failbit);
    516535
    517536            fSmartBuffer = std::shared_ptr<char>();
Note: See TracChangeset for help on using the changeset viewer.