rdbxx  1.0.10
RDBColumn.h
1 #ifndef RDBColumn_h
2 #define RDBColumn_h
3 
4 /* --8<--8<--8<--8<--
5  *
6  * Copyright (C) 2006 Smithsonian Astrophysical Observatory
7  *
8  * This file is part of RDB
9  *
10  * RDB is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * RDB is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the
22  * Free Software Foundation, Inc.
23  * 51 Franklin Street, Fifth Floor
24  * Boston, MA 02110-1301, USA
25  *
26  * -->8-->8-->8-->8-- */
27 
28 #include <cerrno>
29 #include <cstdio>
30 #include <cstring>
31 #include <float.h>
32 #include <iomanip>
33 #include <iostream>
34 #include <limits>
35 #include <sstream>
36 #include <string>
37 
38 #include <rdbxx/RDBErr.h>
39 
41 class RDBColumn {
43 
44  friend std::istream& operator>>( std::istream& is, RDBColumn& col );
47  friend std::istream& operator>>( std::istream& is, RDBColumn* col );
49  friend std::ostream& operator<<( std::ostream& os, const RDBColumn& col );
51  friend std::ostream& operator<<( std::ostream& os, const RDBColumn* col );
53 
54  public:
56 
57  enum Just { LEFT='<', RIGHT='>' };
60  enum Type { MONTH='M', NUMERIC='N', STRING='S' };
62  enum Err { NOERR=0, LOSTPRECISION=EDOM, NONNUMERIC=EINVAL, OUTOFRANGE=ERANGE, NODATA=ENODATA };
63  enum Status { CMOG=0x01, CEOG=0x02, CBOG=0x04 };
65 
66 
68 
69  RDBColumn( const std::string& name="", const std::string& def="" );
72  RDBColumn( const RDBColumn& col );
74  virtual ~RDBColumn( void );
75 
77  RDBColumn& operator=( const RDBColumn& col );
79  virtual RDBColumn& operator=( const double& data ) = 0;
81  virtual RDBColumn& operator=( const long& data ) = 0;
83  virtual RDBColumn& operator=( const std::string& data ) = 0;
85 
87 
88  virtual void advanceIdx( void ) = 0;
91  virtual void rewind( void ) = 0;
93 
95 
96  virtual void setGroup( bool group );
100  bool getGroup( void ) const;
102  virtual void setGroupValue( void ) = 0;
104  virtual int newGroup( void ) = 0;
106 
108 
109  void setName( const std::string& name );
112  void setDef( const std::string& def );
114  void setWidth( const long width );
116  void setType( const RDBColumn::Type type );
118  void setJust( const RDBColumn::Just just );
120  void setDesc( const std::string& desc );
122  void setPrecision( const int precision );
124  void setThrow( const bool t=true );
126  void setErrNo( const int no=0 );
128  virtual bool setData( const double& data ) = 0;
130  virtual bool setData( const long& data ) = 0;
132  virtual bool setData( const std::string& data ) = 0;
134 
136 
137  virtual void mapData( double data[], const size_t nelems=1 );
140  virtual void mapData( long data[], const size_t nelems=1 );
142  virtual void mapData( std::string data[], const size_t nelems=1 );
144 
146 
147  std::string getName( void ) const;
150  std::string getDef( void ); // Non-constant, because it has to
151  // reconstruct the definition if any field
152  // has changed...
154  long getWidth( void ) const;
156  RDBColumn::Type getType( void ) const;
158  RDBColumn::Just getJust( void ) const;
160  std::string getDesc( void ) const;
162  int getPrecision( void ) const;
164  bool getThrow( void ) const;
166  char* getErr( void ) const;
168  int getErrNo( void ) const;
170  virtual void* getData( void ) = 0;
172  virtual bool getData( double& data ) = 0;
174  virtual bool getData( long& data ) = 0;
176  virtual bool getData( std::string& data ) = 0;
178  virtual double getDataDouble( void ) = 0;
180  virtual long getDataLong( void ) = 0;
182  virtual std::string getDataString( void ) = 0;
184 
185  protected:
187  void convert( const double& idata, double& odata );
189  void convert( const double& idata, long& odata );
191  void convert( const double& idata, std::string& odata );
193  void convert( const long& idata, double& odata );
195  void convert( const long& idata, long& odata );
197  void convert( const long& idata, std::string& odata );
199  void convert( const std::string& idata, double& odata );
201  void convert( const std::string& idata, long& odata );
203  void convert( const std::string& idata, std::string& odata );
204 
206  virtual std::istream& read( std::istream& is ) = 0;
208  virtual std::istream& extract( std::istream& is, double& data );
210  virtual std::istream& extract( std::istream& is, long& data );
212  virtual std::istream& extract( std::istream& is, std::string& data );
214  virtual std::ostream& write( std::ostream& os ) const = 0;
216  virtual std::ostream& insert( std::ostream& os, double& data ) const;
218  virtual std::ostream& insert( std::ostream& os, long& data ) const;
220  virtual std::ostream& insert( std::ostream& os, std::string& data ) const;
221 
223  std::string _name;
225  std::string _def;
227  long _width;
233  std::string _desc;
235  bool _changed;
236 
238  bool _throw;
240  int _errno;
244  std::stringstream _strstrm;
246  bool _group;
249 
250 };
251 
252 #endif
long _width
Width.
Definition: RDBColumn.h:227
std::string getDef(void)
Returns the definition.
Definition: RDBColumn.cc:498
char * getErr(void) const
Returns a brief description of the error condition.
Definition: RDBColumn.cc:618
virtual void rewind(void)=0
Rewinds index to the RDBColumn's data elements.
void setName(const std::string &name)
Sets the name.
Definition: RDBColumn.cc:247
bool _throw
State of the exception throwing behavior.
Definition: RDBColumn.h:238
void setPrecision(const int precision)
Sets the precision for numeric output and numeric to string conversion.
Definition: RDBColumn.cc:408
RDBColumn & operator=(const RDBColumn &col)
Copies RDBColumn object.
Definition: RDBColumn.cc:191
Just
Acceptable column justifications.
Definition: RDBColumn.h:58
void setDef(const std::string &def)
Sets the definition.
Definition: RDBColumn.cc:266
virtual void setGroupValue(void)=0
Sets the group value to the current data value.
void setErrNo(const int no=0)
Sets the error status.
Definition: RDBColumn.cc:438
std::stringstream _strstrm
Used for numeric to string conversion.
Definition: RDBColumn.h:244
bool _changed
Indicates state for the definition field.
Definition: RDBColumn.h:235
friend std::ostream & operator<<(std::ostream &os, const RDBColumn &col)
Write column to output stream.
Definition: RDBColumn.cc:100
void setWidth(const long width)
Sets the width.
Definition: RDBColumn.cc:340
void setJust(const RDBColumn::Just just)
Sets the justification.
Definition: RDBColumn.cc:375
virtual std::string getDataString(void)=0
Returns the value of the current data element, converting if necessary.
std::string _def
Definition.
Definition: RDBColumn.h:225
bool _initgroup
Group been initialized.
Definition: RDBColumn.h:248
virtual void * getData(void)=0
Returns a pointer to the current data element.
std::string getName(void) const
Returns the name.
Definition: RDBColumn.cc:484
void setType(const RDBColumn::Type type)
Sets the type.
Definition: RDBColumn.cc:357
Err
Possible error conditions.
Definition: RDBColumn.h:62
std::string getDesc(void) const
Returns the description.
Definition: RDBColumn.cc:579
int getErrNo(void) const
Returns the error status.
Definition: RDBColumn.cc:631
virtual void setGroup(bool group)
Turn on/off group tracking for this column object.
Definition: RDBColumn.cc:219
bool getGroup(void) const
Returns group status, RBOG if at beginning of a group, REOG if at ned of a group, or REOL if in the m...
Definition: RDBColumn.cc:232
int _errno
Error state.
Definition: RDBColumn.h:240
RDBColumn::Type _type
Data type.
Definition: RDBColumn.h:229
RDBColumn::Just _just
Justification.
Definition: RDBColumn.h:231
RDBColumn::Type getType(void) const
Returns the type.
Definition: RDBColumn.cc:553
int _precision
Precision used for stream output or numeric to std::string conversion.
Definition: RDBColumn.h:242
void convert(const double &idata, double &odata)
Used to converted data based on user requests.
Definition: RDBColumn.cc:647
std::string _name
Name.
Definition: RDBColumn.h:223
virtual void mapData(double data[], const size_t nelems=1)
Maps data to user-supplied memory, if possible.
Definition: RDBColumn.cc:448
void setDesc(const std::string &desc)
Sets the description.
Definition: RDBColumn.cc:391
Type
Acceptable column types.
Definition: RDBColumn.h:60
virtual double getDataDouble(void)=0
Returns the value of the current data element, converting if necessary.
virtual bool setData(const double &data)=0
Sets the data value, converting as necessary.
RDBColumn(const std::string &name="", const std::string &def="")
Assigns name and definition to RDBColumn object.
Definition: RDBColumn.cc:136
std::string _desc
Description.
Definition: RDBColumn.h:233
virtual std::istream & extract(std::istream &is, double &data)
Overridden in the subclass of this datatype.
Definition: RDBColumn.cc:867
virtual std::istream & read(std::istream &is)=0
Called by the stream insertion operator.
long getWidth(void) const
Returns the width.
Definition: RDBColumn.cc:540
bool _group
This is a group column.
Definition: RDBColumn.h:246
void setThrow(const bool t=true)
Sets the excpeption throwing behavior.
Definition: RDBColumn.cc:423
bool getThrow(void) const
Returns the state of the exception throwing behavior.
Definition: RDBColumn.cc:605
virtual ~RDBColumn(void)
Deletes resources allocated by RDBColumn object.
Definition: RDBColumn.cc:180
friend std::istream & operator>>(std::istream &is, RDBColumn &col)
Read column from input stream.
Definition: RDBColumn.cc:38
virtual std::ostream & insert(std::ostream &os, double &data) const
Overridden in the subclass of this datatype.
Definition: RDBColumn.cc:953
virtual void advanceIdx(void)=0
Increments index to the RDBColumn's data elements.
virtual int newGroup(void)=0
Returns the group status of this column object.
RDBColumn::Just getJust(void) const
Returns the justification.
Definition: RDBColumn.cc:566
virtual long getDataLong(void)=0
Returns the value of the current data element, converting if necessary.
int getPrecision(void) const
Returns the precision.
Definition: RDBColumn.cc:592
virtual std::ostream & write(std::ostream &os) const =0
Called by the stream extraction operator.
Provides interface for general column related methods.
Definition: RDBColumn.h:41