Commit Graph

2608 Commits

Author SHA1 Message Date
Evan Driscoll
fe09e0dd6b Overload 'register_style' template instead of awkward multi-naming
Hopefully this is an improvement. :-)
2018-06-05 22:32:35 -05:00
Evan Driscoll
d7677fca6f Refactor: some TMP machinery to lead to better overloading
The takes_argument trait is coutesy of @N00byEdge
2018-06-05 22:32:30 -05:00
Evan Driscoll
680a85b7a2 Rename 'fancy_serializer_{style,stylizer}' to 'print_{...}' 2018-06-04 22:41:11 -05:00
Evan Driscoll
494be1c445 Refactor: rename the register_style overloads
I really really wanted to name these the same and overload them,
but I couldn't get the metaprogramming to work right. Here's a
comment I wrote that describes the problems and what I *planned*
to do:

// What we want is the register_style overloads below. I chose to
// keep them with the same name. But there are two problems with
// that. First, because I need to wrap them in a std::function
// when promoting to two arguments, I want to make register_style
// themselves take the function parameter by a template argument
// so it doesn't get type-erased "twice" (with two virtual
// calls). But then that means that both versions would have the
// generic signature "template <typename Predicate>
// ... (Predicate, style)" and that would lead to ambiguous calls.
//
// The second problem is that ever if you keep the first parameter
// a std::function, because 'json_pointer' is implicitly
// convertible to a 'json', if you rely on the implicit conversion
// to std::function then you'd get an ambugious call.
//
// So what we want is, using Concept terms:
//
//    template <JsonCallable Predicate> ... (Predicate, style)
//    template <JsonPointerCallable Predicate> ... (Predicate, style)
//
// where JsonCallable is additionally *not*
// JsonPointerCallable. The following is my attempt to get that.

I then wrote some code that is similar to this:

    #include <functional>

    struct Main {};
    struct Secondary { Secondary(Main); };

    // http://en.cppreference.com/w/cpp/types/void_t
    template<typename... Ts> struct make_void { typedef void type;};
    template<typename... Ts> using void_t = typename make_void<Ts...>::type;

    template <typename, typename = void>
    struct can_be_called_with_main : std::false_type { };

    template <typename T>
    struct can_be_called_with_main<
        T,
        void_t<decltype(std::declval<T>()(std::declval<Main>()))>
    >: std::true_type { };

    template <typename, typename = void>
    struct can_be_called_with_secondary : std::false_type { };

    template <typename T>
    struct can_be_called_with_secondary<
        T,
        void_t<decltype(std::declval<T>()(std::declval<Secondary>()))>
    >: std::true_type { };

    template <typename Functor>
    auto
    func(Functor f)
    -> typename std::enable_if<can_be_called_with_main<Functor>::value, int>::type
    {
        return 0;
    }

    template <typename Functor>
    auto
    func(Functor f)
    -> typename std::enable_if<
            can_be_called_with_secondary<Functor>::value
            && !can_be_called_with_main<Functor>::value
            , int>::type
    {
        return 0;
    }

    auto x1 = func([] (Main) {});
    auto x2 = func([] (Secondary) {});

where Main is like 'json' and Secondary like 'json_pointer'.

Problem is it doesn't work -- in the SFIANE context, it looks like
predicates of both `bool (json)` and `bool (json_pointer)` are callable
with both json and json_pointer objects.

In the case of `bool (json)` being called with a 'json_pointer', that
is via the implicit conversion discussed in the comment above. In the
caes of `bool (json_pointer)` being called with a `json`, my guess
as to what is going on is that `json` provides an implicit to-anything
conversion, which uses a `from_json` function. However, that isn't
implemented in a SFIANE-friendly way -- when you try to actually make
that conversion, there's a static_assert failure.

