Commit 3a91a05d authored by Francois Chabot's avatar Francois Chabot
Browse files

added custom input to readme

parent a4f1cf4d
......@@ -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<std::uint8_t>`:
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<std::uint8_t>`, or a `std::list<std::uint16_t>`:
```cpp
std::vector<std::uint8_t> v = {'t', 'r', 'u', 'e'};
......@@ -430,6 +430,55 @@ std::vector<std::uint8_t> 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:
......
......@@ -98,6 +98,7 @@ TEST_CASE("Custom iterator")
{
return *ptr;
}
bool operator!=(const MyIterator& rhs) const
{
return ptr != rhs.ptr;
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment