Remove broken rjp::cast and rjp::convert. Added const iterator access to object and array
This commit is contained in:
parent
f763438c47
commit
0d9cebedc0
@ -14,7 +14,7 @@ option(BUILD_TESTS "Build test programs" OFF)
|
|||||||
option(ENABLE_PROFILING "Enable asan" OFF)
|
option(ENABLE_PROFILING "Enable asan" OFF)
|
||||||
mark_as_advanced(ENABLE_PROFILING)
|
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)
|
if(ENABLE_SHARED)
|
||||||
set(RJP++_LIBFLAGS "-lrjp++ -lrexy")
|
set(RJP++_LIBFLAGS "-lrjp++ -lrexy")
|
||||||
add_library(rjp++ SHARED ${SOURCE_LIST})
|
add_library(rjp++ SHARED ${SOURCE_LIST})
|
||||||
|
|||||||
@ -103,6 +103,8 @@ namespace rjp{
|
|||||||
iterator end(void);
|
iterator end(void);
|
||||||
const_iterator begin(void)const;
|
const_iterator begin(void)const;
|
||||||
const_iterator end(void)const;
|
const_iterator end(void)const;
|
||||||
|
const_iterator cbegin(void)const;
|
||||||
|
const_iterator cend(void)const;
|
||||||
|
|
||||||
size_type size(void)const;
|
size_type size(void)const;
|
||||||
|
|
||||||
|
|||||||
@ -134,7 +134,11 @@ namespace rjp{
|
|||||||
|
|
||||||
iterator begin(void);
|
iterator begin(void);
|
||||||
const_iterator begin(void)const;
|
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;
|
size_type size(void)const;
|
||||||
|
|
||||||
|
|||||||
@ -48,8 +48,11 @@ namespace rjp{
|
|||||||
string errstr(void)const;
|
string errstr(void)const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[[nodiscard]]
|
||||||
string to_json(const value& val, int format = RJP_FORMAT_PRETTY);
|
string to_json(const value& val, int format = RJP_FORMAT_PRETTY);
|
||||||
|
[[nodiscard]]
|
||||||
parse_res parse_json(const rexy::string_base<char>& str, RJP_parse_flag = RJP_PARSE_NO_EXT);
|
parse_res parse_json(const rexy::string_base<char>& str, RJP_parse_flag = RJP_PARSE_NO_EXT);
|
||||||
|
[[nodiscard]]
|
||||||
parse_res parse_json(const char* str, RJP_parse_flag = RJP_PARSE_NO_EXT);
|
parse_res parse_json(const char* str, RJP_parse_flag = RJP_PARSE_NO_EXT);
|
||||||
namespace detail{
|
namespace detail{
|
||||||
template<int... Indexes>
|
template<int... Indexes>
|
||||||
@ -91,6 +94,7 @@ namespace rjp{
|
|||||||
int irjp_parse_callback(char* dest, int size, void* userdata);
|
int irjp_parse_callback(char* dest, int size, void* userdata);
|
||||||
}
|
}
|
||||||
template<class Func, class... Args>
|
template<class Func, class... Args>
|
||||||
|
[[nodiscard]]
|
||||||
parse_res parse_json(RJP_parse_flag f, Func&& func, Args&&... args){
|
parse_res parse_json(RJP_parse_flag f, Func&& func, Args&&... args){
|
||||||
RJP_parse_callback cb;
|
RJP_parse_callback cb;
|
||||||
detail::invoker_impl<Func,Args...> inv(std::forward<Func>(func), std::forward<Args>(args)...);
|
detail::invoker_impl<Func,Args...> inv(std::forward<Func>(func), std::forward<Args>(args)...);
|
||||||
|
|||||||
@ -23,60 +23,19 @@
|
|||||||
#include "integral.hpp"
|
#include "integral.hpp"
|
||||||
|
|
||||||
namespace rjp{
|
namespace rjp{
|
||||||
namespace detail{
|
|
||||||
template<class To, class From, bool = std::is_same<std::remove_reference_t<To>,std::remove_reference_t<From>>::value>
|
|
||||||
struct convert_helper;
|
|
||||||
template<class To, class From>
|
template<class To, class From>
|
||||||
struct convert_helper<To,From,false>{
|
auto convert_to(From&& from){
|
||||||
static To perform(From&& t){
|
return To(std::forward<From>(from));
|
||||||
return To(std::move(t));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
template<class To, class From>
|
|
||||||
struct convert_helper<To,From&,false>{
|
|
||||||
static To perform(const From& t){
|
|
||||||
return To(const_cast<RJP_value*>(t.raw()), false);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
template<class To, class From>
|
|
||||||
struct convert_helper<To,From,true>{
|
|
||||||
static decltype(auto) perform(From&& t){
|
|
||||||
return std::forward<From>(t);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class To, class From>
|
template<class To, class From>
|
||||||
To convert(From&& from){
|
auto steal_as(From&& from){
|
||||||
return detail::convert_helper<To,From>::perform(std::forward<From>(from));
|
return To(std::move(from));
|
||||||
}
|
|
||||||
|
|
||||||
namespace detail{
|
|
||||||
template<class To, class From>
|
|
||||||
struct get_ref{
|
|
||||||
using type = std::remove_reference_t<To>;
|
|
||||||
};
|
|
||||||
template<class To, class From>
|
|
||||||
struct get_ref<To, From&>{
|
|
||||||
using type = std::remove_reference_t<To>&;
|
|
||||||
};
|
|
||||||
template<class To, class From>
|
|
||||||
struct get_ref<To, From&&>{
|
|
||||||
using type = std::remove_reference_t<To>&&;
|
|
||||||
};
|
|
||||||
template<class To, class From>
|
|
||||||
struct get_ref<To&&, From&>{
|
|
||||||
using type = To&&;
|
|
||||||
};
|
|
||||||
template<class To, class From>
|
|
||||||
struct get_ref<To&&, From&&>{
|
|
||||||
using type = To&&;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class To, class From>
|
template<class To, class From>
|
||||||
decltype(auto) cast(From&& from){
|
auto borrow_as(From&& from){
|
||||||
return static_cast<typename detail::get_ref<To,From&&>::type>(std::forward<From>(from));
|
return To(const_cast<RJP_value*>(from.raw()), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace detail{
|
namespace detail{
|
||||||
|
|||||||
@ -76,10 +76,19 @@ namespace rjp{
|
|||||||
array::iterator array::begin(void){
|
array::iterator array::begin(void){
|
||||||
return iterator(m_value);
|
return iterator(m_value);
|
||||||
}
|
}
|
||||||
|
array::iterator array::end(void){
|
||||||
|
return iterator();
|
||||||
|
}
|
||||||
array::const_iterator array::begin(void)const{
|
array::const_iterator array::begin(void)const{
|
||||||
return const_iterator(m_value);
|
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();
|
return iterator();
|
||||||
}
|
}
|
||||||
array::size_type array::size(void)const{
|
array::size_type array::size(void)const{
|
||||||
|
|||||||
27
rjp++/src/member.cpp
Normal file
27
rjp++/src/member.cpp
Normal file
@ -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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "member.hpp"
|
||||||
|
|
||||||
|
namespace rjp{
|
||||||
|
|
||||||
|
const RJP_string* member_base::member_key(RJP_value* v){
|
||||||
|
return rjp_member_key(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@ -119,9 +119,18 @@ namespace rjp{
|
|||||||
object::const_iterator object::begin(void)const{
|
object::const_iterator object::begin(void)const{
|
||||||
return const_iterator(m_value);
|
return const_iterator(m_value);
|
||||||
}
|
}
|
||||||
object::iterator object::end(void)const{
|
object::iterator object::end(void){
|
||||||
return iterator();
|
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{
|
object::size_type object::size(void)const{
|
||||||
return rjp_num_members(m_value);
|
return rjp_num_members(m_value);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -27,16 +27,16 @@ namespace rjp::detail{
|
|||||||
vget_proxy::vget_proxy(const rjp::value* v):
|
vget_proxy::vget_proxy(const rjp::value* v):
|
||||||
m_value(v){}
|
m_value(v){}
|
||||||
vget_proxy::operator int(void)const{
|
vget_proxy::operator int(void)const{
|
||||||
return rjp::cast<const rjp::integer>(*m_value).get();
|
return rjp::borrow_as<rjp::integer>(*m_value).get();
|
||||||
}
|
}
|
||||||
vget_proxy::operator bool(void)const{
|
vget_proxy::operator bool(void)const{
|
||||||
return rjp::cast<const rjp::boolean>(*m_value).get();
|
return rjp::borrow_as<rjp::boolean>(*m_value).get();
|
||||||
}
|
}
|
||||||
vget_proxy::operator rexy::static_string<char>(void)const{
|
vget_proxy::operator rexy::static_string<char>(void)const{
|
||||||
return rjp::cast<const rjp::string_val>(*m_value).get();
|
return rjp::borrow_as<rjp::string_val>(*m_value).get();
|
||||||
}
|
}
|
||||||
vget_proxy::operator double(void)const{
|
vget_proxy::operator double(void)const{
|
||||||
return rjp::cast<const rjp::dfloat>(*m_value).get();
|
return rjp::borrow_as<rjp::dfloat>(*m_value).get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,14 +35,14 @@ rjp::value case_6(void){
|
|||||||
rjp::value case_8(void){
|
rjp::value case_8(void){
|
||||||
rjp::object obj;
|
rjp::object obj;
|
||||||
obj.add<rjp::integer>("key"_ss, 7);
|
obj.add<rjp::integer>("key"_ss, 7);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
//handle object with subobject
|
//handle object with subobject
|
||||||
rjp::value case_9(void){
|
rjp::value case_9(void){
|
||||||
rjp::object obj;
|
rjp::object obj;
|
||||||
rjp::object sub = obj.add<rjp::object>("key"_ss);
|
rjp::object sub = obj.add<rjp::object>("key"_ss);
|
||||||
sub.add<rjp::boolean>("subkey"_ss, false);
|
sub.add<rjp::boolean>("subkey"_ss, false);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
//handle object with multiple members
|
//handle object with multiple members
|
||||||
rjp::value case_10(void){
|
rjp::value case_10(void){
|
||||||
@ -50,7 +50,7 @@ rjp::value case_10(void){
|
|||||||
rjp::object sub = obj.add<rjp::object>("key"_ss);
|
rjp::object sub = obj.add<rjp::object>("key"_ss);
|
||||||
sub.add<rjp::boolean>("subkey"_ss, false);
|
sub.add<rjp::boolean>("subkey"_ss, false);
|
||||||
sub.add<rjp::boolean>("subkey2"_ss, true);
|
sub.add<rjp::boolean>("subkey2"_ss, true);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
//handle object member ordering
|
//handle object member ordering
|
||||||
rjp::value case_11(void){
|
rjp::value case_11(void){
|
||||||
@ -58,7 +58,7 @@ rjp::value case_11(void){
|
|||||||
rjp::object sub = obj.add<rjp::object>("key"_ss);
|
rjp::object sub = obj.add<rjp::object>("key"_ss);
|
||||||
sub.add<rjp::boolean>("subkey2"_ss, true);
|
sub.add<rjp::boolean>("subkey2"_ss, true);
|
||||||
sub.add<rjp::boolean>("subkey"_ss, false);
|
sub.add<rjp::boolean>("subkey"_ss, false);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
//handle orderedobject member ordering
|
//handle orderedobject member ordering
|
||||||
/*RJP_value* case_12(void){
|
/*RJP_value* case_12(void){
|
||||||
@ -82,13 +82,13 @@ RJP_value* case_13(void){
|
|||||||
rjp::value case_14(void){
|
rjp::value case_14(void){
|
||||||
rjp::array arr;
|
rjp::array arr;
|
||||||
arr.add<rjp::integer>(5);
|
arr.add<rjp::integer>(5);
|
||||||
return rjp::cast<rjp::value&&>(arr);
|
return rjp::steal_as<rjp::value>(arr);
|
||||||
}
|
}
|
||||||
//handle array with subarray
|
//handle array with subarray
|
||||||
rjp::value case_15(void){
|
rjp::value case_15(void){
|
||||||
rjp::array arr;
|
rjp::array arr;
|
||||||
arr.add<rjp::array>().add<rjp::boolean>(false);
|
arr.add<rjp::array>().add<rjp::boolean>(false);
|
||||||
return rjp::cast<rjp::value&&>(arr);
|
return rjp::steal_as<rjp::value>(arr);
|
||||||
}
|
}
|
||||||
//handle array with multiple elements
|
//handle array with multiple elements
|
||||||
rjp::value case_16(void){
|
rjp::value case_16(void){
|
||||||
@ -96,7 +96,7 @@ rjp::value case_16(void){
|
|||||||
rjp::array sub = arr.add<rjp::array>();
|
rjp::array sub = arr.add<rjp::array>();
|
||||||
sub.add<rjp::boolean>(false);
|
sub.add<rjp::boolean>(false);
|
||||||
sub.add<rjp::boolean>(true);
|
sub.add<rjp::boolean>(true);
|
||||||
return rjp::cast<rjp::value&&>(arr);
|
return rjp::steal_as<rjp::value>(arr);
|
||||||
}
|
}
|
||||||
//handle array with multiple elements and subarray
|
//handle array with multiple elements and subarray
|
||||||
rjp::value case_17(void){
|
rjp::value case_17(void){
|
||||||
@ -105,7 +105,7 @@ rjp::value case_17(void){
|
|||||||
rjp::array sub = arr.add<rjp::array>();
|
rjp::array sub = arr.add<rjp::array>();
|
||||||
sub.add<rjp::boolean>(false);
|
sub.add<rjp::boolean>(false);
|
||||||
sub.add<rjp::boolean>(true);
|
sub.add<rjp::boolean>(true);
|
||||||
return rjp::cast<rjp::value&&>(arr);
|
return rjp::steal_as<rjp::value>(arr);
|
||||||
}
|
}
|
||||||
//handle array with subobject with subarray
|
//handle array with subobject with subarray
|
||||||
rjp::value case_18(void){
|
rjp::value case_18(void){
|
||||||
@ -114,7 +114,7 @@ rjp::value case_18(void){
|
|||||||
rjp::object subobj = arr.add<rjp::object>();
|
rjp::object subobj = arr.add<rjp::object>();
|
||||||
rjp::array subarr = subobj.add<rjp::array>("key"_ss);
|
rjp::array subarr = subobj.add<rjp::array>("key"_ss);
|
||||||
subarr.add<rjp::boolean>(false);
|
subarr.add<rjp::boolean>(false);
|
||||||
return rjp::cast<rjp::value&&>(arr);
|
return rjp::steal_as<rjp::value>(arr);
|
||||||
}
|
}
|
||||||
//handle object with many members
|
//handle object with many members
|
||||||
rjp::value case_19(void){
|
rjp::value case_19(void){
|
||||||
@ -126,7 +126,7 @@ rjp::value case_19(void){
|
|||||||
subobj.add<rjp::boolean>(rexy::static_string<char>(c), i % 2 == 0);
|
subobj.add<rjp::boolean>(rexy::static_string<char>(c), i % 2 == 0);
|
||||||
c[3] += 1;
|
c[3] += 1;
|
||||||
}
|
}
|
||||||
return rjp::cast<rjp::value&&>(arr);
|
return rjp::steal_as<rjp::value>(arr);
|
||||||
}
|
}
|
||||||
//handle orderedobject with many members as array element
|
//handle orderedobject with many members as array element
|
||||||
/*RJP_value* case_20(void){
|
/*RJP_value* case_20(void){
|
||||||
@ -151,7 +151,7 @@ rjp::value case_21(void){
|
|||||||
rjp::array arr = obj.add<rjp::array>("arr"_ss);
|
rjp::array arr = obj.add<rjp::array>("arr"_ss);
|
||||||
for(int i = 0;i < 10;++i)
|
for(int i = 0;i < 10;++i)
|
||||||
arr.add<rjp::integer>(i);
|
arr.add<rjp::integer>(i);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
//handle unorderedobject conversion
|
//handle unorderedobject conversion
|
||||||
@ -204,12 +204,12 @@ rjp::value case_27(void){
|
|||||||
rjp::value case_28(void){
|
rjp::value case_28(void){
|
||||||
rjp::object obj;
|
rjp::object obj;
|
||||||
obj.add("key"_ss, "string"_ss);
|
obj.add("key"_ss, "string"_ss);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
rjp::value case_29(void){
|
rjp::value case_29(void){
|
||||||
rjp::object obj;
|
rjp::object obj;
|
||||||
obj.add("key"_ss, ""_ss);
|
obj.add("key"_ss, ""_ss);
|
||||||
return rjp::cast<rjp::value&&>(obj);
|
return rjp::steal_as<rjp::value>(obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
static test_pair tests[] = {
|
static test_pair tests[] = {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user