72 void swap(
Value &other)
noexcept;
91 Value(std::initializer_list<double> il,
92 std::pmr::memory_resource *mr =
nullptr);
97 std::pmr::memory_resource *mr =
nullptr);
101 Value(
const std::vector<T> &v,
102 std::pmr::memory_resource *mr =
nullptr);
105 template<
class T, std::
size_t N>
106 Value(
const std::array<T, N> &a,
107 std::pmr::memory_resource *mr =
nullptr);
139 static Value scalar(
double v, std::pmr::memory_resource *mr =
nullptr);
140 static Value logicalScalar(
bool v, std::pmr::memory_resource *mr =
nullptr);
141 static Value matrix(
size_t rows,
143 ValueType t = ValueType::DOUBLE,
144 std::pmr::memory_resource *mr =
nullptr);
145 static Value matrix3d(
size_t rows,
148 ValueType t = ValueType::DOUBLE,
149 std::pmr::memory_resource *mr =
nullptr);
155 static Value matrixND(
const size_t *dims,
157 ValueType t = ValueType::DOUBLE,
158 std::pmr::memory_resource *mr =
nullptr);
159 static Value fromString(
const std::string &s, std::pmr::memory_resource *mr =
nullptr);
160 static Value cell(
size_t rows,
size_t cols, std::pmr::memory_resource *mr =
nullptr);
161 static Value cell3D(
size_t rows,
size_t cols,
size_t pages, std::pmr::memory_resource *mr =
nullptr);
163 static Value cellND(
const size_t *dims,
int nd, std::pmr::memory_resource *mr =
nullptr);
166 static Value csl(
size_t n, std::pmr::memory_resource *mr =
nullptr);
167 static Value structure(std::pmr::memory_resource *mr =
nullptr);
173 static Value structArray(
size_t rows,
size_t cols,
174 std::pmr::memory_resource *mr =
nullptr);
175 static Value funcHandle(
const std::string &name, std::pmr::memory_resource *mr =
nullptr);
180 static Value object(
const std::string &className,
181 std::shared_ptr<ObjectState> state,
bool isHandle,
182 std::pmr::memory_resource *mr =
nullptr);
183 static Value objectArray(
const std::string &className,
const Dims &dims,
184 std::vector<std::shared_ptr<ObjectState>> states,
bool isHandle,
185 std::pmr::memory_resource *mr =
nullptr);
190 [[deprecated(
"Use Value::Empty (MATLAB 0x0 DOUBLE) or Value() (unset sentinel)")]]
192 static Value deleted();
196 static Value colonRange(
double start,
double stop, std::pmr::memory_resource *mr =
nullptr);
197 static Value colonRange(
double start,
double step,
double stop, std::pmr::memory_resource *mr =
nullptr);
201 static Value colonRangeTyped(
double start,
double stop, ValueType t,
202 std::pmr::memory_resource *mr =
nullptr);
203 static Value colonRangeTyped(
double start,
double step,
double stop,
204 ValueType t, std::pmr::memory_resource *mr =
nullptr);
208 static size_t colonCount(
double start,
double step,
double stop);
211 static Value horzcat(
const Value *elems,
size_t count, std::pmr::memory_resource *mr =
nullptr);
212 static Value vertcat(
const Value *elems,
size_t count, std::pmr::memory_resource *mr =
nullptr);
216 Value elemAt(
size_t linearIdx, std::pmr::memory_resource *mr =
nullptr)
const;
219 double elemAsDouble(
size_t idx)
const;
220 Value indexGet(
const size_t *indices,
size_t count, std::pmr::memory_resource *mr =
nullptr)
const;
225 Value reshape(
size_t rows,
size_t cols, std::pmr::memory_resource *mr =
nullptr)
const;
226 Value indexGet2D(
const size_t *rowIdx,
size_t nrows,
227 const size_t *colIdx,
size_t ncols, std::pmr::memory_resource *mr =
nullptr)
const;
228 Value indexGet3D(
const size_t *rowIdx,
size_t nrows,
229 const size_t *colIdx,
size_t ncols,
230 const size_t *pageIdx,
size_t npages, std::pmr::memory_resource *mr =
nullptr)
const;
236 const size_t *perDimCount,
238 std::pmr::memory_resource *mr =
nullptr)
const;
239 Value logicalIndex(
const uint8_t *mask,
size_t maskLen, std::pmr::memory_resource *mr =
nullptr)
const;
246 static std::vector<size_t> resolveIndices(
const Value &idx,
size_t dimSize);
247 static std::vector<size_t> resolveIndicesUnchecked(
const Value &idx);
255 static size_t checkedScalarIndex(
double oneBased);
260 void elemSet(
size_t linearIdx,
const Value &val);
261 void indexSet(
const size_t *indices,
size_t count,
const Value &val);
262 void indexSet2D(
const size_t *rowIdx,
size_t nrows,
263 const size_t *colIdx,
size_t ncols,
265 void indexSet3D(
const size_t *rowIdx,
size_t nrows,
266 const size_t *colIdx,
size_t ncols,
267 const size_t *pageIdx,
size_t npages,
273 const size_t *perDimCount,
278 void indexDelete(
const size_t *indices,
size_t count, std::pmr::memory_resource *mr =
nullptr);
279 void indexDelete2D(
const size_t *rowIdx,
size_t nrows,
280 const size_t *colIdx,
size_t ncols,
281 std::pmr::memory_resource *mr =
nullptr);
282 void indexDelete3D(
const size_t *rowIdx,
size_t nrows,
283 const size_t *colIdx,
size_t ncols,
284 const size_t *pageIdx,
size_t npages,
285 std::pmr::memory_resource *mr =
nullptr);
289 void indexDeleteND(
const size_t *
const *perDimIdx,
290 const size_t *perDimCount,
292 std::pmr::memory_resource *mr =
nullptr);
295 static Value complexScalar(Complex v, std::pmr::memory_resource *mr =
nullptr);
296 static Value complexScalar(
double re,
double im, std::pmr::memory_resource *mr =
nullptr);
297 static Value complexMatrix(
size_t rows,
size_t cols, std::pmr::memory_resource *mr =
nullptr);
300 static Value stringScalar(
const std::string &s, std::pmr::memory_resource *mr =
nullptr);
301 static Value stringArray(
size_t rows,
size_t cols, std::pmr::memory_resource *mr =
nullptr);
302 static Value stringArray3D(
size_t rows,
size_t cols,
size_t pages, std::pmr::memory_resource *mr =
nullptr);
305 const std::string &stringElem(
size_t i)
const;
306 void stringElemSet(
size_t i,
const std::string &s);
309 ValueType type()
const;
310 const Dims &dims()
const;
311 size_t numel()
const;
312 bool isScalar()
const;
313 bool isEmpty()
const;
314 bool isNumeric()
const;
318 bool isUnset()
const {
return heap_ == emptyTag(); }
320 bool isDeleted()
const {
return heap_ == deletedTag(); }
321 bool isComplex()
const;
322 bool isLogical()
const;
325 bool isStruct()
const;
326 bool isFuncHandle()
const;
327 bool isString()
const;
328 bool isObject()
const;
334 std::string objectClassName()
const;
335 bool objectIsHandle()
const;
338 size_t objectCount()
const;
341 const ObjectState *objectStateConst()
const;
345 ObjectState *objectStateMut();
347 const ObjectState *objectStateAt(
size_t i)
const;
348 ObjectState *objectStateMutAt(
size_t i);
356 Value objectSubArray(
const std::vector<size_t> &idxs,
357 std::pmr::memory_resource *mr =
nullptr)
const;
361 Value objectReshape(
const Dims &newDims, std::pmr::memory_resource *mr =
nullptr)
const;
364 Value objectTranspose(std::pmr::memory_resource *mr =
nullptr)
const;
370 Value objectGather(
const size_t *srcLinear,
const Dims &resultDims,
371 std::pmr::memory_resource *mr =
nullptr)
const;
376 static Value objectConcatN(
const Value *parts,
size_t count,
const Dims &outDims,
377 std::pmr::memory_resource *mr =
nullptr);
390 void objectAssignLinear(
const std::vector<size_t> &pos,
const Value &rhs,
391 const Value &fill, std::pmr::memory_resource *mr =
nullptr);
396 void objectAssignND(
const std::vector<std::vector<size_t>> &perDim,
const Value &rhs,
397 const Value &fill, std::pmr::memory_resource *mr =
nullptr);
400 const void *rawData()
const;
401 size_t rawBytes()
const;
406 size_t deepBytes()
const;
409 const double *doubleData()
const;
410 const uint8_t *logicalData()
const;
411 const char *charData()
const;
412 double toScalar()
const;
414 std::string toString()
const;
417 const float *singleData()
const;
420 const int8_t *int8Data()
const;
421 const int16_t *int16Data()
const;
422 const int32_t *int32Data()
const;
423 const int64_t *int64Data()
const;
424 const uint8_t *uint8Data()
const;
425 const uint16_t *uint16Data()
const;
426 const uint32_t *uint32Data()
const;
427 const uint64_t *uint64Data()
const;
430 const Complex *complexData()
const;
431 Complex toComplex()
const;
432 Complex complexElem(
size_t i)
const;
433 Complex complexElem(
size_t r,
size_t c)
const;
436 double *doubleDataMut();
437 float *singleDataMut();
438 uint8_t *logicalDataMut();
441 Complex *complexDataMut();
442 int8_t *int8DataMut();
443 int16_t *int16DataMut();
444 int32_t *int32DataMut();
445 int64_t *int64DataMut();
446 uint8_t *uint8DataMut();
447 uint16_t *uint16DataMut();
448 uint32_t *uint32DataMut();
449 uint64_t *uint64DataMut();
452 double operator()(
size_t i)
const;
453 double operator()(
size_t r,
size_t c)
const;
454 double operator()(
size_t r,
size_t c,
size_t p)
const;
457 double &elem(
size_t i);
458 double &elem(
size_t r,
size_t c);
459 double &elem(
size_t r,
size_t c,
size_t p);
462 char charElem(
size_t i)
const;
463 char &charElemMut(
size_t i);
466 std::string charRow(
size_t r)
const;
469 void resize(
size_t newRows,
size_t newCols, std::pmr::memory_resource *mr =
nullptr);
470 void resize3d(
size_t newRows,
size_t newCols,
size_t newPages, std::pmr::memory_resource *mr =
nullptr);
474 void resizeND(
const size_t *newDims,
int nd, std::pmr::memory_resource *mr =
nullptr);
475 void ensureSize(
size_t linearIdx, std::pmr::memory_resource *mr =
nullptr);
476 void appendScalar(
double v, std::pmr::memory_resource *mr =
nullptr);
481 void appendScalarCol(
double v, std::pmr::memory_resource *mr =
nullptr);
484 void promoteToComplex(std::pmr::memory_resource *mr =
nullptr);
487 Value &cellAt(
size_t i);
488 const Value &cellAt(
size_t i)
const;
493 size_t cslCount()
const;
494 Value &cslAt(
size_t i) {
return cellAt(i); }
495 const Value &cslAt(
size_t i)
const {
return cellAt(i); }
500 size_t growCellTo(
const size_t *coords,
int nd,
501 std::pmr::memory_resource *mr =
nullptr);
502 std::pmr::vector<Value> &cellDataVec();
503 const std::pmr::vector<Value> &cellDataVec()
const;
506 Value &field(
const std::string &name);
507 const Value &field(
const std::string &name)
const;
508 bool hasField(
const std::string &name)
const;
509 std::pmr::map<std::string, Value> &structFields();
510 const std::pmr::map<std::string, Value> &structFields()
const;
521 void setField(
size_t linearIdx,
const std::string &name,
const Value &v);
522 void setFieldAll(
const std::string &name,
const Value &v);
523 void removeField(
const std::string &name);
527 std::vector<std::string> fieldNamesInOrder()
const;
531 bool isStructArray()
const;
535 std::pmr::map<std::string, Value> &structArrayElem(
size_t i);
542 void growStructArrayTo(
size_t idx, std::pmr::memory_resource *mr =
nullptr);
548 size_t growStructArrayND(
const size_t *coords,
int nd,
549 std::pmr::memory_resource *mr =
nullptr);
550 const std::pmr::map<std::string, Value> &structArrayElem(
size_t i)
const;
553 std::string funcHandleName()
const;
561 std::string debugString()
const;
564 std::string formatDisplay(
const std::string &name)
const;
568 bool isDoubleScalar()
const {
return heap_ ==
nullptr; }
569 double scalarVal()
const {
return scalar_; }
570 void setScalarVal(
double v)
576 void setScalarFast(
double v)
583 void setLogicalFast(
bool v)
586 heap_ = v ? logicalTrueTag() : logicalFalseTag();
590 bool isLogicalScalar()
const {
return heap_ == logicalTrueTag() || heap_ == logicalFalseTag(); }
594 double fastScalarVal()
const
596 if (heap_ ==
nullptr)
599 return heap_ == logicalTrueTag() ? 1.0 : 0.0;
605 bool isHeapDouble()
const {
return heap_ !=
nullptr && !isTag() && heap_->type == ValueType::DOUBLE; }
607 const Dims &heapDims()
const {
return heap_->dims; }
612 int heapRefCount()
const
614 if (heap_ ==
nullptr || isTag())
616 return heap_->refCount.load(std::memory_order_relaxed);
624 return heap_ !=
nullptr && !isTag();
629 double *doubleDataMutFast()
631 if (heap_->refCount.load(std::memory_order_relaxed) == 1)
632 return static_cast<double *
>(heap_->buffer->data());
634 return static_cast<double *
>(heap_->buffer->data());
637 const double *doubleDataFast()
const
639 return static_cast<const double *
>(heap_->buffer->data());
652 void swapHeapBufferUnchecked(
Value &other)
noexcept
654 DataBuffer *tmp = heap_->buffer;
655 heap_->buffer = other.heap_->buffer;
656 other.heap_->buffer = tmp;
661 double scalar_ = 0.0;
665 static HeapObject sEmptyTag;
666 static HeapObject sLogicalTrue;
667 static HeapObject sLogicalFalse;
668 static HeapObject sDeletedTag;
671 static HeapObject *emptyTag() {
return &sEmptyTag; }
672 static HeapObject *logicalTrueTag() {
return &sLogicalTrue; }
673 static HeapObject *logicalFalseTag() {
return &sLogicalFalse; }
674 static HeapObject *deletedTag() {
return &sDeletedTag; }
679 return heap_ == emptyTag() || heap_ == logicalTrueTag()
680 || heap_ == logicalFalseTag() || heap_ == deletedTag();
682 bool isHeap()
const {
return heap_ !=
nullptr && !isTag(); }
686 HeapObject *mutableHeap();
689 static Value concatObjects(
const Value *elems,
size_t count,
bool vertical,
690 std::pmr::memory_resource *mr);
693 void objectEnsureArrayLike(
const Value &proto, std::pmr::memory_resource *mr);
696 static const Dims sScalarDims;
697 static const Dims sEmptyDims;
701 static Value makeContiguous(
const void *src,
size_t count,
702 ValueType type,
size_t elemSize,
703 std::pmr::memory_resource *mr);