MrSID Decode SDK for LiDAR Reference Manual  1.1.4.4709
Stream.h
Go to the documentation of this file.
00001 /* //////////////////////////////////////////////////////////////////////////
00002 //                                                                         //
00003 // This code is Copyright (c) 2008-2010 LizardTech, Inc, 1008 Western      //
00004 // Avenue, Suite 200, Seattle, WA 98104.  Unauthorized use or distribution //
00005 // prohibited.  Access to and use of this code is permitted only under     //
00006 // license from LizardTech, Inc.  Portions of the code are protected by    //
00007 // US and foreign patents and other filings. All Rights Reserved.          //
00008 //                                                                         //
00010 /* PUBLIC */
00011 
00012 #ifndef __LIDAR_STREAM_H__
00013 #define __LIDAR_STREAM_H__
00014 
00015 #include "lidar/IO.h"
00016 #include "lidar/Endian.h"
00017 
00018 LT_BEGIN_LIDAR_NAMESPACE
00019 
00023 class Stream
00024 {
00025    SIMPLE_OBJECT(Stream);
00026 public:
00030    enum { DefaultBufferSize = 1 << 12 };
00031 
00035    enum Mode
00036    {
00038       MODE_SET = 0,
00040       MODE_CUR = 1,
00042       MODE_END = 2
00043    };
00044 
00048    typedef IO::offset_type offset_type;
00049 
00053    IO *getIO();
00054 
00055 protected:
00056    ~Stream(void);
00057    Stream(void);
00058 
00059    typedef unsigned char byte_t;
00060 
00061    IO *m_io;
00062    size_t m_size;
00063    offset_type m_pos;
00064    byte_t *m_head;
00065    byte_t *m_cur;
00066    byte_t *m_tail;
00067 };
00068 
00075 class StreamReader : public Stream
00076 {
00077    SIMPLE_OBJECT(StreamReader);
00078 public:
00079    ~StreamReader(void);
00080    StreamReader(void);
00081 
00091    void init(IO *io, bool open, size_t bufferSize = DefaultBufferSize);
00100    void init(const IO::Location &location,
00101              size_t bufferSize = DefaultBufferSize);
00102 
00110    void open(size_t bufferSize = DefaultBufferSize);
00111 
00117    void close(void);
00118 
00125    void flush(void);
00126    
00135    void seek(offset_type offset, Mode whence);
00136    
00142    offset_type tell(void);
00143 
00153    size_t read(void *buf, size_t nbytes);
00154 
00163    template<typename TYPE> bool get_le(TYPE &value)
00164    {
00165       size_t nbytes = read(&value, sizeof(TYPE));
00166       if(HOST_IS_BIG_ENDIAN)
00167          Endian::swap<sizeof(TYPE)>(&value);
00168       return nbytes == sizeof(TYPE);
00169    }
00170 
00179    template<typename TYPE> bool get_be(TYPE &value)
00180    {
00181       size_t nbytes = read(&value, sizeof(TYPE));
00182       if(HOST_IS_LITTLE_ENDIAN)
00183          Endian::swap<sizeof(TYPE)>(&value);
00184       return nbytes == sizeof(TYPE);
00185    }
00186 
00198    bool get_str(char *&line, size_t &length);
00199 };
00200 
00204 class StreamWriter : public Stream
00205 {
00206    SIMPLE_OBJECT(StreamWriter);
00207 public:
00208    ~StreamWriter(void);
00209    StreamWriter(void);
00210 
00220    void init(IO *io, bool open, size_t bufferSize = DefaultBufferSize);
00221 
00229    void open(size_t bufferSize = DefaultBufferSize);
00230    
00237    void close(bool doFlush = true);
00238 
00244    void flush(void);
00245    
00255    void seek(offset_type offset, Mode whence);
00256    
00262    offset_type tell(void);
00263 
00273    size_t write(const void *buf, size_t nbytes);
00274 
00283    template<typename TYPE> bool put_le(TYPE value)
00284    {
00285       if(HOST_IS_BIG_ENDIAN)
00286          Endian::swap<sizeof(TYPE)>(&value);
00287       return write(&value, sizeof(TYPE)) == sizeof(TYPE);
00288    }
00289 
00298    template<typename TYPE> bool put_be(TYPE value)
00299    {
00300       if(HOST_IS_LITTLE_ENDIAN)
00301          Endian::swap<sizeof(TYPE)>(&value);
00302       return write(&value, sizeof(TYPE)) == sizeof(TYPE);
00303    }
00304 
00315    bool put_str(const char *str, size_t length = static_cast<size_t>(-1));
00316 
00327    bool copy(IO *io, offset_type offset, offset_type length);
00328    
00337    bool copy(IO::Location &location);
00338 
00348    bool copy(StreamReader &stream, offset_type length);
00349 };
00350 
00351 LT_END_LIDAR_NAMESPACE
00352 #endif // __LIDAR_STREAM_H__