diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2019-11-29 17:40:57 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2019-11-29 17:40:57 +0000 |
| commit | a3495ede6711d3221780ebbc9adb9a2301206551 (patch) | |
| tree | 62580f8a2644277c110c3ba4c12bdf61e4e6fb00 /src/point.cpp | |
| parent | move lib2geom build into janet build folder (diff) | |
| download | janet-2geom-master.tar.gz janet-2geom-master.zip | |
Diffstat (limited to 'src/point.cpp')
| -rw-r--r-- | src/point.cpp | 52 |
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) { |
