rdbxx  1.0.7_02
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 
40 using namespace std;
41 
43 class RDBColumn {
45 
46  friend istream& operator>>( istream& is, RDBColumn& col );
49  friend istream& operator>>( istream& is, RDBColumn* col );
51  friend ostream& operator<<( ostream& os, const RDBColumn& col );
53  friend ostream& operator<<( ostream& os, const RDBColumn* col );
55 
56  public:
58 
59  enum Just { LEFT='<', RIGHT='>' };
62  enum Type { MONTH='M', NUMERIC='N', STRING='S' };
64  enum Err { NOERR=0, LOSTPRECISION=EDOM, NONNUMERIC=EINVAL, OUTOFRANGE=ERANGE, NODATA=ENODATA };
65  enum Status { CMOG=0x01, CEOG=0x02, CBOG=0x04 };
67 
68 
70 
71  RDBColumn( const string& name="", const string& def="" );
74  RDBColumn( const RDBColumn& col );
76  virtual ~RDBColumn( void );
77 
79  RDBColumn& operator=( const RDBColumn& col );
81  virtual RDBColumn& operator=( const double& data ) = 0;
83  virtual RDBColumn& operator=( const long& data ) = 0;
85  virtual RDBColumn& operator=( const string& data ) = 0;
87 
89 
90  virtual void advanceIdx( void ) = 0;
93  virtual void rewind( void ) = 0;
95 
97 
98  virtual void setGroup( bool group );
102  bool getGroup( void ) const;
104  virtual void setGroupValue( void ) = 0;
106  virtual int newGroup( void ) = 0;
108 
110 
111  void setName( const string& name );
114  void setDef( const string& def );
116  void setWidth( const long width );
118  void setType( const RDBColumn::Type type );
120  void setJust( const RDBColumn::Just just );
122  void setDesc( const string& desc );
124  void setPrecision( const int precision );
126  void setThrow( const bool t=true );
128  void setErrNo( const int no=0 );
130  virtual bool setData( const double& data ) = 0;
132  virtual bool setData( const long& data ) = 0;
134  virtual bool setData( const string& data ) = 0;
136 
138 
139  virtual void mapData( double data[], const size_t nelems=1 );
142  virtual void mapData( long data[], const size_t nelems=1 );
144  virtual void mapData( string data[], const size_t nelems=1 );
146 
148 
149  string getName( void ) const;
152  string getDef( void ); // Non-constant, because it has to
153  // reconstruct the definition if any field
154  // has changed...
156  long getWidth( void ) const;
158  RDBColumn::Type getType( void ) const;
160  RDBColumn::Just getJust( void ) const;
162  string getDesc( void ) const;
164  int getPrecision( void ) const;
166  bool getThrow( void ) const;
168  char* getErr( void ) const;
170  int getErrNo( void ) const;
172  virtual void* getData( void ) = 0;
174  virtual bool getData( double& data ) = 0;
176  virtual bool getData( long& data ) = 0;
178  virtual bool getData( string& data ) = 0;
180  virtual double getDataDouble( void ) = 0;
182  virtual long getDataLong( void ) = 0;
184  virtual string getDataString( void ) = 0;
186 
187  protected:
189  void convert( const double& idata, double& odata );
191  void convert( const double& idata, long& odata );
193  void convert( const double& idata, string& odata );
195  void convert( const long& idata, double& odata );
197  void convert( const long& idata, long& odata );
199  void convert( const long& idata, string& odata );
201  void convert( const string& idata, double& odata );
203  void convert( const string& idata, long& odata );
205  void convert( const string& idata, string& odata );
206 
208  virtual istream& read( istream& is ) = 0;
210  virtual istream& extract( istream& is, double& data );
212  virtual istream& extract( istream& is, long& data );
214  virtual istream& extract( istream& is, string& data );
216  virtual ostream& write( ostream& os ) const = 0;
218  virtual ostream& insert( ostream& os, double& data ) const;
220  virtual ostream& insert( ostream& os, long& data ) const;
222  virtual ostream& insert( ostream& os, string& data ) const;
223 
225  string _name;
227  string _def;
229  long _width;
235  string _desc;
237  bool _changed;
238 
240  bool _throw;
242  int _errno;
246  stringstream _strstrm;
248  bool _group;
251 
252 };
253 
254 #endif
string _def
Definition.
Definition: RDBColumn.h:227
long _width
Width.
Definition: RDBColumn.h:229
bool _throw
State of the exception throwing behavior.
Definition: RDBColumn.h:240
Just
Acceptable column justifications.
Definition: RDBColumn.h:60
stringstream _strstrm
Used for numeric to string conversion.
Definition: RDBColumn.h:246
bool _changed
Indicates state for the definition field.
Definition: RDBColumn.h:237
bool _initgroup
Group been initialized.
Definition: RDBColumn.h:250
string _name
Name.
Definition: RDBColumn.h:225
Err
Possible error conditions.
Definition: RDBColumn.h:64
string _desc
Description.
Definition: RDBColumn.h:235
int _errno
Error state.
Definition: RDBColumn.h:242
RDBColumn::Type _type
Data type.
Definition: RDBColumn.h:231
RDBColumn::Just _just
Justification.
Definition: RDBColumn.h:233
int _precision
Precision used for stream output or numeric to string conversion.
Definition: RDBColumn.h:244
Type
Acceptable column types.
Definition: RDBColumn.h:62
bool _group
This is a group column.
Definition: RDBColumn.h:248
Provides interface for general column related methods.
Definition: RDBColumn.h:43