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();
84 virtual void insert_chunk_serial(
unsigned int dim, std::vector<unsigned int> *target_element_address,
85 std::vector<unsigned int> *chunk_source_address,
Chunk *chunk);
86 virtual void read_chunks_serial();
89 friend class DmrppArrayTest;
92 process_one_chunk_unconstrained(std::shared_ptr<Chunk> chunk,
const vector<unsigned long long> &chunk_shape,
93 DmrppArray *array,
const vector<unsigned long long> &array_shape);
97 process_one_chunk(std::shared_ptr<Chunk> chunk,
DmrppArray *array,
const vector<unsigned long long> &constrained_array_shape);
101 virtual void insert_chunk_unconstrained(std::shared_ptr<Chunk> chunk,
unsigned int dim,
102 unsigned long long array_offset,
const std::vector<unsigned long long> &array_shape,
103 unsigned long long chunk_offset,
const std::vector<unsigned long long> &chunk_shape,
104 const std::vector<unsigned long long> &chunk_origin);
107 void read_chunks_unconstrained();
109 unsigned long long get_chunk_start(
const dimension &thisDim,
unsigned int chunk_origin_for_dim);
111 std::shared_ptr<Chunk> find_needed_chunks(
unsigned int dim, std::vector<unsigned long long> *target_element_address, std::shared_ptr<Chunk> chunk);
113 virtual void insert_chunk(
115 std::vector<unsigned long long> *target_element_address,
116 std::vector<unsigned long long> *chunk_element_address,
117 std::shared_ptr<Chunk> chunk,
118 const vector<unsigned long long> &constrained_array_shape);
121 DmrppArray(
const std::string &n, libdap::BaseType *v) : libdap::Array(n, v,
true ),
DmrppCommon() { }
123 DmrppArray(
const std::string &n,
const std::string &d, libdap::BaseType *v) :
126 DmrppArray(
const string &n, BaseType *v, shared_ptr<DMZ> dmz) :
129 DmrppArray(
const string &n,
const string &d, BaseType *v, shared_ptr<DMZ> dmz) :
138 virtual libdap::BaseType *ptr_duplicate() {
return new DmrppArray(*
this); }
140 bool read()
override;
141 void set_send_p(
bool state)
override;
143 virtual unsigned long long get_size(
bool constrained =
false);
145 virtual std::vector<unsigned long long>
get_shape(
bool constrained);
147 virtual void print_dap4(libdap::XMLWriter &writer,
bool constrained =
false);
149 virtual void dump(ostream &strm)
const;
156 std::thread::id parent_thread_id;
157 std::shared_ptr<SuperChunk> super_chunk;
161 : parent_thread_id(std::this_thread::get_id()), super_chunk(std::move(sc)), array(a) {}
172 std::shared_ptr<Chunk> child_chunk;
173 std::shared_ptr<Chunk> master_chunk;
175 one_child_chunk_args(
int *pipe,
unsigned char id, std::shared_ptr<Chunk> c_c, std::shared_ptr<Chunk> m_c)
176 : fds(pipe), tid(
id), child_chunk(c_c), master_chunk(m_c) {}
187 std::shared_ptr<Chunk> child_chunk;
188 std::shared_ptr<Chunk> the_one_chunk;
190 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) {}
196bool 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.