Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 48 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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, which will be interpreted as UTF-8, UTF-16 and UTF-32 respectively. 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'};
Expand All @@ -430,6 +430,53 @@ 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 {
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();
return *this;
}

bool operator!=(const MyIterator& rhs) const {
return rhs.target != target;
}

reference operator*() const {
return target.get_current();
}

MyContainer* target = nullptr;
};

MyIterator begin(MyContainer& tgt) {
return MyIterator{&tgt};
}

MyIterator end(const MyContainer&) {
return {};
}

void foo() {
MyContainer c;
json j = json::parse(c);
}
```

#### SAX interface

The library uses a SAX-like interface with the following functions:
Expand Down
Loading