OpenStructure
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Properties
Friends
Macros
Groups
Pages
stage
include
ost
img
image_state
value_holder.hh
Go to the documentation of this file.
1
//------------------------------------------------------------------------------
2
// This file is part of the OpenStructure project <www.openstructure.org>
3
//
4
// Copyright (C) 2008-2011 by the OpenStructure authors
5
// Copyright (C) 2003-2010 by the IPLT authors
6
//
7
// This library is free software; you can redistribute it and/or modify it under
8
// the terms of the GNU Lesser General Public License as published by the Free
9
// Software Foundation; either version 3.0 of the License, or (at your option)
10
// any later version.
11
// This library is distributed in the hope that it will be useful, but WITHOUT
12
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13
// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
14
// details.
15
//
16
// You should have received a copy of the GNU Lesser General Public License
17
// along with this library; if not, write to the Free Software Foundation, Inc.,
18
// 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
//------------------------------------------------------------------------------
20
21
/*
22
value holder for image state
23
24
Author: Ansgar Philippsen
25
*/
26
27
#ifndef VALUE_HOLDER_H
28
#define VALUE_HOLDER_H
29
30
#include <
ost/base.hh
>
31
#include <
ost/img/module_config.hh
>
32
#include <
ost/img/data_types.hh
>
33
#include <
ost/img/size.hh
>
34
35
#include "
type_fw.hh
"
36
37
namespace
value_holder_test {
38
39
template
<
typename
V>
40
void
ReleaseAndReconstruct
();
41
42
}
43
44
namespace
ost {
namespace
img {
namespace
image_state {
45
46
/*
47
Value Holder
48
49
Provide a dynamically allocated 3D array with
50
optimized access, based on a zero based Index, which
51
in turn encapsulates an unsigned integer triplet
52
53
Should provide reasonable exception safety, ie an exception
54
during construction will not cause a memory leak.
55
*/
56
template
<
typename
V>
57
class
TEMPLATE_EXPORT
ValueHolder
{
58
public
:
59
typedef
V*
VPtr
;
60
typedef
VPtr
*
VPtrPtr
;
61
65
66
ValueHolder
(
unsigned
int
wi,
unsigned
int
he,
unsigned
int
de);
67
69
ValueHolder
(
const
Size
& s);
70
72
ValueHolder
(
const
Size
& s,
const
Size
& ps);
73
75
ValueHolder
(
const
ValueHolder<V>
& h);
76
78
template
<
typename
U>
79
ValueHolder
(
const
Size
& s,
ValueHolder<U>
& v):
80
width_(s[0]),
81
height_(s[1]),
82
depth_(s[2]),
83
volume_(width_*height_*depth_),
84
volume2_(v.GetPhysicalSize()*sizeof(U)/sizeof(V)),
85
data_(reinterpret_cast<V*>(v.ReleaseData())),
86
row_(0),
87
slice_(0)
88
{
89
try
{
90
setup();
91
}
catch
(...) {
92
delete
[]data_;
93
}
94
}
95
96
98
103
ValueHolder
& operator=(
const
ValueHolder<V>
& h);
104
106
~
ValueHolder
();
107
109
115
VPtr ReleaseData();
116
118
void
Swap(
ValueHolder
& vh);
120
122
123
124
// retrieve width, at least 1
125
unsigned
int
GetWidth
()
const
{
return
width_;}
126
// retrieve height, at least 1
127
unsigned
int
GetHeight
()
const
{
return
height_;}
128
// retrieve depth, at least 1
129
unsigned
int
GetDepth
()
const
{
return
depth_;}
130
// retrieve overall size (width*height*depth), at least 1
131
unsigned
int
GetVolume
()
const
{
return
volume_;}
132
// retrieve dimensions as Size object
133
Size
GetSize()
const
;
134
135
static
DataType
GetDataType();
136
137
unsigned
int
GetPhysicalSize
()
const
{
return
volume2_;}
138
139
long
MemSize()
const
;
140
142
149
150
154
V& Value(
const
Index
& i);
155
157
161
const
V& Value(
const
Index
& i)
const
;
162
164
167
V& Value(
unsigned
int
i);
168
170
173
const
V& Value(
unsigned
int
i)
const
;
174
175
177
VPtr
GetData
() {
return
data_;}
179
const
VPtr
GetData
()
const
{
return
data_;}
180
182
int
DataCount
()
const
{
return
volume_;}
183
185
188
int
GetDataCount
()
const
{
return
volume_;}
189
190
const
VPtr
GetEnd
()
const
{
return
&data_[volume_];}
191
193
VPtr
*
GetRows
() {
return
row_;}
195
const
VPtr
*
GetRows
()
const
{
return
row_;}
197
200
int
GetRowCount
()
const
{
return
width_*height_;}
201
203
VPtrPtr
*
GetSlices
() {
return
slice_;}
205
const
VPtrPtr
*
GetSlices
()
const
{
return
slice_;}
207
210
int
GetSliceCount
()
const
{
return
width_;}
211
213
private
:
214
unsigned
int
width_, height_, depth_, volume_;
215
// this is a hack to get padding for fftw to work...
216
unsigned
int
volume2_;
217
218
// actual data storage
219
V* data_;
220
// optimization
221
V** row_;
222
// optimization
223
V*** slice_;
224
225
void
setup();
226
void
clear();
227
};
228
229
}}}
// namespaces
230
231
#endif
Generated on Mon Nov 5 2012 13:31:02 for OpenStructure by
1.8.1.1