Skip to content

Commit 6d1baab

Browse files
committed
add support for Vec setters
1 parent ee530f7 commit 6d1baab

File tree

10 files changed

+259
-0
lines changed

10 files changed

+259
-0
lines changed

lib/src/core/cv_vec.dart

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,6 +1443,14 @@ class VecVec4i extends Vec<cvg.VecVec4i, Vec4i> {
14431443
super.reattach(newPtr: newPtr);
14441444
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
14451445
}
1446+
1447+
@override
1448+
void operator []=(int idx, Vec4i value) {
1449+
ref.ptr[idx].val1 = value.val1;
1450+
ref.ptr[idx].val2 = value.val2;
1451+
ref.ptr[idx].val3 = value.val3;
1452+
ref.ptr[idx].val4 = value.val4;
1453+
}
14461454
}
14471455

14481456
class VecVec4iIterator extends VecIterator<Vec4i> {
@@ -1501,6 +1509,14 @@ class VecVec4f extends Vec<cvg.VecVec4f, Vec4f> {
15011509
super.reattach(newPtr: newPtr);
15021510
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
15031511
}
1512+
1513+
@override
1514+
void operator []=(int idx, Vec4f value) {
1515+
ref.ptr[idx].val1 = value.val1;
1516+
ref.ptr[idx].val2 = value.val2;
1517+
ref.ptr[idx].val3 = value.val3;
1518+
ref.ptr[idx].val4 = value.val4;
1519+
}
15041520
}
15051521

15061522
class VecVec4fIterator extends VecIterator<Vec4f> {
@@ -1559,6 +1575,16 @@ class VecVec6f extends Vec<cvg.VecVec6f, Vec6f> {
15591575
super.reattach(newPtr: newPtr);
15601576
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
15611577
}
1578+
1579+
@override
1580+
void operator []=(int idx, Vec6f value) {
1581+
ref.ptr[idx].val1 = value.val1;
1582+
ref.ptr[idx].val2 = value.val2;
1583+
ref.ptr[idx].val3 = value.val3;
1584+
ref.ptr[idx].val4 = value.val4;
1585+
ref.ptr[idx].val5 = value.val5;
1586+
ref.ptr[idx].val6 = value.val6;
1587+
}
15621588
}
15631589

15641590
class VecVec6fIterator extends VecIterator<Vec6f> {

lib/src/core/dmatch.dart

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,14 @@ class VecDMatch extends Vec<cvg.VecDMatch, DMatch> {
100100
super.reattach(newPtr: newPtr);
101101
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
102102
}
103+
104+
@override
105+
void operator []=(int idx, DMatch value) {
106+
ref.ptr[idx].queryIdx = value.queryIdx;
107+
ref.ptr[idx].trainIdx = value.trainIdx;
108+
ref.ptr[idx].imgIdx = value.imgIdx;
109+
ref.ptr[idx].distance = value.distance;
110+
}
103111
}
104112

105113
class VecDMatchIterator extends VecIterator<DMatch> {
@@ -158,6 +166,10 @@ class VecVecDMatch extends Vec<cvg.VecVecDMatch, VecDMatch> {
158166
super.reattach(newPtr: newPtr);
159167
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
160168
}
169+
170+
// TODO: add support
171+
@override
172+
void operator []=(int idx, VecDMatch value) => throw UnsupportedError("");
161173
}
162174

163175
class VecVecDMatchIterator extends VecIterator<VecDMatch> {

lib/src/core/keypoint.dart

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,17 @@ class VecKeyPoint extends Vec<cvg.VecKeyPoint, KeyPoint> {
128128
super.reattach(newPtr: newPtr);
129129
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
130130
}
131+
132+
@override
133+
void operator []=(int idx, KeyPoint value) {
134+
ref.ptr[idx].x = value.x;
135+
ref.ptr[idx].y = value.y;
136+
ref.ptr[idx].size = value.size;
137+
ref.ptr[idx].angle = value.angle;
138+
ref.ptr[idx].octave = value.octave;
139+
ref.ptr[idx].classID = value.classID;
140+
ref.ptr[idx].response = value.response;
141+
}
131142
}
132143

133144
class VecKeyPointIterator extends VecIterator<KeyPoint> {

lib/src/core/mat.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1388,6 +1388,9 @@ class VecMat extends Vec<cvg.VecMat, Mat> {
13881388
super.reattach(newPtr: newPtr);
13891389
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
13901390
}
1391+
1392+
@override
1393+
void operator []=(int idx, Mat value) => throw UnsupportedError("VecMat is read-only");
13911394
}
13921395

13931396
class VecMatIterator extends VecIterator<Mat> {

lib/src/core/point.dart

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,12 @@ class VecPoint extends Vec<cvg.VecPoint, Point> {
213213
super.reattach(newPtr: newPtr);
214214
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
215215
}
216+
217+
@override
218+
void operator []=(int idx, Point value) {
219+
ref.ptr[idx].x = value.x;
220+
ref.ptr[idx].y = value.y;
221+
}
216222
}
217223

