LLVM  10.0.0svn
Classes | Public Types | Public Member Functions | List of all members
llvm::json::OStream Class Reference

json::OStream allows writing well-formed JSON without materializing all structures as json::Value ahead of time. More...

#include "llvm/Support/JSON.h"

Public Types

using Block = llvm::function_ref< void()>
 

Public Member Functions

 OStream (llvm::raw_ostream &OS, unsigned IndentSize=0)
 
 ~OStream ()
 
void flush ()
 Flushes the underlying ostream. OStream does not buffer internally. More...
 
void value (const Value &V)
 Emit a self-contained value (number, string, vector<string> etc). More...
 
void array (Block Contents)
 Emit an array whose elements are emitted in the provided Block. More...
 
void object (Block Contents)
 Emit an object whose elements are emitted in the provided Block. More...
 
void attribute (llvm::StringRef Key, const Value &Contents)
 Emit an attribute whose value is self-contained (number, vector<int> etc). More...
 
void attributeArray (llvm::StringRef Key, Block Contents)
 Emit an attribute whose value is an array with elements from the Block. More...
 
void attributeObject (llvm::StringRef Key, Block Contents)
 Emit an attribute whose value is an object with attributes from the Block. More...
 
void arrayBegin ()
 
void arrayEnd ()
 
void objectBegin ()
 
void objectEnd ()
 
void attributeBegin (llvm::StringRef Key)
 
void attributeEnd ()
 

Detailed Description

json::OStream allows writing well-formed JSON without materializing all structures as json::Value ahead of time.

It's faster, lower-level, and less safe than OS << json::Value.

Only one "top-level" object can be written to a stream. Simplest usage involves passing lambdas (Blocks) to fill in containers:

json::OStream J(OS); J.array([&]{ for (const Event &E : Events) J.object([&] { J.attribute("timestamp", int64_t(E.Time)); J.attributeArray("participants", [&] { for (const Participant &P : E.Participants) J.string(P.toString()); }); }); });

This would produce JSON like:

[ { "timestamp": 19287398741, "participants": [ "King Kong", "Miley Cyrus", "Cleopatra" ] }, ... ]

The lower level begin/end methods (arrayBegin()) are more flexible but care must be taken to pair them correctly:

json::OStream J(OS); for (const Event &E : Events) { J.objectBegin(); J.attribute("timestamp", int64_t(E.Time)); J.attributeBegin("participants"); for (const Participant &P : E.Participants) J.value(P.toString()); J.attributeEnd(); J.objectEnd(); } J.arrayEnd();

If the call sequence isn't valid JSON, asserts will fire in debug mode. This can be mismatched begin()/end() pairs, trying to emit attributes inside an array, and so on. With asserts disabled, this is undefined behavior.

Definition at line 751 of file JSON.h.

Member Typedef Documentation

◆ Block

Definition at line 753 of file JSON.h.

Constructor & Destructor Documentation

◆ OStream()

llvm::json::OStream::OStream ( llvm::raw_ostream OS,
unsigned  IndentSize = 0 
)
inlineexplicit

Definition at line 755 of file JSON.h.

◆ ~OStream()

llvm::json::OStream::~OStream ( )
inline

Definition at line 759 of file JSON.h.

References assert().

Member Function Documentation

◆ array()

void llvm::json::OStream::array ( Block  Contents)
inline

Emit an array whose elements are emitted in the provided Block.

Definition at line 775 of file JSON.h.

◆ arrayBegin()

void llvm::json::OStream::arrayBegin ( )

Definition at line 646 of file JSON.cpp.

References llvm::json::Value::Array.

◆ arrayEnd()

void llvm::json::OStream::arrayEnd ( )

Definition at line 654 of file JSON.cpp.

References llvm::json::Value::Array, and assert().

◆ attribute()

void llvm::json::OStream::attribute ( llvm::StringRef  Key,
const Value Contents 
)
inline

Emit an attribute whose value is self-contained (number, vector<int> etc).

Definition at line 791 of file JSON.h.

◆ attributeArray()

void llvm::json::OStream::attributeArray ( llvm::StringRef  Key,
Block  Contents 
)
inline

Emit an attribute whose value is an array with elements from the Block.

Definition at line 795 of file JSON.h.

◆ attributeBegin()

void llvm::json::OStream::attributeBegin ( llvm::StringRef  Key)

◆ attributeEnd()

void llvm::json::OStream::attributeEnd ( )

Definition at line 701 of file JSON.cpp.

References assert(), and llvm::json::Value::Object.

◆ attributeObject()

void llvm::json::OStream::attributeObject ( llvm::StringRef  Key,
Block  Contents 
)
inline

Emit an attribute whose value is an object with attributes from the Block.

Definition at line 799 of file JSON.h.

References llvm::HasValue(), and llvm::json::Object::Object().

◆ flush()

void llvm::json::OStream::flush ( )
inline

Flushes the underlying ostream. OStream does not buffer internally.

Definition at line 766 of file JSON.h.

◆ object()

void llvm::json::OStream::object ( Block  Contents)
inline

Emit an object whose elements are emitted in the provided Block.

Definition at line 781 of file JSON.h.

◆ objectBegin()

void llvm::json::OStream::objectBegin ( )

Definition at line 664 of file JSON.cpp.

References llvm::json::Value::Object.

◆ objectEnd()

void llvm::json::OStream::objectEnd ( )

Definition at line 672 of file JSON.cpp.

References assert(), and llvm::json::Value::Object.

◆ value()

void llvm::json::OStream::value ( const Value V)

The documentation for this class was generated from the following files: