Skip to content

Commit f4cbf4d

Browse files
committed
add create/delete feature for tag
1 parent 2f875fd commit f4cbf4d

File tree

5 files changed

+82
-1
lines changed

5 files changed

+82
-1
lines changed

+nix/Tag.m

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,21 @@
5555
% Features methods
5656
% ------------------
5757

58+
function retObj = add_feature(obj, add_this, link_type)
59+
if(strcmp(class(add_this), 'nix.DataArray'))
60+
addID = add_this.id;
61+
else
62+
addID = add_this;
63+
end;
64+
retObj = nix.Feature(nix_mx('Tag::createFeature', obj.nix_handle, addID, link_type));
65+
obj.featuresCache.lastUpdate = 0;
66+
end;
67+
68+
function delCheck = remove_feature(obj, del)
69+
[delCheck, obj.featuresCache] = nix.Utils.delete_entity(obj, ...
70+
del, 'nix.Feature', 'Tag::deleteFeature', obj.featuresCache);
71+
end;
72+
5873
function retObj = open_feature(obj, id_or_name)
5974
retObj = nix.Utils.open_entity(obj, ...
6075
'Tag::openFeature', id_or_name, @nix.Feature);

nix_mx.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,11 +150,13 @@ void mexFunction(int nlhs,
150150
.reg("openSource", GETBYSTR(nix::Source, nix::Tag, getSource))
151151
.reg("openMetadataSection", GETCONTENT(nix::Section, nix::Tag, metadata))
152152
.reg("removeReference", REMOVER(nix::DataArray, nix::Tag, removeReference))
153-
.reg("removeSource", REMOVER(nix::Source, nix::Tag, removeSource));
153+
.reg("removeSource", REMOVER(nix::Source, nix::Tag, removeSource))
154+
.reg("deleteFeature", REMOVER(nix::Feature, nix::Tag, deleteFeature));
154155
methods->add("Tag::retrieveData", nixtag::retrieve_data);
155156
methods->add("Tag::featureRetrieveData", nixtag::retrieve_feature_data);
156157
methods->add("Tag::addReference", nixtag::add_reference);
157158
methods->add("Tag::addSource", nixtag::add_source);
159+
methods->add("Tag::createFeature", nixtag::create_feature);
158160

159161
classdef<nix::MultiTag>("MultiTag", methods)
160162
.desc(&nixmultitag::describe)

src/nixtag.cc

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,24 @@ namespace nixtag {
3838
currObj.addSource(input.str(2));
3939
}
4040

41+
void create_feature(const extractor &input, infusor &output)
42+
{
43+
nix::Tag currObj = input.entity<nix::Tag>(1);
44+
45+
uint8_t ltype = input.num<uint8_t>(3);
46+
nix::LinkType link_type;
47+
48+
switch (ltype) {
49+
case 0: link_type = nix::LinkType::Tagged; break;
50+
case 1: link_type = nix::LinkType::Untagged; break;
51+
case 2: link_type = nix::LinkType::Indexed; break;
52+
default: throw std::invalid_argument("unkown link type");
53+
}
54+
55+
nix::Feature newFeat = currObj.createFeature(input.str(2), link_type);
56+
output.set(0, handle(newFeat));
57+
}
58+
4159
void retrieve_data(const extractor &input, infusor &output) {
4260
nix::Tag currObj = input.entity<nix::Tag>(1);
4361
double index = input.num<double>(2);

src/nixtag.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ namespace nixtag {
1111

1212
void add_source(const extractor &input, infusor &output);
1313

14+
void create_feature(const extractor &input, infusor &output);
15+
1416
void retrieve_data(const extractor &input, infusor &output);
1517

1618
void retrieve_feature_data(const extractor &input, infusor &output);

tests/TestTag.m

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
funcs{end+1} = @test_remove_source;
88
funcs{end+1} = @test_add_reference;
99
funcs{end+1} = @test_remove_reference;
10+
funcs{end+1} = @test_add_feature;
11+
funcs{end+1} = @test_remove_feature;
1012
funcs{end+1} = @test_fetch_references;
1113
funcs{end+1} = @test_fetch_sources;
1214
funcs{end+1} = @test_fetch_features;
@@ -92,6 +94,48 @@
9294
assert(size(getBlock.dataArrays, 1) == 2);
9395
end
9496

97+
%% Test: Add features by entity and id
98+
function [] = test_add_feature ( varargin )
99+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
100+
b = f.createBlock('featureTest', 'nixBlock');
101+
tmp = b.create_data_array('featureTestDataArray1', 'nixDataArray', 'double', [1 2]);
102+
tmp = b.create_data_array('featureTestDataArray2', 'nixDataArray', 'double', [3 4]);
103+
tmp = b.create_data_array('featureTestDataArray3', 'nixDataArray', 'double', [5 6]);
104+
tmp = b.create_data_array('featureTestDataArray4', 'nixDataArray', 'double', [7 8]);
105+
tmp = b.create_data_array('featureTestDataArray5', 'nixDataArray', 'double', [9 10]);
106+
tmp = b.create_data_array('featureTestDataArray6', 'nixDataArray', 'double', [11 12]);
107+
position = [1.0 1.2 1.3 15.9];
108+
getTag = b.create_tag('featureTest', 'nixTag', position);
109+
110+
assert(isempty(getTag.features));
111+
tmp = getTag.add_feature(b.dataArrays{1}.id, nix.LinkType.Tagged);
112+
tmp = getTag.add_feature(b.dataArrays{2}, nix.LinkType.Tagged);
113+
tmp = getTag.add_feature(b.dataArrays{3}.id, nix.LinkType.Untagged);
114+
tmp = getTag.add_feature(b.dataArrays{4}, nix.LinkType.Untagged);
115+
tmp = getTag.add_feature(b.dataArrays{5}.id, nix.LinkType.Indexed);
116+
tmp = getTag.add_feature(b.dataArrays{6}, nix.LinkType.Indexed);
117+
assert(size(getTag.features, 1) == 6)
118+
end
119+
120+
%% Test: Remove features by entity and id
121+
function [] = test_remove_feature ( varargin )
122+
f = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);
123+
b = f.createBlock('featureTest', 'nixBlock');
124+
tmp = b.create_data_array('featureTestDataArray1', 'nixDataArray', 'double', [1 2]);
125+
tmp = b.create_data_array('featureTestDataArray2', 'nixDataArray', 'double', [3 4]);
126+
position = [1.0 1.2 1.3 15.9];
127+
getTag = b.create_tag('featureTest', 'nixTag', position);
128+
tmp = getTag.add_feature(b.dataArrays{1}.id, nix.LinkType.Tagged);
129+
tmp = getTag.add_feature(b.dataArrays{2}, nix.LinkType.Tagged);
130+
131+
assert(getTag.remove_feature(getTag.features{2}.id));
132+
assert(getTag.remove_feature(getTag.features{1}));
133+
assert(isempty(getTag.features));
134+
135+
assert(~getTag.remove_feature('I do not exist'));
136+
assert(size(b.dataArrays, 1) == 2);
137+
end
138+
95139
%% Test: fetch references
96140
function [] = test_fetch_references( varargin )
97141
test_file = nix.File(fullfile(pwd, 'tests', 'testRW.h5'), nix.FileMode.Overwrite);

0 commit comments

Comments
 (0)