summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/point.cpp52
1 files changed, 45 insertions, 7 deletions
diff --git a/src/point.cpp b/src/point.cpp
index 0d375aa..28a4adf 100644
--- a/src/point.cpp
+++ b/src/point.cpp
@@ -3,6 +3,7 @@
#include <sstream>
extern "C" Janet geom_point_get(void *p, Janet key);
+extern "C" void geom_point_set(void *p, Janet key, Janet value);
extern "C" void geom_point_tostring(void *p, JanetBuffer *buffer) {
std::stringstream stream;
@@ -16,7 +17,7 @@ const JanetAbstractType geom_point_type = {
NULL,
NULL,
geom_point_get,
- NULL,
+ geom_point_set,
NULL,
NULL,
geom_point_tostring
@@ -70,9 +71,16 @@ Geom::Point& janet_unwrap_point_ref(Janet x) {
}
extern "C" Janet cfun_geom_point_new(int32_t argc, Janet *argv) {
- janet_fixarity(argc, 2);
- double x = janet_getnumber(argv, 0);
- double y = janet_getnumber(argv, 1);
+ janet_arity(argc, 0, 2);
+ double x = 0;
+ double y = 0;
+ if (argc == 2) {
+ x = janet_getnumber(argv, 0);
+ y = janet_getnumber(argv, 1);
+ } else if (argc == 1) {
+ x = janet_getnumber(argv, 0);
+ y = x;
+ }
return janet_wrap_point(Geom::Point(x, y));
}
@@ -242,10 +250,40 @@ static JanetMethod geom_point_methods[] = {
extern "C" Janet geom_point_get(void *p, Janet key) {
Geom::Point *box = (Geom::Point *)p;
- if (!janet_checktype(key, JANET_KEYWORD))
- janet_panicf("expected keyword, got %v", key);
- return janet_getmethod(janet_unwrap_keyword(key), geom_point_methods);
+ if (janet_checktype(key, JANET_KEYWORD))
+ return janet_getmethod(janet_unwrap_keyword(key), geom_point_methods);
+
+ if (!janet_checksize(key)) janet_panic("expected size as key");
+
+ size_t const index = (size_t) janet_unwrap_number(key);
+ switch (index) {
+ case 0:
+ return janet_wrap_number((*box)[0]);
+ case 1:
+ return janet_wrap_number((*box)[1]);
+ default:
+ return janet_wrap_nil();
+ }
+}
+
+extern "C" void geom_point_set(void *p, Janet key, Janet value) {
+ Geom::Point *box = (Geom::Point *)p;
+
+ if (!janet_checksize(key)) janet_panic("expected size as key");
+ if (!janet_checktype(key, JANET_NUMBER)) janet_panic("expected number as value");
+
+ size_t const index = (size_t) janet_unwrap_number(key);
+ switch (index) {
+ case 0:
+ (*box)[0] = janet_unwrap_number(value);
+ break;
+ case 1:
+ (*box)[1] = janet_unwrap_number(value);
+ break;
+ default:
+ janet_panic("index out of bounds");
+ }
}
extern "C" void janet_lib_geom_point(JanetTable *env) {