25#define _dmrpp_array_h 1
36#include <libdap/Array.h>
38#include "DmrppCommon.h"
39#include "SuperChunk.h"
75 DmrppArray::dimension get_dimension(
unsigned int dim_num);
77 void insert_constrained_contiguous(Dim_iter dim_iter,
unsigned long *target_index,
78 std::vector<unsigned long long> &subset_addr,
79 const std::vector<unsigned long long> &array_shape,
char *data);
81 void read_contiguous();
82 void read_contiguous_string();
85 virtual void insert_chunk_serial(
unsigned int dim, std::vector<unsigned int> *target_element_address,
86 std::vector<unsigned int> *chunk_source_address,
Chunk *chunk);
87 virtual void read_chunks_serial();
90 friend class DmrppArrayTest;
93 process_one_chunk_unconstrained(std::shared_ptr<Chunk> chunk,
const vector<unsigned long long> &chunk_shape,
94 DmrppArray *array,
const vector<unsigned long long> &array_shape);
98 process_one_chunk(std::shared_ptr<Chunk> chunk,
DmrppArray *array,
const vector<unsigned long long> &constrained_array_shape);
102 virtual void insert_chunk_unconstrained(std::shared_ptr<Chunk> chunk,
unsigned int dim,
103 unsigned long long array_offset,
const std::vector<unsigned long long> &array_shape,
104 unsigned long long chunk_offset,
const std::vector<unsigned long long> &chunk_shape,
105 const std::vector<unsigned long long> &chunk_origin);
108 void read_chunks_unconstrained();
110 unsigned long long get_chunk_start(
const dimension &thisDim,
unsigned int chunk_origin_for_dim);
112 std::shared_ptr<Chunk> find_needed_chunks(
unsigned int dim, std::vector<unsigned long long> *target_element_address, std::shared_ptr<Chunk> chunk);
114 virtual void insert_chunk(
116 std::vector<unsigned long long> *target_element_address,
117 std::vector<unsigned long long> *chunk_element_address,
118 std::shared_ptr<Chunk> chunk,
119 const vector<unsigned long long> &constrained_array_shape);
122 DmrppArray(
const std::string &n, libdap::BaseType *v) : libdap::Array(n, v,
true ),
DmrppCommon() { }
124 DmrppArray(
const std::string &n,
const std::string &d, libdap::BaseType *v) :
127 DmrppArray(
const string &n, BaseType *v, shared_ptr<DMZ> dmz) :
130 DmrppArray(
const string &n,
const string &d, BaseType *v, shared_ptr<DMZ> dmz) :
139 virtual libdap::BaseType *ptr_duplicate() {
return new DmrppArray(*
this); }
141 bool read()
override;
142 void set_send_p(
bool state)
override;
144 virtual unsigned long long get_size(
bool constrained =
false);
146 virtual std::vector<unsigned long long>
get_shape(
bool constrained);
148 virtual void print_dap4(libdap::XMLWriter &writer,
bool constrained =
false);
150 virtual void dump(ostream &strm)
const;
157 std::thread::id parent_thread_id;
158 std::shared_ptr<SuperChunk> super_chunk;
162 : parent_thread_id(std::this_thread::get_id()), super_chunk(std::move(sc)), array(a) {}
173 std::shared_ptr<Chunk> child_chunk;
174 std::shared_ptr<Chunk> master_chunk;
176 one_child_chunk_args(
int *pipe,
unsigned char id, std::shared_ptr<Chunk> c_c, std::shared_ptr<Chunk> m_c)
177 : fds(pipe), tid(
id), child_chunk(c_c), master_chunk(m_c) {}
188 std::shared_ptr<Chunk> child_chunk;
189 std::shared_ptr<Chunk> the_one_chunk;
191 one_child_chunk_args_new(std::shared_ptr<Chunk> c_c, std::shared_ptr<Chunk> m_c) : child_chunk(c_c), the_one_chunk(m_c) {}
197bool get_next_future(list<std::future<bool>> &futures, atomic_uint &thread_counter,
unsigned long timeout,
string debug_prefix);
Extend libdap::Array so that a handler can read data using a DMR++ file.
virtual std::vector< unsigned long long > get_shape(bool constrained)
Get the array shape.
virtual unsigned long long get_size(bool constrained=false)
Return the total number of elements in this Array.
bool read() override
Read data for the array.
virtual void print_dap4(libdap::XMLWriter &writer, bool constrained=false)
Shadow libdap::Array::print_dap4() - optionally prints DMR++ chunk information.
Size and offset information of data included in DMR++ files.