Skip to content

Commit 10e17ea

Browse files
committed
dimensions on nix_mx done
1 parent 73877a9 commit 10e17ea

File tree

6 files changed

+186
-2
lines changed

6 files changed

+186
-2
lines changed

nix_mx.cc

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "nixfeature.h"
2121
#include "nixtag.h"
2222
#include "nixmultitag.h"
23+
#include "nixdimensions.h"
2324

2425
#include <utils/glue.h>
2526

@@ -142,7 +143,15 @@ void mexFunction(int nlhs,
142143
.reg("set_label", SETTER(const std::string&, nix::DataArray, label))
143144
.reg("set_none_label", SETTER(const boost::none_t, nix::DataArray, label))
144145
.reg("set_unit", SETTER(const std::string&, nix::DataArray, unit))
145-
.reg("set_none_unit", SETTER(const boost::none_t, nix::DataArray, unit));
146+
.reg("set_none_unit", SETTER(const boost::none_t, nix::DataArray, unit))
147+
.reg("dimensions", FILTER(std::vector<nix::Dimension>, nix::DataArray, , dimensions))
148+
.reg("append_set_dimension", &nix::DataArray::appendSetDimension)
149+
.reg("append_range_dimension", &nix::DataArray::appendRangeDimension)
150+
.reg("append_sampled_dimension", &nix::DataArray::appendSampledDimension)
151+
.reg("create_set_dimension", &nix::DataArray::createSetDimension)
152+
.reg("create_range_dimension", &nix::DataArray::createRangeDimension)
153+
.reg("create_sampled_dimension", &nix::DataArray::createSampledDimension)
154+
.reg("deleteDimension", &nix::DataArray::deleteDimension);
146155
methods->add("DataArray::readAll", nixdataarray::read_all);
147156
methods->add("DataArray::writeAll", nixdataarray::write_all);
148157
methods->add("DataArray::addSource", nixdataarray::add_source);
@@ -241,6 +250,35 @@ void mexFunction(int nlhs,
241250
classdef<nix::Property>("Property", methods)
242251
.desc(&nixproperty::describe);
243252

253+
classdef<nix::SetDimension>("SetDimension", methods)
254+
.desc(&nixdimensions::describe)
255+
.reg("set_labels", SETTER(const std::vector<std::string>&, nix::SetDimension, labels))
256+
.reg("set_none_labels", SETTER(const boost::none_t, nix::SetDimension, labels));
257+
258+
classdef<nix::SampledDimension>("SampledDimension", methods)
259+
.desc(&nixdimensions::describe)
260+
.reg("set_label", SETTER(const std::string&, nix::SampledDimension, label))
261+
.reg("set_none_label", SETTER(const boost::none_t, nix::SampledDimension, label))
262+
.reg("set_unit", SETTER(const std::string&, nix::SampledDimension, unit))
263+
.reg("set_none_unit", SETTER(const boost::none_t, nix::SampledDimension, unit))
264+
.reg("set_sampling", SETTER(double, nix::SampledDimension, samplingInterval))
265+
.reg("set_offset", SETTER(double, nix::SampledDimension, offset))
266+
.reg("set_none_offset", SETTER(const boost::none_t, nix::SampledDimension, offset))
267+
.reg("index_of", &nix::SampledDimension::indexOf)
268+
.reg("position_at", &nix::SampledDimension::positionAt)
269+
.reg("axis", &nix::SampledDimension::axis);
270+
271+
classdef<nix::RangeDimension>("RangeDimension", methods)
272+
.desc(&nixdimensions::describe)
273+
.reg("set_label", SETTER(const std::string&, nix::RangeDimension, label))
274+
.reg("set_none_label", SETTER(const boost::none_t, nix::RangeDimension, label))
275+
.reg("set_unit", SETTER(const std::string&, nix::RangeDimension, unit))
276+
.reg("set_none_unit", SETTER(const boost::none_t, nix::RangeDimension, unit))
277+
.reg("set_ticks", SETTER(const std::vector<double>&, nix::RangeDimension, ticks))
278+
.reg("index_of", &nix::RangeDimension::indexOf)
279+
.reg("tick_at", &nix::RangeDimension::tickAt)
280+
.reg("axis", &nix::RangeDimension::axis);
281+
244282
mexAtExit(on_exit);
245283
});
246284

src/nixdimensions.cc

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "nixtag.h"
2+
#include "nixgen.h"
3+
4+
#include "mex.h"
5+
6+
#include <nix.hpp>
7+
8+
#include "handle.h"
9+
#include "arguments.h"
10+
#include "struct.h"
11+
12+
namespace nixdimensions {
13+
14+
mxArray *describe(const nix::SetDimension &dim)
15+
{
16+
struct_builder sb({ 1 }, { "dim_type", "labels" });
17+
18+
sb.set(dim.dimensionType());
19+
sb.set(dim.labels());
20+
21+
return sb.array();
22+
}
23+
24+
mxArray *describe(const nix::SampledDimension &dim)
25+
{
26+
struct_builder sb({ 1 }, { "dim_type", "label", "unit", "sampling_interval", "offset" });
27+
28+
sb.set(dim.dimensionType());
29+
sb.set(dim.label());
30+
sb.set(dim.unit());
31+
sb.set(dim.samplingInterval());
32+
sb.set(dim.offset());
33+
34+
return sb.array();
35+
}
36+
37+
mxArray *describe(const nix::RangeDimension &dim)
38+
{
39+
struct_builder sb({ 1 }, { "dim_type", "label", "unit", "ticks" });
40+
41+
sb.set(dim.dimensionType());
42+
sb.set(dim.label());
43+
sb.set(dim.unit());
44+
sb.set(dim.ticks());
45+
46+
return sb.array();
47+
}
48+
} // namespace nixtag

