inlined some shapefile methods

--This line, and those below, will be ignored--

M    shapefile.hh
M    shapefile.cc
This commit is contained in:
Artem Pavlenko 2005-03-22 14:11:09 +00:00
parent c316e841f7
commit 468340c457
2 changed files with 93 additions and 87 deletions

View file

@ -56,79 +56,4 @@ void shape_file::close()
} }
int shape_file::read_xdr_integer()
{
#ifndef WORDS_BIGENDIAN
char b[4];
file_.read(b, 4);
return b[3] & 0xffu | (b[2] & 0xffu) << 8 |
(b[1] & 0xffu) << 16 | (b[0] & 0xffu) << 24;
#else
#error "TODO: big-endian "
#endif
}
int shape_file::read_ndr_integer()
{
#ifndef WORDS_BIGENDIAN
char b[4];
file_.read(b,4);
return b[0]&0xffu | (b[1]&0xffu) << 8 |
(b[2]&0xffu) << 16 | (b[3]&0xffu) << 24;
#else
#error "TODO: big-endian "
#endif
}
double shape_file::read_double()
{
#ifndef WORDS_BIGENDIAN
double val;
file_.read(reinterpret_cast<char*>(&val),sizeof(val));
return val;
#else
#error "TODO: big-endian "
#endif
}
void shape_file::read_envelope(Envelope<double>& envelope)
{
#ifndef WORDS_BIGENDIAN
file_.read(reinterpret_cast<char*>(&envelope),sizeof(envelope));
#else
#error "TODO: big-endian"
#endif
}
void shape_file::skip(int bytes)
{
file_.seekg(bytes,std::ios::cur);
}
void shape_file::rewind()
{
seek(100);
}
void shape_file::seek(long pos)
{
file_.seekg(pos,std::ios::beg);
}
long shape_file::pos()
{
return file_.tellg();
}
bool shape_file::is_eof()
{
return file_.eof();
}

View file

@ -16,6 +16,8 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/ */
//$Id$
#ifndef SHAPEFILE_HH #ifndef SHAPEFILE_HH
#define SHAPEFILE_HH #define SHAPEFILE_HH
@ -26,6 +28,20 @@ using namespace mapnik;
class shape_file class shape_file
{ {
// POD structure to hold shape record
struct shape_record
{
unsigned char* data;
size_t size;
explicit shape_record(size_t size)
: data(static_cast<unsigned char*>(::operator new(sizeof(unsigned char)*size))),
size(size) {}
~shape_record()
{
::operator delete(data);
}
};
std::ifstream file_; std::ifstream file_;
static const int buffer_size = 16; static const int buffer_size = 16;
char buff_[buffer_size]; char buff_[buffer_size];
@ -36,12 +52,9 @@ public:
bool open(const std::string& file_name); bool open(const std::string& file_name);
bool is_open(); bool is_open();
void close(); void close();
int read_xdr_integer();
int read_ndr_integer();
double read_double();
template <typename T,int dim> template <typename T,int dim>
void shape_file::read_coord(coord<T,dim>& coord) inline void shape_file::read_coord(coord<T,dim>& coord)
{ {
#ifndef WORDS_BIGENDIAN #ifndef WORDS_BIGENDIAN
file_.read(reinterpret_cast<char*>(&coord),sizeof(coord)); file_.read(reinterpret_cast<char*>(&coord),sizeof(coord));
@ -51,7 +64,7 @@ public:
} }
template <typename T> template <typename T>
void shape_file::read_coords(coord_array<T> &ar) inline void shape_file::read_coords(coord_array<T> &ar)
{ {
#ifndef WORDS_BIGENDIAN #ifndef WORDS_BIGENDIAN
file_.read(reinterpret_cast<char*>(&ar[0]),sizeof(T)*ar.size()); file_.read(reinterpret_cast<char*>(&ar[0]),sizeof(T)*ar.size());
@ -61,12 +74,80 @@ public:
} }
void read_envelope(Envelope<double> &envelope); inline int read_xdr_integer()
void skip(int bytes); {
void rewind(); #ifndef WORDS_BIGENDIAN
void seek(long pos); char b[4];
long pos(); file_.read(b, 4);
bool is_eof(); return b[3] & 0xffu | (b[2] & 0xffu) << 8 |
(b[1] & 0xffu) << 16 | (b[0] & 0xffu) << 24;
#else
#error "TODO: big-endian "
#endif
}
inline int read_ndr_integer()
{
#ifndef WORDS_BIGENDIAN
char b[4];
file_.read(b,4);
return b[0]&0xffu | (b[1]&0xffu) << 8 |
(b[2]&0xffu) << 16 | (b[3]&0xffu) << 24;
#else
#error "TODO: big-endian "
#endif
}
inline double read_double()
{
#ifndef WORDS_BIGENDIAN
double val;
file_.read(reinterpret_cast<char*>(&val),sizeof(val));
return val;
#else
#error "TODO: big-endian "
#endif
}
inline void read_envelope(Envelope<double>& envelope)
{
#ifndef WORDS_BIGENDIAN
file_.read(reinterpret_cast<char*>(&envelope),sizeof(envelope));
#else
#error "TODO: big-endian"
#endif
}
inline void skip(int bytes)
{
file_.seekg(bytes,std::ios::cur);
}
inline void rewind()
{
seek(100);
}
inline void seek(long pos)
{
file_.seekg(pos,std::ios::beg);
}
inline long pos()
{
return file_.tellg();
}
inline bool is_eof()
{
return file_.eof();
}
private: private:
shape_file(const shape_file&); shape_file(const shape_file&);
shape_file& operator=(const shape_file&); shape_file& operator=(const shape_file&);