From 3a91a05db665cf7b462258c31de6e491939d4b07 Mon Sep 17 00:00:00 2001 From: Francois Chabot Date: Thu, 28 May 2020 03:13:39 -0400 Subject: [PATCH] added custom input to readme --- README.md | 51 +++++++++++++++++++++++++++- test/src/unit-user_defined_input.cpp | 1 + 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 077a60bc..cf870973 100644 --- a/README.md +++ b/README.md @@ -416,7 +416,7 @@ Please note that setting the exception bit for `failbit` is inappropriate for th #### Read from iterator range -You can also parse JSON from an iterator range; that is, from any container accessible by iterators whose content is stored as contiguous byte sequence, for instance a `std::vector`: +You can also parse JSON from an iterator range; that is, from any container accessible by iterators whose `value_type` is an integral type of 1, 2 or 4 bytes, for instance a `std::vector`, or a `std::list`: ```cpp std::vector v = {'t', 'r', 'u', 'e'}; @@ -430,6 +430,55 @@ std::vector v = {'t', 'r', 'u', 'e'}; json j = json::parse(v); ``` +#### Custom data source + +Since the parse function accepts arbitrary iterator ranges, you can provide your own data sources by implementing the `LegacyInputIterator` concept. + +```cpp +struct MyContainer; + +struct MyContainer { + void advance(); + const char& get_current(); +}; + +struct MyIterator { + using difference_type = std::ptrdiff_t; + using value_type = char; + using pointer = const char*; + using reference = const char&; + using iterator_category = std::input_iterator_tag; + + MyIterator& operator++() { + MyContainer.advance(); + } + + bool operator!=(const MyIterator& rhs) const { + return rhs.pos != pos || rhs.target != target; + } + + reference operator*() const { + return target.get_current(); + } + + MyContainer* target = nullptr; + std::size_t pos = 0; +}; + +MyIterator begin(MyContainer& tgt) { + return MyIterator{&tgt, 0} +} + +MyIterator end(const MyContainer&) { + return MyIterator{nullptr, 0} +} + +void foo() { + MyContainer c; + json j = json::parse(c); +} +``` + #### SAX interface The library uses a SAX-like interface with the following functions: diff --git a/test/src/unit-user_defined_input.cpp b/test/src/unit-user_defined_input.cpp index d2685ec6..06be4e13 100644 --- a/test/src/unit-user_defined_input.cpp +++ b/test/src/unit-user_defined_input.cpp @@ -98,6 +98,7 @@ TEST_CASE("Custom iterator") { return *ptr; } + bool operator!=(const MyIterator& rhs) const { return ptr != rhs.ptr;