Mercator
Buffer.h
00001 // This file may be redistributed and modified only under the terms of
00002 // the GNU General Public License (See COPYING for details).
00003 // Copyright (C) 2003 Alistair Riddoch
00004 
00005 #ifndef MERCATOR_BUFFER_H
00006 #define MERCATOR_BUFFER_H
00007 
00008 namespace Mercator {
00009 
00010 class Segment;
00011 
00013 template<typename DataType>
00014 class Buffer {
00015   public:
00017     const Segment & m_segment;
00018   private:
00020     const unsigned int m_channels;
00022     const unsigned int m_size;
00024     DataType * m_data;
00025 
00026   public:
00031     explicit Buffer(const Segment & segment, unsigned int channels = 4);
00032     virtual ~Buffer();
00033 
00039     DataType & operator()(unsigned int x,unsigned int y,unsigned int channel) {
00040         return m_data[(y * m_size + x) * m_channels + channel];
00041     }
00042 
00048     const DataType & operator()(unsigned int x,
00049                                 unsigned int y,
00050                                 unsigned int channel) const {
00051         return m_data[(y * m_size + x) * m_channels + channel];
00052     }
00053     
00055     const Segment & getSegment() const {
00056         return m_segment;
00057     }
00058 
00060     unsigned int getSize() const {
00061         return m_size;
00062     }
00063 
00065     unsigned int getChannels() const {
00066         return m_channels;
00067     }
00068 
00070     DataType * getData() {
00071         return m_data;
00072     }
00073 
00078     void allocate() {
00079         m_data = new DataType[m_size * m_size * m_channels];
00080     }
00081 
00085     bool isValid() const {
00086         return (m_data != 0);
00087     }
00088 
00092     void invalidate() {
00093         delete [] m_data;
00094         m_data = 0;
00095     }
00096 
00097 };
00098 
00099 } // namespace Mercator
00100 
00101 #endif // MERCATOR_BUFFER_H