diff --git a/rjp++/CMakeLists.txt b/rjp++/CMakeLists.txt index e3335f4..7701ec9 100644 --- a/rjp++/CMakeLists.txt +++ b/rjp++/CMakeLists.txt @@ -14,7 +14,7 @@ option(BUILD_TESTS "Build test programs" OFF) option(ENABLE_PROFILING "Enable asan" OFF) mark_as_advanced(ENABLE_PROFILING) -set(SOURCE_LIST "src/allocator.cpp" "src/array.cpp" "src/integral.cpp" "src/object.cpp" "src/rjp.cpp" "src/string.cpp" "src/string_val.cpp" "src/value.cpp" "src/vget_proxy.cpp" "src/container.cpp") +set(SOURCE_LIST "src/allocator.cpp" "src/array.cpp" "src/integral.cpp" "src/object.cpp" "src/rjp.cpp" "src/string.cpp" "src/string_val.cpp" "src/value.cpp" "src/vget_proxy.cpp" "src/container.cpp" "src/member.cpp") if(ENABLE_SHARED) set(RJP++_LIBFLAGS "-lrjp++ -lrexy") add_library(rjp++ SHARED ${SOURCE_LIST}) diff --git a/rjp++/include/array.hpp b/rjp++/include/array.hpp index 6b60598..23dec44 100644 --- a/rjp++/include/array.hpp +++ b/rjp++/include/array.hpp @@ -103,6 +103,8 @@ namespace rjp{ iterator end(void); const_iterator begin(void)const; const_iterator end(void)const; + const_iterator cbegin(void)const; + const_iterator cend(void)const; size_type size(void)const; diff --git a/rjp++/include/object.hpp b/rjp++/include/object.hpp index 84517ef..6c71846 100644 --- a/rjp++/include/object.hpp +++ b/rjp++/include/object.hpp @@ -134,7 +134,11 @@ namespace rjp{ iterator begin(void); const_iterator begin(void)const; - iterator end(void)const; + iterator end(void); + const_iterator end(void)const; + + const_iterator cbegin(void)const; + const_iterator cend(void)const; size_type size(void)const; diff --git a/rjp++/include/parse.hpp b/rjp++/include/parse.hpp index 481fca7..ed2987c 100644 --- a/rjp++/include/parse.hpp +++ b/rjp++/include/parse.hpp @@ -48,8 +48,11 @@ namespace rjp{ string errstr(void)const; }; + [[nodiscard]] string to_json(const value& val, int format = RJP_FORMAT_PRETTY); + [[nodiscard]] parse_res parse_json(const rexy::string_base& str, RJP_parse_flag = RJP_PARSE_NO_EXT); + [[nodiscard]] parse_res parse_json(const char* str, RJP_parse_flag = RJP_PARSE_NO_EXT); namespace detail{ template @@ -91,6 +94,7 @@ namespace rjp{ int irjp_parse_callback(char* dest, int size, void* userdata); } template + [[nodiscard]] parse_res parse_json(RJP_parse_flag f, Func&& func, Args&&... args){ RJP_parse_callback cb; detail::invoker_impl inv(std::forward(func), std::forward(args)...); diff --git a/rjp++/include/rjp_util.hpp b/rjp++/include/rjp_util.hpp index 047d330..7f99b3b 100644 --- a/rjp++/include/rjp_util.hpp +++ b/rjp++/include/rjp_util.hpp @@ -23,60 +23,19 @@ #include "integral.hpp" namespace rjp{ - namespace detail{ - template,std::remove_reference_t>::value> - struct convert_helper; - template - struct convert_helper{ - static To perform(From&& t){ - return To(std::move(t)); - } - }; - template - struct convert_helper{ - static To perform(const From& t){ - return To(const_cast(t.raw()), false); - } - }; - template - struct convert_helper{ - static decltype(auto) perform(From&& t){ - return std::forward(t); - } - }; + template + auto convert_to(From&& from){ + return To(std::forward(from)); } template - To convert(From&& from){ - return detail::convert_helper::perform(std::forward(from)); - } - - namespace detail{ - template - struct get_ref{ - using type = std::remove_reference_t; - }; - template - struct get_ref{ - using type = std::remove_reference_t&; - }; - template - struct get_ref{ - using type = std::remove_reference_t&&; - }; - template - struct get_ref{ - using type = To&&; - }; - template - struct get_ref{ - using type = To&&; - }; + auto steal_as(From&& from){ + return To(std::move(from)); } template - decltype(auto) cast(From&& from){ - return static_cast::type>(std::forward(from)); + auto borrow_as(From&& from){ + return To(const_cast(from.raw()), false); } namespace detail{ diff --git a/rjp++/src/array.cpp b/rjp++/src/array.cpp index dff1c29..bac37a3 100644 --- a/rjp++/src/array.cpp +++ b/rjp++/src/array.cpp @@ -76,10 +76,19 @@ namespace rjp{ array::iterator array::begin(void){ return iterator(m_value); } + array::iterator array::end(void){ + return iterator(); + } array::const_iterator array::begin(void)const{ return const_iterator(m_value); } - array::iterator array::end(void){ + array::const_iterator array::end(void)const{ + return iterator(); + } + array::const_iterator array::cbegin(void)const{ + return const_iterator(m_value); + } + array::const_iterator array::cend(void)const{ return iterator(); } array::size_type array::size(void)const{ diff --git a/rjp++/src/member.cpp b/rjp++/src/member.cpp new file mode 100644 index 0000000..d551589 --- /dev/null +++ b/rjp++/src/member.cpp @@ -0,0 +1,27 @@ +/** + rjp++ + Copyright (C) 2022 rexy712 + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "member.hpp" + +namespace rjp{ + + const RJP_string* member_base::member_key(RJP_value* v){ + return rjp_member_key(v); + } + +} diff --git a/rjp++/src/object.cpp b/rjp++/src/object.cpp index a6e256a..d3485a0 100644 --- a/rjp++/src/object.cpp +++ b/rjp++/src/object.cpp @@ -119,9 +119,18 @@ namespace rjp{ object::const_iterator object::begin(void)const{ return const_iterator(m_value); } - object::iterator object::end(void)const{ + object::iterator object::end(void){ return iterator(); } + object::const_iterator object::end(void)const{ + return const_iterator(); + } + object::const_iterator object::cbegin(void)const{ + return const_iterator(m_value); + } + object::const_iterator object::cend(void)const{ + return const_iterator(); + } object::size_type object::size(void)const{ return rjp_num_members(m_value); } diff --git a/rjp++/src/vget_proxy.cpp b/rjp++/src/vget_proxy.cpp index 72b66fb..daef431 100644 --- a/rjp++/src/vget_proxy.cpp +++ b/rjp++/src/vget_proxy.cpp @@ -27,16 +27,16 @@ namespace rjp::detail{ vget_proxy::vget_proxy(const rjp::value* v): m_value(v){} vget_proxy::operator int(void)const{ - return rjp::cast(*m_value).get(); + return rjp::borrow_as(*m_value).get(); } vget_proxy::operator bool(void)const{ - return rjp::cast(*m_value).get(); + return rjp::borrow_as(*m_value).get(); } vget_proxy::operator rexy::static_string(void)const{ - return rjp::cast(*m_value).get(); + return rjp::borrow_as(*m_value).get(); } vget_proxy::operator double(void)const{ - return rjp::cast(*m_value).get(); + return rjp::borrow_as(*m_value).get(); } } diff --git a/rjp++/tests/output.cpp b/rjp++/tests/output.cpp index 35cbe9c..d9c5d34 100644 --- a/rjp++/tests/output.cpp +++ b/rjp++/tests/output.cpp @@ -35,14 +35,14 @@ rjp::value case_6(void){ rjp::value case_8(void){ rjp::object obj; obj.add("key"_ss, 7); - return rjp::cast(obj); + return rjp::steal_as(obj); } //handle object with subobject rjp::value case_9(void){ rjp::object obj; rjp::object sub = obj.add("key"_ss); sub.add("subkey"_ss, false); - return rjp::cast(obj); + return rjp::steal_as(obj); } //handle object with multiple members rjp::value case_10(void){ @@ -50,7 +50,7 @@ rjp::value case_10(void){ rjp::object sub = obj.add("key"_ss); sub.add("subkey"_ss, false); sub.add("subkey2"_ss, true); - return rjp::cast(obj); + return rjp::steal_as(obj); } //handle object member ordering rjp::value case_11(void){ @@ -58,7 +58,7 @@ rjp::value case_11(void){ rjp::object sub = obj.add("key"_ss); sub.add("subkey2"_ss, true); sub.add("subkey"_ss, false); - return rjp::cast(obj); + return rjp::steal_as(obj); } //handle orderedobject member ordering /*RJP_value* case_12(void){ @@ -82,13 +82,13 @@ RJP_value* case_13(void){ rjp::value case_14(void){ rjp::array arr; arr.add(5); - return rjp::cast(arr); + return rjp::steal_as(arr); } //handle array with subarray rjp::value case_15(void){ rjp::array arr; arr.add().add(false); - return rjp::cast(arr); + return rjp::steal_as(arr); } //handle array with multiple elements rjp::value case_16(void){ @@ -96,7 +96,7 @@ rjp::value case_16(void){ rjp::array sub = arr.add(); sub.add(false); sub.add(true); - return rjp::cast(arr); + return rjp::steal_as(arr); } //handle array with multiple elements and subarray rjp::value case_17(void){ @@ -105,7 +105,7 @@ rjp::value case_17(void){ rjp::array sub = arr.add(); sub.add(false); sub.add(true); - return rjp::cast(arr); + return rjp::steal_as(arr); } //handle array with subobject with subarray rjp::value case_18(void){ @@ -114,7 +114,7 @@ rjp::value case_18(void){ rjp::object subobj = arr.add(); rjp::array subarr = subobj.add("key"_ss); subarr.add(false); - return rjp::cast(arr); + return rjp::steal_as(arr); } //handle object with many members rjp::value case_19(void){ @@ -126,7 +126,7 @@ rjp::value case_19(void){ subobj.add(rexy::static_string(c), i % 2 == 0); c[3] += 1; } - return rjp::cast(arr); + return rjp::steal_as(arr); } //handle orderedobject with many members as array element /*RJP_value* case_20(void){ @@ -151,7 +151,7 @@ rjp::value case_21(void){ rjp::array arr = obj.add("arr"_ss); for(int i = 0;i < 10;++i) arr.add(i); - return rjp::cast(obj); + return rjp::steal_as(obj); } /* //handle unorderedobject conversion @@ -204,12 +204,12 @@ rjp::value case_27(void){ rjp::value case_28(void){ rjp::object obj; obj.add("key"_ss, "string"_ss); - return rjp::cast(obj); + return rjp::steal_as(obj); } rjp::value case_29(void){ rjp::object obj; obj.add("key"_ss, ""_ss); - return rjp::cast(obj); + return rjp::steal_as(obj); } static test_pair tests[] = {