An alternative approach would be to extract the first argument to
the provided predicate via some technique like those described in
https://functionalcpp.wordpress.com/2013/08/05/function-traits/,
and then is_same them vs json and json_pointer.
2018-06-04 22:28:58 -05:00
Evan Driscoll
edb6b25569 Fancy printer predicate now takes current JSON object
The API is ugly at the moment. Will fix with an ugly
implementation soon.
2018-06-04 21:59:21 -05:00
Evan Driscoll
c7a64b8846 Example of more powerful matcher being useful 2018-06-03 22:41:42 -05:00
Evan Driscoll
5f0870ef34 Expose the matcher predicate from fancy stylizer 2018-06-03 22:26:55 -05:00
Evan Driscoll
d0eb2f21d3 Refactor: fancy_serializer passes json_pointer to stylizer 2018-06-03 22:06:27 -05:00
Evan Driscoll
ca3f3959a8 Refactor: fancy_serializer tracks a json_pointer context 2018-06-03 22:02:07 -05:00
Evan Driscoll
91971e394f Provide accessors into json_pointer 2018-06-03 21:52:28 -05:00
Evan Driscoll
6c746460c6 Add missing header file 2018-06-03 21:51:45 -05:00
Evan Driscoll
860661987f Spaces after commas (in [1, 2]) is controllable separately from multiline 2018-06-03 00:02:49 -05:00
Evan Driscoll
e7b02c10dd Spaces after a colon (in {"k": v}) controllable separately from multiline 2018-06-03 00:00:12 -05:00
Evan Driscoll
ec756e47ad Refactor: don't indent when multiline is false 2018-06-02 23:52:30 -05:00
Evan Driscoll
af8dd92a0c Refactor: introduce explicit multiline control
Instead of depending on indent_step
2018-06-02 23:48:26 -05:00
Evan Driscoll
5e10e97296 Refactor: dump_object_key_value
This isn't as clean as I wanted -- there's a lot more context
than I realized -- but I think it's still an improvement and
will become even moreso later
2018-06-02 23:35:38 -05:00
Evan Driscoll
ef679f8988 Fancy serializer: styles continue to propagate if not overridden
This is half a bug fix half just continuing work from befor
2018-06-02 23:17:42 -05:00
Evan Driscoll
186c7df25a Can style subobjects of a object differently, by key 2018-06-02 23:10:28 -05:00
Evan Driscoll
7fa4431474 Refactor and prep: introduce new fancy_serializer_stylizer class
This will be able to provide multiple styles depending on context
2018-06-02 22:47:05 -05:00
Evan Driscoll
28e7eecf33 Fancy serializer can limit recursion depth
Elides objects with ... if that limit is exceeded
2018-06-02 22:22:24 -05:00
Evan Driscoll
cd0c225a50 Use raw literals for multi-line expected results
Prettyfies the test cases a bit, though there is a utiliity function
needed now.
2018-06-02 22:10:16 -05:00
Evan Driscoll
1c1c789084 Serializer edge case bug fix: very deep indents ignored indent_char 2018-06-02 21:34:55 -05:00
Evan Driscoll
a983e47619 Refactor: dump_object no longer splits cases by indent 2018-06-02 21:08:53 -05:00
Evan Driscoll
9cdf54b886 Refactor: dump_array doesn't split cases for indent 2018-06-02 21:01:22 -05:00
Evan Driscoll
cc4206a718 West const to match existing code 2018-06-02 20:52:12 -05:00
Evan Driscoll
dafee1343c Refactor: dump tracks recursive depth, not indent size
This makes the depth independent of the indent_step and independent
of whether it's indenting at all
2018-06-02 20:51:26 -05:00
Evan Driscoll
f180227b6d Fancy serializer: Split object and array handling into functions 2018-06-02 20:30:12 -05:00
Evan Driscoll
0500d41fbb TODO note 2018-06-02 20:18:55 -05:00
Evan Driscoll
7dbfe2459b Refactor: move string handling to dump_string 2018-06-02 20:15:07 -05:00
Evan Driscoll
d54f4653ed It's now possible to limit the size of strings 2018-06-02 02:09:04 -05:00
Evan Driscoll
003f3e298b Introduce fancy_serializer_style 2018-06-02 01:18:55 -05:00
Evan Driscoll
e38b4e8031 Re-support indentation in fancy_serializer 2018-06-02 01:07:25 -05:00
Evan Driscoll
297ff8e53f Use primitive_serializer in fancy_serializer 2018-06-02 00:23:00 -05:00
Evan Driscoll
e9cb8f604d Split primitive serialization into own class 2018-06-02 00:16:08 -05:00
Evan Driscoll
a2231324e9 Start reworking fancy serialization tests 2018-06-01 23:41:15 -05:00
Evan Driscoll
607b973035 Fancy Serialization: copy serializer to fancy_serializer
1. Copy header and rename; add to Makefile; amalgamate
2. Add as friend to basic_json
3. Copy operator<< to 'fancy_dump' and simplify
4. Change test to refer to that
2018-06-01 23:13:49 -05:00
Evan Driscoll
b584000e7c Fancy serialiaztion: copy old serialization test file
Just copy unit-serialization to unit-fancy-serialization
2018-06-01 23:12:04 -05:00
Evan Driscoll
fe90fa5181 Run 'make almalgamate'
astyle reformatted some stuff... I... don't know why.
2018-06-01 23:11:34 -05:00
Niels Lohmann
e830bc502f
Merge pull request #1117 from TinyTinni/develop
remove stringstream dependency
2018-06-01 08:05:45 +02:00
Matthias Möller
ecadcdb593 added char cast
should fix the GCC unittest
2018-05-31 16:36:16 +02:00
Matthias Möller
48656a49f5 typo 2018-05-31 15:32:21 +02:00
Matthias Möller
64acb42aa7 remove stringstream dependency 2018-05-31 13:45:58 +02:00
Niels Lohmann
8efbf8d7bb
📝 documentation to avoid future issues like #1108 2018-05-28 18:14:44 +02:00
Niels Lohmann
e5a67fc3f8
Merge branch 'develop' of https://github.com/nlohmann/json into develop 2018-05-28 17:57:46 +02:00
Niels Lohmann
a49644ab74
🚑 adjusted Fuzzer to new parser
out_of_range exceptions where unexpected before - the parser used to crash in these situations...
2018-05-28 17:57:22 +02:00
Niels Lohmann
0efaf891e5
Merge pull request #1089 from theodelrieu/feature/map_conversion
Provide a from_json overload for std::map
2018-05-28 14:53:23 +02:00
Théo DELRIEU
c5e63fd684
Provide a from_json overload for std::map
This overload is chosen only when BasicJsonType::string_t
is not constructible from std::map::key_type.

Currently, converting a map to json treats it as an array of pairs.

fixes #1079
2018-05-28 11:06:24 +02:00
Niels Lohmann
db03d09312
Merge branch 'feature/key_ref' into develop (fixes #1098) 2018-05-27 22:26:00 +02:00
Niels Lohmann
cf9299d222
Merge branch 'feature/sax2' into develop #971 2018-05-27 18:12:59 +02:00
Niels Lohmann
3cdc4d784b
📝 added documentation 2018-05-27 18:07:53 +02:00