From 295c27029ba6caf80cbc296379dcca5f9d27ee3a Mon Sep 17 00:00:00 2001 From: rexy712 Date: Thu, 26 Mar 2020 18:38:01 -0700 Subject: [PATCH] Rearrange some rjp++ files. Also realized that subobject return does not qualify for nrvo, so that's a problem. --- rjp++/CMakeLists.txt | 2 +- rjp++/include/parse.hpp | 65 +++++++++++++++++++ rjp++/include/rjp_internal.hpp | 113 +++------------------------------ rjp++/include/rjp_util.hpp | 48 ++++++++++++++ rjp++/src/allocator.cpp | 2 +- rjp++/src/array.cpp | 2 +- rjp++/src/integral.cpp | 2 +- rjp++/src/object.cpp | 2 +- rjp++/src/rjp.cpp | 1 + rjp++/src/string.cpp | 2 +- rjp++/src/string_val.cpp | 2 +- rjp++/src/value.cpp | 2 +- rjp++/tests/output.cpp | 24 +++---- rjp++/tests/parse.cpp | 2 +- 14 files changed, 143 insertions(+), 126 deletions(-) create mode 100644 rjp++/include/parse.hpp diff --git a/rjp++/CMakeLists.txt b/rjp++/CMakeLists.txt index f2612e4..0944c0f 100644 --- a/rjp++/CMakeLists.txt +++ b/rjp++/CMakeLists.txt @@ -30,7 +30,7 @@ configure_file( ) set_target_properties(rjp++ PROPERTIES PUBLIC_HEADER ${INCLUDE_PATH}/rjp.hpp) set(CPP_HEADERS ${INCLUDE_PATH}/array.hpp ${INCLUDE_PATH}/integral.hpp ${INCLUDE_PATH}/iterator.hpp - ${INCLUDE_PATH}/member.hpp ${INCLUDE_PATH}/object.hpp ${INCLUDE_PATH}/rjp_internal.hpp + ${INCLUDE_PATH}/member.hpp ${INCLUDE_PATH}/object.hpp ${INCLUDE_PATH}/parse.hpp ${INCLUDE_PATH}/string.hpp ${INCLUDE_PATH}/string_val.hpp ${INCLUDE_PATH}/value.hpp ${INCLUDE_PATH}/rjp_util.hpp) diff --git a/rjp++/include/parse.hpp b/rjp++/include/parse.hpp new file mode 100644 index 0000000..e919c61 --- /dev/null +++ b/rjp++/include/parse.hpp @@ -0,0 +1,65 @@ +#ifndef RJP_PARSE_HPP +#define RJP_PARSE_HPP + +#include +#include "string.hpp" +#include "value.hpp" + +#include //move +#include + +namespace rjp{ + + string to_json(const value& val, int format = RJP_FORMAT_PRETTY); + value parse_json(const rexy::string_base& str, RJP_parse_flag = RJP_PARSE_NONE); + value parse_json(const char* str, RJP_parse_flag = RJP_PARSE_NONE); + namespace detail{ + template + struct sequence_tup{}; + template + struct sequence_gen : public sequence_gen{}; + template + struct sequence_gen<0, Indexes...>{ + using type = sequence_tup; + }; + + template + struct parse_helper{ + Func&& func; + std::tuple tup; + + template + int operator()(char* c, int size, sequence_tup)const{ + return std::forward(func)(c, size, std::get(tup)...); + } + }; + struct invoker{ + virtual ~invoker(void){} + virtual int run(char*, int)const = 0; + }; + template + struct invoker_impl : public invoker{ + parse_helper ph; + + template + invoker_impl(Fn&& fn, Ts&&... ts): + ph{std::forward(fn), {std::forward(ts)...}}{} + int run(char* c, int size)const override{ + return ph(c, size, typename sequence_gen::type{}); + } + }; + + int irjp_parse_callback(char* dest, int size, void* userdata); + } + template + value parse_json(RJP_parse_flag f, Func&& func, Args&&... args){ + RJP_parse_callback cb; + detail::invoker_impl inv(std::forward(func), std::forward(args)...); + cb.data = static_cast(&inv); + cb.read = detail::irjp_parse_callback; + return value(rjp_parse_cback(f, &cb), true); + } + +} + +#endif diff --git a/rjp++/include/rjp_internal.hpp b/rjp++/include/rjp_internal.hpp index e663a56..a203f0e 100644 --- a/rjp++/include/rjp_internal.hpp +++ b/rjp++/include/rjp_internal.hpp @@ -19,112 +19,15 @@ #ifndef RJP_HPP_INTERNAL #define RJP_HPP_INTERNAL -#include +#include "array.hpp" +#include "integral.hpp" +#include "iterator.hpp" +#include "member.hpp" +#include "object.hpp" +#include "rjp_internal.hpp" #include "string.hpp" +#include "string_val.hpp" #include "value.hpp" - -#include //move -#include - -namespace rjp{ - - string to_json(const value& val, int format = RJP_FORMAT_PRETTY); - value parse_json(const rexy::string_base& str, RJP_parse_flag = RJP_PARSE_NONE); - value parse_json(const char* str, RJP_parse_flag = RJP_PARSE_NONE); - namespace detail{ - template - struct sequence_tup{}; - template - struct sequence_gen : public sequence_gen{}; - template - struct sequence_gen<0, Indexes...>{ - using type = sequence_tup; - }; - - template - struct parse_helper{ - Func&& func; - std::tuple tup; - - template - int operator()(char* c, int size, sequence_tup)const{ - return std::forward(func)(c, size, std::get(tup)...); - } - }; - struct invoker{ - virtual ~invoker(void){} - virtual int run(char*, int)const = 0; - }; - template - struct invoker_impl : public invoker{ - parse_helper ph; - - template - invoker_impl(Fn&& fn, Ts&&... ts): - ph{std::forward(fn), {std::forward(ts)...}}{} - int run(char* c, int size)const override{ - return ph(c, size, typename sequence_gen::type{}); - } - }; - - int irjp_parse_callback(char* dest, int size, void* userdata); - } - template - value parse_json(RJP_parse_flag f, Func&& func, Args&&... args){ - RJP_parse_callback cb; - detail::invoker_impl inv(std::forward(func), std::forward(args)...); - cb.data = static_cast(&inv); - cb.read = detail::irjp_parse_callback; - return value(rjp_parse_cback(f, &cb), true); - } - - 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 - 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 - decltype(auto) cast(From&& from){ - return static_cast::type>(std::forward(from)); - } -} +#include "parse.hpp" #endif diff --git a/rjp++/include/rjp_util.hpp b/rjp++/include/rjp_util.hpp index 69571ee..46c6404 100644 --- a/rjp++/include/rjp_util.hpp +++ b/rjp++/include/rjp_util.hpp @@ -23,6 +23,54 @@ #include "integral.hpp" namespace rjp::detail{ + 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 + 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 + decltype(auto) cast(From&& from){ + return static_cast::type>(std::forward(from)); + } + template void set_to_underlying(RJP_value* val, typename Val::underlying_type); template<> diff --git a/rjp++/src/allocator.cpp b/rjp++/src/allocator.cpp index c767c7b..af1f594 100644 --- a/rjp++/src/allocator.cpp +++ b/rjp++/src/allocator.cpp @@ -16,7 +16,7 @@ along with this program. If not, see . */ -#include "rjp.h" +#include #include "string.hpp" #include //memcpy diff --git a/rjp++/src/array.cpp b/rjp++/src/array.cpp index d2be1dd..2df45f9 100644 --- a/rjp++/src/array.cpp +++ b/rjp++/src/array.cpp @@ -17,7 +17,7 @@ */ #include "array.hpp" -#include "rjp.h" +#include #include //move, swap namespace rjp{ diff --git a/rjp++/src/integral.cpp b/rjp++/src/integral.cpp index 9c45a84..95b48ff 100644 --- a/rjp++/src/integral.cpp +++ b/rjp++/src/integral.cpp @@ -17,7 +17,7 @@ */ #include "integral.hpp" -#include "rjp.h" +#include #include //move namespace rjp{ diff --git a/rjp++/src/object.cpp b/rjp++/src/object.cpp index 2a36b21..3d8fc58 100644 --- a/rjp++/src/object.cpp +++ b/rjp++/src/object.cpp @@ -17,7 +17,7 @@ */ #include "object.hpp" -#include "rjp.h" +#include #include //move namespace rjp{ diff --git a/rjp++/src/rjp.cpp b/rjp++/src/rjp.cpp index 18591f6..3c25121 100644 --- a/rjp++/src/rjp.cpp +++ b/rjp++/src/rjp.cpp @@ -20,6 +20,7 @@ #include #include "rjp_internal.hpp" +#include "parse.hpp" #include "string.hpp" #include "value.hpp" #include "rjp_util.hpp" diff --git a/rjp++/src/string.cpp b/rjp++/src/string.cpp index d972c42..4c6af1e 100644 --- a/rjp++/src/string.cpp +++ b/rjp++/src/string.cpp @@ -17,7 +17,7 @@ */ #include -#include "rjp.h" +#include #include "string.hpp" #include //exchange diff --git a/rjp++/src/string_val.cpp b/rjp++/src/string_val.cpp index bcc8742..a82f2b3 100644 --- a/rjp++/src/string_val.cpp +++ b/rjp++/src/string_val.cpp @@ -17,7 +17,7 @@ */ #include "string_val.hpp" -#include "rjp.h" +#include #include //move namespace rjp{ diff --git a/rjp++/src/value.cpp b/rjp++/src/value.cpp index a059295..e043866 100644 --- a/rjp++/src/value.cpp +++ b/rjp++/src/value.cpp @@ -17,7 +17,7 @@ */ #include "value.hpp" -#include "rjp.h" +#include #include //swap, move, exchange namespace rjp{ diff --git a/rjp++/tests/output.cpp b/rjp++/tests/output.cpp index 6a6b253..bc52cd9 100644 --- a/rjp++/tests/output.cpp +++ b/rjp++/tests/output.cpp @@ -1,4 +1,4 @@ -#include "rjp.hpp" +#include "rjp_internal.hpp" #include #include @@ -35,14 +35,14 @@ rjp::value case_6(void){ rjp::value case_8(void){ rjp::object obj; obj.add("key"_ss, 7); - return obj; + return std::move(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 obj; + return std::move(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 obj; + return std::move(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 obj; + return std::move(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 arr; + return std::move(arr); } //handle array with subarray rjp::value case_15(void){ rjp::array arr; arr.add().add(false); - return arr; + return std::move(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 arr; + return std::move(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 arr; + return std::move(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 arr; + return std::move(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 arr; + return std::move(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 obj; + return std::move(obj); } /* //handle unorderedobject conversion diff --git a/rjp++/tests/parse.cpp b/rjp++/tests/parse.cpp index 35df8f0..5ebf17e 100644 --- a/rjp++/tests/parse.cpp +++ b/rjp++/tests/parse.cpp @@ -1,4 +1,4 @@ -#include "rjp.hpp" +#include "rjp_internal.hpp" #include #include