bes Updated for version 3.21.1
The Backend Server (BES) is the lower two tiers of the Hyrax data server
RenamedArrayWrapper.cc
1
2// This file is part of the "NcML Module" project, a BES module designed
3// to allow NcML files to be used to be used as a wrapper to add
4// AIS to existing datasets of any format.
5//
6// Copyright (c) 2009 OPeNDAP, Inc.
7// Author: Michael Johnson <m.johnson@opendap.org>
8//
9// For more information, please also see the main website: http://opendap.org/
10//
11// This library is free software; you can redistribute it and/or
12// modify it under the terms of the GNU Lesser General Public
13// License as published by the Free Software Foundation; either
14// version 2.1 of the License, or (at your option) any later version.
15//
16// This library is distributed in the hope that it will be useful,
17// but WITHOUT ANY WARRANTY; without even the implied warranty of
18// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19// Lesser General Public License for more details.
20//
21// You should have received a copy of the GNU Lesser General Public
22// License along with this library; if not, write to the Free Software
23// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24//
25// Please see the files COPYING and COPYRIGHT for more information on the GLPL.
26//
27// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
29#include "RenamedArrayWrapper.h"
30
31#include <libdap/AttrTable.h>
32#include <libdap/BaseType.h>
33#include <libdap/DDS.h>
34#include <libdap/dods-datatypes.h>
35#include <libdap/Marshaller.h>
36#include <libdap/UnMarshaller.h>
37#include "NCMLDebug.h"
38#include "NCMLUtil.h"
39#include <sstream>
40#include <vector>
41
42using namespace libdap;
43using std::ostringstream;
44using std::string;
45
46namespace ncml_module {
47RenamedArrayWrapper::RenamedArrayWrapper() :
48 Array("", 0), _pArray(0), _orgName("")
49{
50}
51
52RenamedArrayWrapper::RenamedArrayWrapper(const RenamedArrayWrapper& proto) :
53 Array(proto) // I think we need to do this for constraints
54 , _pArray(0), _orgName(proto._orgName)
55{
56 copyLocalRepFrom(proto);
57}
58
59RenamedArrayWrapper::RenamedArrayWrapper(libdap::Array* toBeWrapped) :
60 Array(*toBeWrapped) // ugh, this will copy a lot of stuff we might not want to copy either, but seems safest.
61 , _pArray(toBeWrapped), _orgName("")
62{
63 NCML_ASSERT_MSG(_pArray, "RenamedArrayWrapper(): expected non-null Array to wrap!!");
64 _orgName = toBeWrapped->name();
65 set_read_p(false); // force it to reload if we need to
66}
67
68RenamedArrayWrapper::~RenamedArrayWrapper()
69{
70 destroy(); // local vars
71}
72
73RenamedArrayWrapper*
74RenamedArrayWrapper::ptr_duplicate()
75{
76 return new RenamedArrayWrapper(*this);
77}
78
80RenamedArrayWrapper::operator=(const RenamedArrayWrapper& rhs)
81{
82 if (&rhs == this) {
83 return *this;
84 }
85 destroy();
86 copyLocalRepFrom(rhs);
87 return *this;
88}
89
92
93#if 1
94void RenamedArrayWrapper::add_constraint(Dim_iter i, int start, int stride, int stop)
95{
96 // Set the constraint on the dimension and then sync the wrapped array to the new constraint.
97 Array::add_constraint(i, start, stride, stop);
98 syncConstraints();
99}
100
101void RenamedArrayWrapper::reset_constraint()
102{
103 Array::reset_constraint();
104 _pArray->reset_constraint();
105}
106
108{
109 Array::clear_constraint();
110 _pArray->clear_constraint();
111}
112#endif
113
114string RenamedArrayWrapper::toString()
115{
116 return const_cast<const RenamedArrayWrapper*>(this)->toString();
117}
118
119string RenamedArrayWrapper::toString() const
120{
121 ostringstream oss;
122 oss << "RenamedArrayWrapper(" << this << "): " << endl;
123 oss << "\t_pArray=" << ((_pArray) ? (_pArray->toString()) : ("NULL")) << endl;
124 return oss.str();
125}
126
127void RenamedArrayWrapper::dump(std::ostream &strm) const
128{
129 strm << toString();
130}
131#if 0
132
133bool
134RenamedArrayWrapper::is_simple_type() const
135{
136 return _pArray->is_simple_type();
137}
138
139bool
140RenamedArrayWrapper::is_vector_type() const
141{
142 return _pArray->is_vector_type();
143}
144
145bool
146RenamedArrayWrapper::is_constructor_type() const
147{
148 return _pArray->is_constructor_type();
149}
150
151bool
152RenamedArrayWrapper::synthesized_p()
153{
154 return _pArray->synthesized_p();
155}
156
157void
158RenamedArrayWrapper::set_synthesized_p(bool state)
159{
160 // keep us in sync, why not.
161 BaseType::set_synthesized_p(state);
162 _pArray->set_synthesized_p(state);
163}
164
165int
166RenamedArrayWrapper::element_count(bool leaves /* = false */)
167{
168 return _pArray->element_count(leaves);
169}
170#endif
171
172bool RenamedArrayWrapper::read_p()
173{
174 return _pArray->read_p();
175}
176
177void RenamedArrayWrapper::set_read_p(bool state)
178{
179// BaseType::set_read_p(state);
180 _pArray->set_read_p(state);
181}
182
183bool RenamedArrayWrapper::send_p()
184{
185 return _pArray->send_p();
186}
187
188void RenamedArrayWrapper::set_send_p(bool state)
189{
190// BaseType::set_send_p(state);
191 _pArray->set_send_p(state);
192}
193#if 0
194
196AttrTable&
197RenamedArrayWrapper::get_attr_table()
198{
199 return _pArray->get_attr_table();
200}
201
202void
203RenamedArrayWrapper::set_attr_table(const AttrTable &at)
204{
205 _pArray->set_attr_table(at);
206}
207
208bool
209RenamedArrayWrapper::is_in_selection()
210{
211 return _pArray->is_in_selection();
212}
213
214void
215RenamedArrayWrapper::set_in_selection(bool state)
216{
217 BaseType::set_in_selection(state);
218 _pArray->set_in_selection(state);
219}
220
222void
223RenamedArrayWrapper::set_parent(BaseType *parent)
224{
225 BaseType::set_parent(parent);
226 _pArray->set_parent(parent);
227}
228
229BaseType*
230RenamedArrayWrapper::get_parent() const
231{
232 return _pArray->get_parent();
233}
234#endif
235
236BaseType*
237RenamedArrayWrapper::var(const string &name /* = "" */, bool exact_match /* = true */, btp_stack *s /* = 0 */)
238{
239 return _pArray->var(name, exact_match, s);
240}
241
242BaseType*
243RenamedArrayWrapper::var(const string &name, btp_stack &s)
244{
245 return _pArray->var(name, s);
246}
247
248void RenamedArrayWrapper::add_var(BaseType *bt, Part part /* = nil */)
249{
250 _pArray->add_var(bt, part);
251}
252
253void RenamedArrayWrapper::add_var_nocopy(BaseType *bt, Part part /* = nil */)
254{
255 _pArray->add_var_nocopy(bt, part);
256}
257
258#if 0
259bool
260RenamedArrayWrapper::check_semantics(string &msg, bool all /* = false*/)
261{
262 return _pArray->check_semantics(msg, all);
263}
264
265bool
266RenamedArrayWrapper::ops(BaseType *b, int op)
267{
268 return _pArray->ops(b, op);
269}
270#endif
271
272#if FILE_METHODS // from libdap/BaseType.h, whether to include FILE* methods
273void
274RenamedArrayWrapper::print_decl(FILE *out,
275 string space /* = " "*/,
276 bool print_semi /* = true*/,
277 bool constraint_info /* = false*/,
278 bool constrained /* = false */)
279{
280 syncConstraints();
281 withNewName();
282 _pArray->print_decl(out, space, print_semi, constraint_info, constrained);
283 withOrgName();
284}
285
286void
287RenamedArrayWrapper::print_xml(FILE *out,
288 string space /* = " "*/,
289 bool constrained /* = false */)
290{
291 syncConstraints();
292 withNewName();
293 _pArray->print_xml(out, space, constrained);
294 withOrgName();
295}
296
297void
298RenamedArrayWrapper::print_val(FILE *out,
299 string space /* = ""*/,
300 bool print_decl_p /* = true*/)
301{
302 syncConstraints();
303 withNewName();
304 print_val(out, space, print_decl_p);
305 withOrgName();
306}
307#endif // FILE_METHODS
308
309#if 0
310void
311RenamedArrayWrapper::print_decl(ostream &out,
312 string space /* = " "*/,
313 bool print_semi /* = true*/,
314 bool constraint_info /* = false*/,
315 bool constrained /* = false*/)
316{
317 syncConstraints();
318 withNewName();
319 _pArray->print_decl(out, space, print_semi, constraint_info, constrained);
320 withOrgName();
321}
322
323void
324RenamedArrayWrapper::print_xml(ostream &out,
325 string space /* = " " */,
326 bool constrained /* = false */)
327{
328 syncConstraints();
329 withNewName();
330 _pArray->print_xml(out, space, constrained);
331 withOrgName();
332}
333
334void
335RenamedArrayWrapper::print_val(ostream &out,
336 string space /* = ""*/,
337 bool print_decl_p /* = true*/)
338{
339 syncConstraints();
340 withNewName();
341 print_val(out, space, print_decl_p);
342 withOrgName();
343}
344
345unsigned int
346RenamedArrayWrapper::width(bool constrained)
347{
348 syncConstraints();
349 return _pArray->width(constrained);
350}
351#endif
352
353unsigned int RenamedArrayWrapper::buf2val(void **val)
354{
355 //syncConstraints();
356 return _pArray->buf2val(val);
357}
358
359unsigned int RenamedArrayWrapper::val2buf(void *val, bool reuse /* = false */)
360{
361 //syncConstraints();
362 return _pArray->val2buf(val, reuse);
363}
364
365template <typename T>
366bool RenamedArrayWrapper::set_value_worker(T *v, int sz)
367{
368 //syncConstraints();
369 return _pArray->set_value(v, sz);
370}
371bool RenamedArrayWrapper::set_value(dods_byte *val, int sz) { return set_value_worker(val,sz); }
372bool RenamedArrayWrapper::set_value(dods_int8 *val, int sz) { return set_value_worker(val,sz); }
373bool RenamedArrayWrapper::set_value(dods_int16 *val, int sz) { return set_value_worker(val,sz); }
374bool RenamedArrayWrapper::set_value(dods_uint16 *val, int sz) { return set_value_worker(val,sz); }
375bool RenamedArrayWrapper::set_value(dods_int32 *val, int sz) { return set_value_worker(val,sz); }
376bool RenamedArrayWrapper::set_value(dods_uint32 *val, int sz) { return set_value_worker(val,sz); }
377bool RenamedArrayWrapper::set_value(dods_int64 *val, int sz) { return set_value_worker(val,sz); }
378bool RenamedArrayWrapper::set_value(dods_uint64 *val, int sz) { return set_value_worker(val,sz); }
379bool RenamedArrayWrapper::set_value(dods_float32 *val, int sz) { return set_value_worker(val,sz); }
380bool RenamedArrayWrapper::set_value(dods_float64 *val, int sz) { return set_value_worker(val,sz); }
381bool RenamedArrayWrapper::set_value(string *val, int sz) { return set_value_worker(val,sz); }
382
383template <typename T>
384bool RenamedArrayWrapper::set_value_worker(vector<T> &v, int sz)
385{
386 //syncConstraints();
387 return _pArray->set_value(v, sz);
388}
389bool RenamedArrayWrapper::set_value(vector<dods_byte> &val, int sz) { return set_value_worker(val,sz); }
390bool RenamedArrayWrapper::set_value(vector<dods_int8> &val, int sz) { return set_value_worker(val,sz); }
391bool RenamedArrayWrapper::set_value(vector<dods_int16> &val, int sz) { return set_value_worker(val,sz); }
392bool RenamedArrayWrapper::set_value(vector<dods_uint16> &val, int sz) { return set_value_worker(val,sz); }
393bool RenamedArrayWrapper::set_value(vector<dods_int32> &val, int sz) { return set_value_worker(val,sz); }
394bool RenamedArrayWrapper::set_value(vector<dods_uint32> &val, int sz) { return set_value_worker(val,sz); }
395bool RenamedArrayWrapper::set_value(vector<dods_int64> &val, int sz) { return set_value_worker(val,sz); }
396bool RenamedArrayWrapper::set_value(vector<dods_uint64> &val, int sz) { return set_value_worker(val,sz); }
397bool RenamedArrayWrapper::set_value(vector<dods_float32> &val, int sz) { return set_value_worker(val,sz); }
398bool RenamedArrayWrapper::set_value(vector<dods_float64> &val, int sz) { return set_value_worker(val,sz); }
399bool RenamedArrayWrapper::set_value(vector<string> &val, int sz) { return set_value_worker(val,sz); }
400
401#if 0
402
403bool RenamedArrayWrapper::set_value(dods_byte *val, int sz)
404{
405 //syncConstraints();
406 return _pArray->set_value(val, sz);
407}
408
409bool RenamedArrayWrapper::set_value(vector<dods_byte> &val, int sz)
410{
411 //syncConstraints();
412 return _pArray->set_value(val, sz);
413}
414
415bool RenamedArrayWrapper::set_value(dods_int16 *val, int sz)
416{
417 //syncConstraints();
418 return _pArray->set_value(val, sz);
419}
420
421bool RenamedArrayWrapper::set_value(vector<dods_int16> &val, int sz)
422{
423 //syncConstraints();
424 return _pArray->set_value(val, sz);
425}
426
427bool RenamedArrayWrapper::set_value(dods_uint16 *val, int sz)
428{
429 //syncConstraints();
430 return _pArray->set_value(val, sz);
431}
432
433bool RenamedArrayWrapper::set_value(vector<dods_uint16> &val, int sz)
434{
435 //syncConstraints();
436 return _pArray->set_value(val, sz);
437}
438
439bool RenamedArrayWrapper::set_value(dods_int32 *val, int sz)
440{
441 //syncConstraints();
442 return _pArray->set_value(val, sz);
443}
444
445bool RenamedArrayWrapper::set_value(vector<dods_int32> &val, int sz)
446{
447 //syncConstraints();
448 return _pArray->set_value(val, sz);
449}
450
451bool RenamedArrayWrapper::set_value(dods_uint32 *val, int sz)
452{
453 //syncConstraints();
454 return _pArray->set_value(val, sz);
455}
456
457bool RenamedArrayWrapper::set_value(vector<dods_uint32> &val, int sz)
458{
459 //syncConstraints();
460 return _pArray->set_value(val, sz);
461}
462
463bool RenamedArrayWrapper::set_value(dods_float32 *val, int sz)
464{
465 //syncConstraints();
466 return _pArray->set_value(val, sz);
467}
468
469bool RenamedArrayWrapper::set_value(vector<dods_float32> &val, int sz)
470{
471 //syncConstraints();
472 return _pArray->set_value(val, sz);
473}
474
475bool RenamedArrayWrapper::set_value(dods_float64 *val, int sz)
476{
477 //syncConstraints();
478 return _pArray->set_value(val, sz);
479}
480
481bool RenamedArrayWrapper::set_value(vector<dods_float64> &val, int sz)
482{
483 //syncConstraints();
484 return _pArray->set_value(val, sz);
485}
486
487bool RenamedArrayWrapper::set_value(string *val, int sz)
488{
489 //syncConstraints();
490 return _pArray->set_value(val, sz);
491}
492
493bool RenamedArrayWrapper::set_value(vector<string> &val, int sz)
494{
495 //syncConstraints();
496 return _pArray->set_value(val, sz);
497}
498#endif
499
500
501template <typename T>
502void RenamedArrayWrapper::value_worker(T *v) const
503{
504 //syncConstraints();
505 _pArray->value(v);
506}
507void RenamedArrayWrapper::value(dods_byte *b) const { value_worker(b); }
508void RenamedArrayWrapper::value(dods_int8 *b) const { value_worker(b); }
509void RenamedArrayWrapper::value(dods_int16 *b) const { value_worker(b); }
510void RenamedArrayWrapper::value(dods_uint16 *b) const { value_worker(b); }
511void RenamedArrayWrapper::value(dods_int32 *b) const { value_worker(b); }
512void RenamedArrayWrapper::value(dods_uint32 *b) const { value_worker(b); }
513void RenamedArrayWrapper::value(dods_int64 *b) const { value_worker(b); }
514void RenamedArrayWrapper::value(dods_uint64 *b) const { value_worker(b); }
515void RenamedArrayWrapper::value(dods_float32 *b) const { value_worker(b); }
516void RenamedArrayWrapper::value(dods_float64 *b) const { value_worker(b); }
517void RenamedArrayWrapper::value(vector<string> &b) const { return _pArray->value(b); }
518
519
520#if 0
521void RenamedArrayWrapper::value(dods_byte *b) const
522{
523 //syncConstraints();
524 _pArray->value(b);
525}
526
527void RenamedArrayWrapper::value(dods_int16 *b) const
528{
529 //syncConstraints();
530 _pArray->value(b);
531}
532
533void RenamedArrayWrapper::value(dods_uint16 *b) const
534{
535 //syncConstraints();
536 _pArray->value(b);
537}
538
539void RenamedArrayWrapper::value(dods_int32 *b) const
540{
541 //syncConstraints();
542 _pArray->value(b);
543}
544
545void RenamedArrayWrapper::value(dods_uint32 *b) const
546{
547 //syncConstraints();
548 _pArray->value(b);
549}
550
551void RenamedArrayWrapper::value(dods_float32 *b) const
552{
553 //syncConstraints();
554 _pArray->value(b);
555}
556
557void RenamedArrayWrapper::value(dods_float64 *b) const
558{
559 //syncConstraints();
560 _pArray->value(b);
561}
562
563void RenamedArrayWrapper::value(vector<string> &b) const
564{
565 //syncConstraints();
566 _pArray->value(b);
567}
568#endif
569
570template <typename T>
571void RenamedArrayWrapper::value_worker(vector<unsigned int> *indices, T *b) const
572{
573 return _pArray->value(indices,b);
574}
575
576void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_byte *b) const { value_worker(indices,b); }
577void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_int8 *b) const { value_worker(indices,b); }
578void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_int16 *b) const { value_worker(indices,b); }
579void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_uint16 *b) const { value_worker(indices,b); }
580void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_int32 *b) const { value_worker(indices,b); }
581void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_uint32 *b) const { value_worker(indices,b); }
582void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_int64 *b) const { value_worker(indices,b); }
583void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_uint64 *b) const { value_worker(indices,b); }
584void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_float32 *b) const { value_worker(indices,b); }
585void RenamedArrayWrapper::value(vector<unsigned int> *indices, dods_float64 *b) const { value_worker(indices,b); }
586void RenamedArrayWrapper::value(vector<unsigned int> *indices, vector<string> &b) const { return _pArray->value(indices,b); }
587
588
589
590void*
591RenamedArrayWrapper::value()
592{
593 //syncConstraints();
594 return _pArray->value();
595}
596
597#if 0
598// DO THE REAL WORK
599bool
600RenamedArrayWrapper::read()
601{
602 // Read using the old name....
603 withOrgName();
604 bool ret = _pArray->read();
605 set_read_p(true);// get us too
606 withNewName();
607 return ret;
608}
609#endif
610
611// DO THE REAL WORK
612bool RenamedArrayWrapper::read()
613{
614 //syncConstraints();
615 return _pArray->read();
616}
617
618#if 0
619void
620RenamedArrayWrapper::intern_data(ConstraintEvaluator &eval, DDS &dds)
621{
622 syncConstraints();
623
624 // Force the correct read to be called, as with serialize...
625 // If not read in, read it in with the orgName and these constraints.
626 if (!_pArray->read_p())
627 {
628 //withOrgName();
629 _pArray->read();
630 set_read_p(true);
631 }
632
633 // Now we're back to the new name for intern_data purposes.
634 //withNewName();
635 _pArray->intern_data(eval, dds);
636}
637#endif
638void RenamedArrayWrapper::intern_data(ConstraintEvaluator &eval, DDS &dds)
639{
640 _pArray->intern_data(eval, dds);
641}
642
643#if 0
644bool
645RenamedArrayWrapper::serialize(ConstraintEvaluator &eval, DDS &dds,
646 Marshaller &m, bool ce_eval /* = true */)
647{
648 // BESDEBUG("ncml_rename", "RenamedArrayWrapper::serialize(): Doing the magic for renamed read()!!" << endl);
649 // Push them down if we need to.
650 syncConstraints();
651
652 //string no_preload_tag = "no_preload_for_renamed_arrays";
653 if (BESISDEBUG( "no_preload_for_renamed_arrays" ) || 1) {
654 // BESDEBUG("no_preload_for_renamed_arrays", "RenamedArrayWrapper::serialize() - !!!!! Skipping preload of renamed array orgName: '" << _orgName << "' newName: '" << name() << "'" << endl);
655 BESDEBUG("ncml_rename", "RenamedArrayWrapper::serialize() - !!!!! SKIPPING preload of renamed array orgName: '" << _orgName << "' newName: '" << name() << "'" << endl);
656 // withOrgName();
657 }
658 else {
659 BESDEBUG("ncml_rename", "RenamedArrayWrapper::serialize() - Preloading renamed array orgName: '" << _orgName << "' newName: '" << name() << "'" << endl);
660
661 // If not read in, read it in with the orgName and these constraints.
662 if (!_pArray->read_p())
663 {
664 //withOrgName();
665 _pArray->read();
666 set_read_p(true);
667 }
668
669 // Now we're back to the new name for printing purposes.
670 //withNewName();
671 }
672 // So call the actual serialize, which should hopefully respect read_p() being set!!
673 return _pArray->serialize(eval, dds, m, ce_eval);
674}
675#endif
676
677bool RenamedArrayWrapper::serialize(ConstraintEvaluator &eval, DDS &dds, Marshaller &m, bool ce_eval /* = true */)
678{
679 BESDEBUG("ncml_rename", "RenamedArrayWrapper::serialize(): Doing the magic for renamed read()!!" << endl);
680 //syncConstraints();
681 return _pArray->serialize(eval, dds, m, ce_eval);
682}
683
684bool RenamedArrayWrapper::deserialize(UnMarshaller &um, DDS *dds, bool reuse /* = false */)
685{
686 // I *think* this should work
687 //syncConstraints();
688 return _pArray->deserialize(um, dds, reuse);
689}
690
693
694void RenamedArrayWrapper::copyLocalRepFrom(const RenamedArrayWrapper& proto)
695{
696 if (&proto == this) {
697 return;
698 }
699
700 if (proto._pArray) {
701 _pArray = dynamic_cast<libdap::Array*>(proto._pArray->ptr_duplicate());
702 }
703 _orgName = proto._orgName;
704}
705
706void RenamedArrayWrapper::destroy()
707{
708 SAFE_DELETE(_pArray);
709 _orgName = "";
710}
711
712#if 0
713void
714RenamedArrayWrapper::withNewName()
715{
716 NCMLUtil::setVariableNameProperly(_pArray, name());
717}
718
719void
720RenamedArrayWrapper::withOrgName()
721{
722 NCMLUtil::setVariableNameProperly(_pArray, _orgName);
723}
724#endif
725
726void RenamedArrayWrapper::syncConstraints()
727{
728 // First see if the number of dimensions is correct. We may not need to bother with this,
729 // just constraint propagation
730 if (_pArray->dimensions() != dimensions()) {
731 THROW_NCML_INTERNAL_ERROR(
732 "RenamedArrayWrapper::syncConstraints(): dimensions() of this and wrapped array do not match!");
733 }
734
735 // If they match, iterate the shape and set make sure the values are set.
736 Array::Dim_iter thisEndIt = dim_end();
737 Array::Dim_iter thisIt, wrapIt;
738 for (thisIt = dim_begin(), wrapIt = _pArray->dim_begin(); thisIt != thisEndIt; ++thisIt, ++wrapIt) {
739 Array::dimension& thisDim = *thisIt;
740 Array::dimension& wrapDim = *wrapIt;
741 wrapDim = thisDim; // copy them!
742 }
743 // this calculates its length fine, then set it to the wrapped
744 // since it has no way to know we changed the dimensions...
745 update_length(this->length());
746 _pArray->set_length(this->length());
747 NCML_ASSERT_MSG(this->length() == _pArray->length(),
748 "RenamedArrayWrapper::syncConstraints(): size() of this and wrapped do not match!!");
749}
750}
static void setVariableNameProperly(libdap::BaseType *pVar, const std::string &name)
Definition NCMLUtil.cc:462
A Decorator Pattern for wrapping a libdap::Array in order to change its name efficiently in the face ...
virtual void add_constraint(Dim_iter i, int start, int stride, int stop)
Wrappers.
NcML Parser for adding/modifying/removing metadata (attributes) to existing local datasets using NcML...