summaryrefslogtreecommitdiffstats
path: root/rasodmg/gmarray.hh
blob: 2274e74a6a10e78d0bdd3fcef6e13946ea401129 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
/*
* This file is part of rasdaman community.
*
* Rasdaman community is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Rasdaman community is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with rasdaman community.  If not, see <http://www.gnu.org/licenses/>.
*
* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
rasdaman GmbH.
*
* For more information please see <http://www.rasdaman.org>
* or contact Peter Baumann via <baumann@rasdaman.com>.
/
/**
 * INCLUDE: gmarray.hh
 *
 * MODULE:  rasodmg
 * CLASS:   r_GMarray
 *
 * COMMENTS:
 *		None
*/

#ifndef _D_GMARRAY_
#define _D_GMARRAY_

#include "rasodmg/object.hh"

#include "raslib/error.hh"
#include "raslib/minterval.hh"
#include "raslib/point.hh"
#include "raslib/type.hh"
#include "raslib/mddtypes.hh"

#include <iostream>

// forward declarations
class r_Storage_Layout;


//@ManMemo: Module: {\bf rasodmg}

/*@Doc:

  The class represents a generic MDD in the sense that it
  is independent of the cell base type. The only information
  available is the length in bytes of the base type.
  More specific MDDs including base type information for more
  type safety are represented by the template subclass \Ref{r_Marray}.
  Class \Ref{r_Marray} provides a constructor to convert to the base 
  type specific class.
*/ 
 
class r_GMarray : public r_Object
{
  public:
    /// default constructor (no memory is allocated!)
    r_GMarray() throw(r_Error);
    
    /// constructor for uninitialized MDD objects
    r_GMarray(const r_Minterval& init_domain, r_Bytes type_length, r_Storage_Layout* stl = 0) throw (r_Error);
    /**
      If a storage layout pointer is provided, the object refered to is
      taken and memory control moves to the \Ref{r_GMarray} class.
      The user has to take care, that each creation of \Ref{r_GMarray}
      objects get a new storage layout object.
      r_Error is throw if the storage layout does not fit the type length or the dimension of the init domain and when the dimension of the domain is 0 (uninitialised).
    */

    /// copy constructor
    r_GMarray(const r_GMarray&) throw(r_Error);

    /// constructor which doesn't copy the data
    r_GMarray(r_GMarray&) throw(r_Error);      

    /// destructor
    virtual ~r_GMarray();

    /// it is called when an object leaves transient memory (internal use only)
    virtual void r_deactivate();
    
    /// assignment: cleanup + copy
    const r_GMarray& operator= (const r_GMarray&); 

    /// subscript operator for read access of a cell
    const char* operator[](const r_Point&) const
      throw(r_Edim_mismatch, r_Eindex_violation);
      
    /// Returns a r_GMarray that is the intersection of the current domain with the specified interval
    r_GMarray* intersect(r_Minterval where) const;
    
    //@Man: Read methods
    //@{
    ///

      /// gets a pointer to the storage layout object
      const r_Storage_Layout* get_storage_layout() const;
      /// getting the spatial domain
      inline const r_Minterval& spatial_domain() const;
      /// get the internal representation of the array
      inline char*         get_array(); 
      /// get the internal representation of the array for reading
      inline const char*   get_array() const;
      /// get size of internal array representation in byets
      inline r_Bytes get_array_size() const; 
      /// get length of cell type in bytes
      inline r_Bytes get_type_length() const; 
      /// get current data format
      inline r_Data_Format get_current_format() const;

      /// get base type schema
      const r_Base_Type* get_base_type_schema();

    ///
    //@}

    //@Man: Write methods
    //@{
    ///
      /// sets the storage layout object and checks compatibility with the domain
      void set_storage_layout(r_Storage_Layout *) throw (r_Error);
      /// set spatial domain
      inline void  set_spatial_domain(const r_Minterval& domain);
      /// set the internal representation of the array
      inline void  set_array(char*);
      /// set size of internal memory representation in bytes
      inline void  set_array_size(r_Bytes);
      /// set length of cell type in bytes
      inline void  set_type_length(r_Bytes);
      /// set current data format
      inline void  set_current_format(r_Data_Format);

    ///
    //@}

    //@Man: Methods for database communication (internal use only)
    //@{
    ///

      /// inserts an object into the database
      virtual void insert_obj_into_db();
      /// insert myself into a specific collection in the database
      void insert_obj_into_db(const char* collName);

    ///
    //@}
    
    /// writes the state of the object to the specified stream
    virtual void print_status(std::ostream& s = std::cout) const;
 
    /// writes the state of the object to the specified stream
    void print_status(std::ostream& s, int hexoutput) const;

  protected:
    /// spatial domain
    r_Minterval domain;
    
    /// pointer to the internal array representation
    char* data;
    
    /// size of internal array representation in bytes
    r_Bytes data_size;

    /// length of the cell base type in bytes
    r_Bytes type_length;

    /// store current data format
    r_Data_Format current_format;

    /// pointer to storage layout object
    r_Storage_Layout* storage_layout;
};

#include "rasodmg/gmarray.icc"

#endif