src/nixdimensions.h

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#ifndef NIX_MX_DIMENSIONS
2+
#define NIX_MX_DIMENSIONS
3+
4+
#include "arguments.h"
5+
6+
namespace nixdimensions {
7+
8+
mxArray *describe(const nix::SetDimension &dim);
9+
10+
mxArray *describe(const nix::SampledDimension &dim);
11+
12+
mxArray *describe(const nix::RangeDimension &dim);
13+
14+
} // namespace nixtag
15+
16+
#endif

src/utils/handle.h

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,30 @@ struct entity_to_id<nix::Property> {
6363
static const int value = 8;
6464
};
6565

66+
/*
67+
Use value > 100 for entities that do NOT
68+
inherit from nix::Entity
69+
*/
70+
71+
template<>
72+
struct entity_to_id<nix::SetDimension> {
73+
static const bool is_valid = true;
74+
static const int value = 101;
75+
};
76+
77+
template<>
78+
struct entity_to_id<nix::SampledDimension> {
79+
static const bool is_valid = true;
80+
static const int value = 102;
81+
};
82+
83+
template<>
84+
struct entity_to_id<nix::RangeDimension> {
85+
static const bool is_valid = true;
86+
static const int value = 103;
87+
};
88+
89+
6690
class handle {
6791
public:
6892
struct entity {
@@ -124,7 +148,7 @@ class handle {
124148
}
125149

126150
private:
127-
template<typename T>
151+
template<typename T, typename Enable = void>
128152
struct cell : public entity {
129153
cell(const T &obj) : entity(obj), obj(obj) { }
130154

@@ -139,6 +163,20 @@ class handle {
139163
T obj;
140164
};
141165

166+
template<typename T>
167+
struct cell<T, typename std::enable_if<entity_to_id<T>::value >= 100>::type> : public entity{
168+
cell(const T &obj) : entity(obj), obj(obj) { }
169+
170+
virtual void destory() override {
171+
obj = nix::none;
172+
}
173+
174+
virtual time_t updated_at() const override {
175+
return 0;
176+
}
177+
178+
T obj;
179+
};
142180

143181
entity *et;
144182
};

src/utils/mkarray.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ mxArray* make_mx_array(const nix::LinkType &ltype)
2828
return data;
2929
}
3030

31+
mxArray* make_mx_array(const nix::DimensionType &dtype)
32+
{
33+
uint8_t d_type;
34+
35+
switch (dtype) {
36+
case nix::DimensionType::Set: d_type = 0; break;
37+
case nix::DimensionType::Sample: d_type = 1; break;
38+
case nix::DimensionType::Range: d_type = 2; break;
39+
default: throw std::invalid_argument("unkown dimension type");
40+
}
41+
mxArray *data = mxCreateDoubleScalar(d_type);
42+
43+
return data;
44+
}
3145

3246
mxArray* make_mx_array(const nix::Value &v)
3347
{

src/utils/mkarray.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ mxArray* make_mx_array(const nix::NDSize &size);
2525

2626
mxArray* make_mx_array(const nix::LinkType &ltype);
2727

28+
mxArray* make_mx_array(const nix::DimensionType &dtype);
29+
2830
template<typename T, nix::DataType dt = nix::to_data_type<T>::value>
2931
mxArray* make_mx_array(const std::vector<T> &v) {
3032
DType2 dtype = dtype_nix2mex(dt);
@@ -68,6 +70,7 @@ inline mxArray* make_mx_array(const std::vector<nix::Value> &v) {
6870
return data;
6971
}
7072

73+
7174
template<typename T>
7275
mxArray* make_mx_array(const boost::optional<T> &opt) {
7376
if (opt) {
@@ -121,4 +124,31 @@ inline mxArray *make_mx_array(const std::vector<T> &v) {
121124
return lst;
122125
}
123126

127+
inline mxArray* make_mx_array(const std::vector<nix::Dimension> &dims) {
128+
if (dims.empty()) {
129+
return nullptr;
130+
}
131+
132+
nix::DimensionType dt;
133+
134+
mxArray *data = mxCreateCellMatrix(1, dims.size());
135+
for (size_t i = 0; i < dims.size(); i++) {
136+
dt = dims[i].dimensionType();
137+
138+
switch (dt) {
139+
case nix::DimensionType::Set: mxSetCell(data, i, make_mx_array(dims[i].asSetDimension()));
140+
break;
141+
case nix::DimensionType::Range: mxSetCell(data, i, make_mx_array(dims[i].asRangeDimension()));
142+
break;
143+
case nix::DimensionType::Sample: mxSetCell(data, i, make_mx_array(dims[i].asSampledDimension()));
144+
break;
145+
default: throw std::invalid_argument("Encountered unknown dimension type");
146+
break;
147+
}
148+
}
149+
150+
return data;
151+
}
152+
153+
124154
#endif

0 commit comments

Comments
 (0)