218224
class VecPointIterator extends VecIterator<Point> {
@@ -284,6 +290,12 @@ class VecPoint2f extends Vec<cvg.VecPoint2f, Point2f> {
284290

285291
@override
286292
ffi.Pointer<ffi.Void> asVoid() => ref.ptr.cast<ffi.Void>();
293+
294+
@override
295+
void operator []=(int idx, Point2f value) {
296+
ref.ptr[idx].x = value.x;
297+
ref.ptr[idx].y = value.y;
298+
}
287299
}
288300

289301
class VecPoint2fIterator extends VecIterator<Point2f> {
@@ -355,6 +367,13 @@ class VecPoint3f extends Vec<cvg.VecPoint3f, Point3f> {
355367
super.reattach(newPtr: newPtr);
356368
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
357369
}
370+
371+
@override
372+
void operator []=(int idx, Point3f value) {
373+
ref.ptr[idx].x = value.x;
374+
ref.ptr[idx].y = value.y;
375+
ref.ptr[idx].z = value.z;
376+
}
358377
}
359378

360379
class VecPoint3fIterator extends VecIterator<Point3f> {
@@ -426,6 +445,13 @@ class VecPoint3i extends Vec<cvg.VecPoint3i, Point3i> {
426445
super.reattach(newPtr: newPtr);
427446
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
428447
}
448+
449+
@override
450+
void operator []=(int idx, Point3i value) {
451+
ref.ptr[idx].x = value.x;
452+
ref.ptr[idx].y = value.y;
453+
ref.ptr[idx].z = value.z;
454+
}
429455
}
430456

431457
class VecPoint3iIterator extends VecIterator<Point3i> {
@@ -488,6 +514,9 @@ class VecVecPoint extends Vec<cvg.VecVecPoint, VecPoint> {
488514
super.reattach(newPtr: newPtr);
489515
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
490516
}
517+
518+
@override
519+
void operator []=(int idx, VecPoint value) => throw UnsupportedError("VecVecPoint is read-only");
491520
}
492521

493522
class VecVecPointIterator extends VecIterator<VecPoint> {
@@ -550,6 +579,9 @@ class VecVecPoint2f extends Vec<cvg.VecVecPoint2f, VecPoint2f> {
550579
super.reattach(newPtr: newPtr);
551580
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
552581
}
582+
583+
@override
584+
void operator []=(int idx, VecPoint2f value) => throw UnsupportedError("VecVecPoint2f is read-only");
553585
}
554586

555587
class VecVecPoint2fIterator extends VecIterator<VecPoint2f> {
@@ -611,6 +643,9 @@ class VecVecPoint3f extends Vec<cvg.VecVecPoint3f, VecPoint3f> {
611643
super.reattach(newPtr: newPtr);
612644
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
613645
}
646+
647+
@override
648+
void operator []=(int idx, VecPoint3f value) => throw UnsupportedError("VecVecPoint3f is read-only");
614649
}
615650

616651
class VecVecPoint3fIterator extends VecIterator<VecPoint3f> {

lib/src/core/rect.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,14 @@ class VecRect extends Vec<cvg.VecRect, Rect> {
221221
super.reattach(newPtr: newPtr);
222222
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
223223
}
224+
225+
@override
226+
void operator []=(int idx, Rect value) {
227+
ref.ptr[idx].x = value.x;
228+
ref.ptr[idx].y = value.y;
229+
ref.ptr[idx].width = value.width;
230+
ref.ptr[idx].height = value.height;
231+
}
224232
}
225233

226234
class VecRectIterator extends VecIterator<Rect> {

lib/src/core/vec.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ abstract class Vec<N extends ffi.Struct, T> with IterableMixin<T> implements ffi
2020
int get length;
2121

2222
T operator [](int idx) => elementAt(idx);
23+
void operator []=(int idx, T value);
2324

2425
void dispose();
2526
Vec clone();
@@ -123,6 +124,9 @@ class VecUChar extends Vec<cvg.VecUChar, int> {
123124
super.reattach(newPtr: newPtr);
124125
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
125126
}
127+
128+
@override
129+
void operator []=(int idx, int value) => ref.ptr[idx] = value;
126130
}
127131

128132
class VecUCharIterator extends VecIterator<int> {
@@ -190,6 +194,9 @@ class VecChar extends Vec<cvg.VecChar, int> {
190194
super.reattach(newPtr: newPtr);
191195
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
192196
}
197+
198+
@override
199+
void operator []=(int idx, int value) => ref.ptr[idx] = value;
193200
}
194201

195202
class VecCharIterator extends VecIterator<int> {
@@ -254,6 +261,11 @@ class VecVecChar extends Vec<cvg.VecVecChar, VecChar> {
254261
super.reattach(newPtr: newPtr);
255262
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
256263
}
264+
265+
// TODO: add support
266+
@override
267+
void operator []=(int idx, VecChar value) =>
268+
throw UnsupportedError("VecVecChar does not support operator []=");
257269
}
258270

259271
class VecVecCharIterator extends VecIterator<VecChar> {
@@ -320,6 +332,9 @@ class VecI8 extends Vec<cvg.VecI8, int> {
320332
super.reattach(newPtr: newPtr);
321333
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
322334
}
335+
336+
@override
337+
void operator []=(int idx, int value) => ref.ptr[idx] = value;
323338
}
324339

325340
class VecI8Iterator extends VecIterator<int> {
@@ -380,6 +395,9 @@ class VecU16 extends Vec<cvg.VecU16, int> {
380395
super.reattach(newPtr: newPtr);
381396
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
382397
}
398+
399+
@override
400+
void operator []=(int idx, int value) => ref.ptr[idx] = value;
383401
}
384402

385403
class VecU16Iterator extends VecIterator<int> {
@@ -441,6 +459,9 @@ class VecI16 extends Vec<cvg.VecI16, int> {
441459
super.reattach(newPtr: newPtr);
442460
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
443461
}
462+
463+
@override
464+
void operator []=(int idx, int value) => ref.ptr[idx] = value;
444465
}
445466

446467
class VecI16Iterator extends VecIterator<int> {
@@ -504,6 +525,9 @@ class VecI32 extends Vec<cvg.VecI32, int> {
504525
super.reattach(newPtr: newPtr);
505526
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
506527
}
528+
529+
@override
530+
void operator []=(int idx, int value) => ref.ptr[idx] = value;
507531
}
508532

509533
class VecI32Iterator extends VecIterator<int> {
@@ -565,6 +589,9 @@ class VecF32 extends Vec<cvg.VecF32, double> {
565589
super.reattach(newPtr: newPtr);
566590
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
567591
}
592+
593+
@override
594+
void operator []=(int idx, double value) => ref.ptr[idx] = value;
568595
}
569596

570597
class VecF32Iterator extends VecIterator<double> {
@@ -628,6 +655,9 @@ class VecF64 extends Vec<cvg.VecF64, double> {
628655
super.reattach(newPtr: newPtr);
629656
Vec.finalizer.attach(this, ref.ptr.cast<ffi.Void>(), detach: this);
630657
}
658+
659+
@override
660+
void operator []=(int idx, double value) => ref.ptr[idx] = value;
631661
}
632662

633663
class VecF64Iterator extends VecIterator<double> {

test/core/others_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -345,6 +345,16 @@ void main() {
345345
expect(vv.first, cv.Vec4i(1, 2, 3, 4));
346346
expect(vv.last, cv.Vec4i(13, 14, 15, 16));
347347

348+
// get the reference
349+
final vec = vv[1];
350+
expect(vec, cv.Vec4i(5, 6, 7, 8));
351+
// change the reference will affect the original value
352+
vec.val = [2, 5, 4, 1];
353+
expect(vec, cv.Vec4i(2, 5, 4, 1));
354+
// change the value
355+
vv[1] = cv.Vec4i(5, 2, 4, 1);
356+
expect(vv[1], cv.Vec4i(5, 2, 4, 1));
357+
348358
final vv_ = vv.clone();
349359
expect(vv_, vecElementEquals(vv));
350360

@@ -363,6 +373,16 @@ void main() {
363373
expect(vv.first, cv.Vec4f(1, 2, 3, 4));
364374
expect(vv.last, cv.Vec4f(13, 14, 15, 16));
365375

376+
// get the reference
377+
final vec = vv[1];
378+
expect(vec, cv.Vec4f(5, 6, 7, 8));
379+
// change the reference will affect the original value
380+
vec.val = [2, 5, 4, 1];
381+
expect(vec, cv.Vec4f(2, 5, 4, 1));
382+
// change the value
383+
vv[1] = cv.Vec4f(5, 2, 4, 1);
384+
expect(vv[1], cv.Vec4f(5, 2, 4, 1));
385+
366386
final vv_ = vv.clone();
367387
expect(vv_, vecElementEquals(vv));
368388

@@ -381,6 +401,16 @@ void main() {
381401
expect(vv.first, cv.Vec6f(1, 2, 3, 4, 5, 6));
382402
expect(vv.last, cv.Vec6f(13, 14, 15, 16, 17, 18));
383403

404+
// get the reference
405+
final vec = vv[1];
406+
expect(vec, cv.Vec6f(5, 6, 7, 8, 9, 10));
407+
// change the reference will affect the original value
408+
vec.val = [5, 2, 5, 4, 1, 0];
409+
expect(vec, cv.Vec6f(5, 2, 5, 4, 1, 0));
410+
// change the value
411+
vv[1] = cv.Vec6f(50, 20, 50, 40, 10, 0);
412+
expect(vv[1], cv.Vec6f(50, 20, 50, 40, 10, 0));
413+
384414
final vv_ = vv.clone();
385415
expect(vv_, vecElementEquals(vv));
386416

0 commit comments

Comments
 (0)