aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yson_pull
diff options
context:
space:
mode:
authorMikhail Borisov <borisov.mikhail@gmail.com>2022-02-10 16:45:39 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:45:39 +0300
commita6a92afe03e02795227d2641b49819b687f088f8 (patch)
treef6984a1d27d5a7ec88a6fdd6e20cd5b7693b6ece /library/cpp/yson_pull
parentc6dc8b8bd530985bc4cce0137e9a5de32f1087cb (diff)
downloadydb-a6a92afe03e02795227d2641b49819b687f088f8.tar.gz
Restoring authorship annotation for Mikhail Borisov <borisov.mikhail@gmail.com>. Commit 1 of 2.
Diffstat (limited to 'library/cpp/yson_pull')
-rw-r--r--library/cpp/yson_pull/bridge.h40
-rw-r--r--library/cpp/yson_pull/buffer.h36
-rw-r--r--library/cpp/yson_pull/consumer.cpp160
-rw-r--r--library/cpp/yson_pull/consumer.h62
-rw-r--r--library/cpp/yson_pull/cyson_enums.h94
-rw-r--r--library/cpp/yson_pull/detail/byte_reader.h38
-rw-r--r--library/cpp/yson_pull/detail/byte_writer.h40
-rw-r--r--library/cpp/yson_pull/detail/cescape.h92
-rw-r--r--library/cpp/yson_pull/detail/cescape_decode.h34
-rw-r--r--library/cpp/yson_pull/detail/cescape_encode.h38
-rw-r--r--library/cpp/yson_pull/detail/fail.h12
-rw-r--r--library/cpp/yson_pull/detail/format_string.h16
-rw-r--r--library/cpp/yson_pull/detail/input/buffered.h20
-rw-r--r--library/cpp/yson_pull/detail/input/stdio_file.h30
-rw-r--r--library/cpp/yson_pull/detail/input/stream.h116
-rw-r--r--library/cpp/yson_pull/detail/lexer_base.h132
-rw-r--r--library/cpp/yson_pull/detail/macros.h28
-rw-r--r--library/cpp/yson_pull/detail/number.h16
-rw-r--r--library/cpp/yson_pull/detail/output/buffered.h24
-rw-r--r--library/cpp/yson_pull/detail/output/stdio_file.h24
-rw-r--r--library/cpp/yson_pull/detail/output/stream.h92
-rw-r--r--library/cpp/yson_pull/detail/reader.h312
-rw-r--r--library/cpp/yson_pull/detail/stream_counter.h26
-rw-r--r--library/cpp/yson_pull/detail/symbols.h26
-rw-r--r--library/cpp/yson_pull/detail/traits.h14
-rw-r--r--library/cpp/yson_pull/detail/varint.h86
-rw-r--r--library/cpp/yson_pull/detail/writer.h386
-rw-r--r--library/cpp/yson_pull/detail/zigzag.h30
-rw-r--r--library/cpp/yson_pull/event.cpp30
-rw-r--r--library/cpp/yson_pull/event.h90
-rw-r--r--library/cpp/yson_pull/exceptions.cpp86
-rw-r--r--library/cpp/yson_pull/exceptions.h50
-rw-r--r--library/cpp/yson_pull/input.cpp58
-rw-r--r--library/cpp/yson_pull/input.h54
-rw-r--r--library/cpp/yson_pull/output.cpp50
-rw-r--r--library/cpp/yson_pull/output.h58
-rw-r--r--library/cpp/yson_pull/position_info.h26
-rw-r--r--library/cpp/yson_pull/range.h32
-rw-r--r--library/cpp/yson_pull/read_ops.cpp82
-rw-r--r--library/cpp/yson_pull/read_ops.h170
-rw-r--r--library/cpp/yson_pull/reader.cpp40
-rw-r--r--library/cpp/yson_pull/reader.h42
-rw-r--r--library/cpp/yson_pull/scalar.cpp100
-rw-r--r--library/cpp/yson_pull/scalar.h192
-rw-r--r--library/cpp/yson_pull/stream_type.h10
-rw-r--r--library/cpp/yson_pull/ut/cescape_ut.cpp34
-rw-r--r--library/cpp/yson_pull/ut/loop_ut.cpp382
-rw-r--r--library/cpp/yson_pull/ut/reader_ut.cpp332
-rw-r--r--library/cpp/yson_pull/ut/writer_ut.cpp90
-rw-r--r--library/cpp/yson_pull/ut/ya.make22
-rw-r--r--library/cpp/yson_pull/writer.cpp46
-rw-r--r--library/cpp/yson_pull/writer.h132
-rw-r--r--library/cpp/yson_pull/ya.make40
-rw-r--r--library/cpp/yson_pull/yson.h28
54 files changed, 2150 insertions, 2150 deletions
diff --git a/library/cpp/yson_pull/bridge.h b/library/cpp/yson_pull/bridge.h
index ac767dcba0..db3806d3d3 100644
--- a/library/cpp/yson_pull/bridge.h
+++ b/library/cpp/yson_pull/bridge.h
@@ -1,34 +1,34 @@
-#pragma once
-
-#include "consumer.h"
-#include "event.h"
-#include "writer.h"
-
-namespace NYsonPull {
+#pragma once
+
+#include "consumer.h"
+#include "event.h"
+#include "writer.h"
+
+namespace NYsonPull {
//! \brief Connect YSON stream producer and consumer.
//!
//! Useful for writing YSON stream filters.
//! \p Producer must have a \p next_event() method (like \p NYsonPull::reader).
//! \p Consumer must be like \p NYsonPull::consumer interface.
template <typename Producer, typename Consumer>
- inline void Bridge(Producer&& producer, Consumer&& consumer) {
+ inline void Bridge(Producer&& producer, Consumer&& consumer) {
for (;;) {
- auto& event = producer.NextEvent();
- consumer.OnEvent(event);
- if (event.Type() == EEventType::EndStream) {
+ auto& event = producer.NextEvent();
+ consumer.OnEvent(event);
+ if (event.Type() == EEventType::EndStream) {
break;
}
- }
- }
-
+ }
+ }
+
template <typename Producer>
- inline void Bridge(Producer&& producer, TWriter& writer_) {
- Bridge(std::forward<Producer>(producer), writer_.GetConsumer());
+ inline void Bridge(Producer&& producer, TWriter& writer_) {
+ Bridge(std::forward<Producer>(producer), writer_.GetConsumer());
}
-
+
template <typename Producer>
- inline void Bridge(Producer&& producer, TWriter&& writer_) {
- Bridge(std::forward<Producer>(producer), writer_.GetConsumer());
+ inline void Bridge(Producer&& producer, TWriter&& writer_) {
+ Bridge(std::forward<Producer>(producer), writer_.GetConsumer());
}
-
+
}
diff --git a/library/cpp/yson_pull/buffer.h b/library/cpp/yson_pull/buffer.h
index 04c9220ef3..1ab75c6bc5 100644
--- a/library/cpp/yson_pull/buffer.h
+++ b/library/cpp/yson_pull/buffer.h
@@ -1,11 +1,11 @@
-#pragma once
-
-#include <util/system/types.h>
-#include <util/system/yassert.h>
-
-#include <cstddef>
-
-namespace NYsonPull {
+#pragma once
+
+#include <util/system/types.h>
+#include <util/system/yassert.h>
+
+#include <cstddef>
+
+namespace NYsonPull {
//! \brief A non-owning buffer model.
//!
//! Represents a \p pos pointer moving between \p begin and \p end.
@@ -14,7 +14,7 @@ namespace NYsonPull {
T* begin_ = nullptr;
T* pos_ = nullptr;
T* end_ = nullptr;
-
+
public:
T* begin() const noexcept {
return begin_;
@@ -25,49 +25,49 @@ namespace NYsonPull {
T* end() const noexcept {
return end_;
}
-
+
//! \brief Amount of data after current position.
size_t available() const noexcept {
return end_ - pos_;
}
-
+
//! \brief Amount of data before current position.
size_t used() const noexcept {
return pos_ - begin_;
}
-
+
//! \brief Move current position \p nbytes forward.
void advance(size_t nbytes) noexcept {
Y_ASSERT(pos_ + nbytes <= end_);
pos_ += nbytes;
}
-
+
//! \brief Reset buffer pointers.
void reset(T* new_begin, T* new_end, T* new_pos) {
begin_ = new_begin;
pos_ = new_pos;
end_ = new_end;
}
-
+
//! \brief Reset buffer to beginning
void reset(T* new_begin, T* new_end) {
reset(new_begin, new_end, new_begin);
}
};
-
+
class output_buffer: public buffer<ui8> {
public:
//! \brief An output buffer is empty when there is no data written to it.
bool is_empty() const noexcept {
return pos() == begin();
}
-
+
//! \brief An output buffer is full when there is no space to write more data to it.
bool is_full() const noexcept {
return pos() == end();
}
};
-
+
class input_buffer: public buffer<const ui8> {
public:
//! An input stream is empty when there is no data to read in it.
@@ -75,5 +75,5 @@ namespace NYsonPull {
return pos() == end();
}
};
-
+
}
diff --git a/library/cpp/yson_pull/consumer.cpp b/library/cpp/yson_pull/consumer.cpp
index c238e0a6fb..a12d3358cd 100644
--- a/library/cpp/yson_pull/consumer.cpp
+++ b/library/cpp/yson_pull/consumer.cpp
@@ -1,83 +1,83 @@
-#include "consumer.h"
-
+#include "consumer.h"
+
#include <library/cpp/yson_pull/detail/macros.h>
-
-using namespace NYsonPull;
-
-void IConsumer::OnScalar(const TScalar& value) {
- switch (value.Type()) {
- case EScalarType::Entity:
- OnEntity();
- break;
-
- case EScalarType::Boolean:
- OnScalarBoolean(value.AsBoolean());
- break;
-
- case EScalarType::Int64:
- OnScalarInt64(value.AsInt64());
- break;
-
- case EScalarType::UInt64:
- OnScalarUInt64(value.AsUInt64());
- break;
-
- case EScalarType::Float64:
- OnScalarFloat64(value.AsFloat64());
- break;
-
- case EScalarType::String:
- OnScalarString(value.AsString());
- break;
-
+
+using namespace NYsonPull;
+
+void IConsumer::OnScalar(const TScalar& value) {
+ switch (value.Type()) {
+ case EScalarType::Entity:
+ OnEntity();
+ break;
+
+ case EScalarType::Boolean:
+ OnScalarBoolean(value.AsBoolean());
+ break;
+
+ case EScalarType::Int64:
+ OnScalarInt64(value.AsInt64());
+ break;
+
+ case EScalarType::UInt64:
+ OnScalarUInt64(value.AsUInt64());
+ break;
+
+ case EScalarType::Float64:
+ OnScalarFloat64(value.AsFloat64());
+ break;
+
+ case EScalarType::String:
+ OnScalarString(value.AsString());
+ break;
+
default:
- Y_UNREACHABLE();
- }
-}
-
-void IConsumer::OnEvent(const TEvent& value) {
- switch (value.Type()) {
- case EEventType::BeginStream:
- OnBeginStream();
- break;
-
- case EEventType::EndStream:
- OnEndStream();
- break;
-
- case EEventType::BeginList:
- OnBeginList();
- break;
-
- case EEventType::EndList:
- OnEndList();
- break;
-
- case EEventType::BeginMap:
- OnBeginMap();
- break;
-
- case EEventType::Key:
- OnKey(value.AsString());
- break;
-
- case EEventType::EndMap:
- OnEndMap();
- break;
-
- case EEventType::BeginAttributes:
- OnBeginAttributes();
- break;
-
- case EEventType::EndAttributes:
- OnEndAttributes();
- break;
-
- case EEventType::Scalar:
- OnScalar(value.AsScalar());
- break;
-
+ Y_UNREACHABLE();
+ }
+}
+
+void IConsumer::OnEvent(const TEvent& value) {
+ switch (value.Type()) {
+ case EEventType::BeginStream:
+ OnBeginStream();
+ break;
+
+ case EEventType::EndStream:
+ OnEndStream();
+ break;
+
+ case EEventType::BeginList:
+ OnBeginList();
+ break;
+
+ case EEventType::EndList:
+ OnEndList();
+ break;
+
+ case EEventType::BeginMap:
+ OnBeginMap();
+ break;
+
+ case EEventType::Key:
+ OnKey(value.AsString());
+ break;
+
+ case EEventType::EndMap:
+ OnEndMap();
+ break;
+
+ case EEventType::BeginAttributes:
+ OnBeginAttributes();
+ break;
+
+ case EEventType::EndAttributes:
+ OnEndAttributes();
+ break;
+
+ case EEventType::Scalar:
+ OnScalar(value.AsScalar());
+ break;
+
default:
- Y_UNREACHABLE();
- }
-}
+ Y_UNREACHABLE();
+ }
+}
diff --git a/library/cpp/yson_pull/consumer.h b/library/cpp/yson_pull/consumer.h
index f3b1398d4c..943e744cc7 100644
--- a/library/cpp/yson_pull/consumer.h
+++ b/library/cpp/yson_pull/consumer.h
@@ -1,37 +1,37 @@
-#pragma once
-
-#include "event.h"
-
-#include <util/generic/strbuf.h>
+#pragma once
+
+#include "event.h"
+
+#include <util/generic/strbuf.h>
#include <util/system/types.h>
-
-namespace NYsonPull {
+
+namespace NYsonPull {
class IConsumer {
public:
virtual ~IConsumer() = default;
-
- virtual void OnBeginStream() = 0;
- virtual void OnEndStream() = 0;
-
- virtual void OnBeginList() = 0;
- virtual void OnEndList() = 0;
-
- virtual void OnBeginMap() = 0;
- virtual void OnEndMap() = 0;
-
- virtual void OnBeginAttributes() = 0;
- virtual void OnEndAttributes() = 0;
-
- virtual void OnKey(TStringBuf name) = 0;
-
- virtual void OnEntity() = 0;
- virtual void OnScalarBoolean(bool value) = 0;
- virtual void OnScalarInt64(i64 value) = 0;
- virtual void OnScalarUInt64(ui64 value) = 0;
- virtual void OnScalarFloat64(double value) = 0;
- virtual void OnScalarString(TStringBuf value) = 0;
-
- virtual void OnScalar(const TScalar& value);
- virtual void OnEvent(const TEvent& value);
+
+ virtual void OnBeginStream() = 0;
+ virtual void OnEndStream() = 0;
+
+ virtual void OnBeginList() = 0;
+ virtual void OnEndList() = 0;
+
+ virtual void OnBeginMap() = 0;
+ virtual void OnEndMap() = 0;
+
+ virtual void OnBeginAttributes() = 0;
+ virtual void OnEndAttributes() = 0;
+
+ virtual void OnKey(TStringBuf name) = 0;
+
+ virtual void OnEntity() = 0;
+ virtual void OnScalarBoolean(bool value) = 0;
+ virtual void OnScalarInt64(i64 value) = 0;
+ virtual void OnScalarUInt64(ui64 value) = 0;
+ virtual void OnScalarFloat64(double value) = 0;
+ virtual void OnScalarString(TStringBuf value) = 0;
+
+ virtual void OnScalar(const TScalar& value);
+ virtual void OnEvent(const TEvent& value);
};
}
diff --git a/library/cpp/yson_pull/cyson_enums.h b/library/cpp/yson_pull/cyson_enums.h
index 315de97307..e1b8dffeeb 100644
--- a/library/cpp/yson_pull/cyson_enums.h
+++ b/library/cpp/yson_pull/cyson_enums.h
@@ -1,47 +1,47 @@
-#pragma once
-
-typedef enum yson_event_type {
- YSON_EVENT_BEGIN_STREAM = 0,
- YSON_EVENT_END_STREAM = 1,
- YSON_EVENT_BEGIN_LIST = 2,
- YSON_EVENT_END_LIST = 3,
- YSON_EVENT_BEGIN_MAP = 4,
- YSON_EVENT_END_MAP = 5,
- YSON_EVENT_BEGIN_ATTRIBUTES = 6,
- YSON_EVENT_END_ATTRIBUTES = 7,
- YSON_EVENT_KEY = 8,
- YSON_EVENT_SCALAR = 9,
- YSON_EVENT_ERROR = 10
-} yson_event_type;
-
-typedef enum yson_scalar_type {
- YSON_SCALAR_ENTITY = 0,
- YSON_SCALAR_BOOLEAN = 1,
- YSON_SCALAR_INT64 = 2,
- YSON_SCALAR_UINT64 = 3,
- YSON_SCALAR_FLOAT64 = 4,
- YSON_SCALAR_STRING = 5
-} yson_scalar_type;
-
-typedef enum yson_input_stream_result {
- YSON_INPUT_STREAM_RESULT_OK = 0,
- YSON_INPUT_STREAM_RESULT_EOF = 1,
- YSON_INPUT_STREAM_RESULT_ERROR = 2
-} yson_input_stream_result;
-
-typedef enum yson_output_stream_result {
- YSON_OUTPUT_STREAM_RESULT_OK = 0,
- YSON_OUTPUT_STREAM_RESULT_ERROR = 1
-} yson_output_stream_result;
-
-typedef enum yson_writer_result {
- YSON_WRITER_RESULT_OK = 0,
- YSON_WRITER_RESULT_BAD_STREAM = 1,
- YSON_WRITER_RESULT_ERROR = 2
-} yson_writer_result;
-
-typedef enum yson_stream_type {
- YSON_STREAM_TYPE_NODE = 0,
- YSON_STREAM_TYPE_LIST_FRAGMENT = 1,
- YSON_STREAM_TYPE_MAP_FRAGMENT = 2
-} yson_stream_type;
+#pragma once
+
+typedef enum yson_event_type {
+ YSON_EVENT_BEGIN_STREAM = 0,
+ YSON_EVENT_END_STREAM = 1,
+ YSON_EVENT_BEGIN_LIST = 2,
+ YSON_EVENT_END_LIST = 3,
+ YSON_EVENT_BEGIN_MAP = 4,
+ YSON_EVENT_END_MAP = 5,
+ YSON_EVENT_BEGIN_ATTRIBUTES = 6,
+ YSON_EVENT_END_ATTRIBUTES = 7,
+ YSON_EVENT_KEY = 8,
+ YSON_EVENT_SCALAR = 9,
+ YSON_EVENT_ERROR = 10
+} yson_event_type;
+
+typedef enum yson_scalar_type {
+ YSON_SCALAR_ENTITY = 0,
+ YSON_SCALAR_BOOLEAN = 1,
+ YSON_SCALAR_INT64 = 2,
+ YSON_SCALAR_UINT64 = 3,
+ YSON_SCALAR_FLOAT64 = 4,
+ YSON_SCALAR_STRING = 5
+} yson_scalar_type;
+
+typedef enum yson_input_stream_result {
+ YSON_INPUT_STREAM_RESULT_OK = 0,
+ YSON_INPUT_STREAM_RESULT_EOF = 1,
+ YSON_INPUT_STREAM_RESULT_ERROR = 2
+} yson_input_stream_result;
+
+typedef enum yson_output_stream_result {
+ YSON_OUTPUT_STREAM_RESULT_OK = 0,
+ YSON_OUTPUT_STREAM_RESULT_ERROR = 1
+} yson_output_stream_result;
+
+typedef enum yson_writer_result {
+ YSON_WRITER_RESULT_OK = 0,
+ YSON_WRITER_RESULT_BAD_STREAM = 1,
+ YSON_WRITER_RESULT_ERROR = 2
+} yson_writer_result;
+
+typedef enum yson_stream_type {
+ YSON_STREAM_TYPE_NODE = 0,
+ YSON_STREAM_TYPE_LIST_FRAGMENT = 1,
+ YSON_STREAM_TYPE_MAP_FRAGMENT = 2
+} yson_stream_type;
diff --git a/library/cpp/yson_pull/detail/byte_reader.h b/library/cpp/yson_pull/detail/byte_reader.h
index 7cea50d323..36ffe8446b 100644
--- a/library/cpp/yson_pull/detail/byte_reader.h
+++ b/library/cpp/yson_pull/detail/byte_reader.h
@@ -1,29 +1,29 @@
-#pragma once
-
-#include "cescape.h"
-#include "fail.h"
-#include "stream_counter.h"
-
+#pragma once
+
+#include "cescape.h"
+#include "fail.h"
+#include "stream_counter.h"
+
#include <library/cpp/yson_pull/input.h>
-
+
namespace NYsonPull {
namespace NDetail {
template <class StreamCounter>
class byte_reader {
NYsonPull::NInput::IStream& stream_;
StreamCounter stream_counter_;
-
+
public:
byte_reader(NYsonPull::NInput::IStream& stream)
: stream_(stream)
{
}
-
+
// const-ness added to prevent direct stream mutation
const NYsonPull::NInput::IStream& stream() {
return stream_;
}
-
+
template <typename... Args>
ATTRIBUTE(noinline, cold)
void fail[[noreturn]](const char* msg, Args&&... args) {
@@ -32,23 +32,23 @@ namespace NYsonPull {
msg,
std::forward<Args>(args)...);
}
-
+
template <bool AllowFinish>
void fill_buffer() {
stream_.fill_buffer();
-
+
if (!AllowFinish) {
auto& buf = stream_.buffer();
- if (Y_UNLIKELY(buf.is_empty() && stream_.at_end())) {
+ if (Y_UNLIKELY(buf.is_empty() && stream_.at_end())) {
fail("Premature end of stream");
}
}
}
-
+
void fill_buffer() {
return fill_buffer<true>();
- }
-
+ }
+
template <bool AllowFinish>
ui8 get_byte() {
fill_buffer<AllowFinish>();
@@ -57,11 +57,11 @@ namespace NYsonPull {
? *buf.pos()
: ui8{'\0'};
}
-
+
ui8 get_byte() {
return get_byte<true>();
}
-
+
void advance(size_t bytes) {
auto& buf = stream_.buffer();
stream_counter_.update(
@@ -70,5 +70,5 @@ namespace NYsonPull {
buf.advance(bytes);
}
};
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/byte_writer.h b/library/cpp/yson_pull/detail/byte_writer.h
index dc1d4b4b96..71ffe6230b 100644
--- a/library/cpp/yson_pull/detail/byte_writer.h
+++ b/library/cpp/yson_pull/detail/byte_writer.h
@@ -1,27 +1,27 @@
-#pragma once
-
-#include "macros.h"
-
+#pragma once
+
+#include "macros.h"
+
#include <library/cpp/yson_pull/output.h>
-
-#include <util/system/types.h>
-
-#include <cstddef>
-#include <cstring>
-
+
+#include <util/system/types.h>
+
+#include <cstddef>
+#include <cstring>
+
namespace NYsonPull {
namespace NDetail {
template <class StreamCounter>
class byte_writer {
NYsonPull::NOutput::IStream& stream_;
StreamCounter stream_counter_;
-
+
public:
byte_writer(NYsonPull::NOutput::IStream& stream)
: stream_(stream)
{
}
-
+
// const-ness added to prevent direct stream mutation
const NYsonPull::NOutput::IStream& stream() {
return stream_;
@@ -29,11 +29,11 @@ namespace NYsonPull {
const StreamCounter& counter() {
return stream_counter_;
}
-
+
void flush_buffer() {
stream_.flush_buffer();
}
-
+
void advance(size_t bytes) {
auto& buf = stream_.buffer();
stream_counter_.update(
@@ -41,10 +41,10 @@ namespace NYsonPull {
buf.pos() + bytes);
buf.advance(bytes);
}
-
+
void write(ui8 c) {
auto& buf = stream_.buffer();
- if (Y_LIKELY(!buf.is_full())) {
+ if (Y_LIKELY(!buf.is_full())) {
*buf.pos() = c;
advance(1);
} else {
@@ -53,11 +53,11 @@ namespace NYsonPull {
stream_.flush_buffer({ptr, 1});
}
}
-
+
void write(const ui8* data, size_t size) {
auto& buf = stream_.buffer();
auto free_buf = buf.available();
- if (Y_LIKELY(size < free_buf)) {
+ if (Y_LIKELY(size < free_buf)) {
::memcpy(buf.pos(), data, size);
advance(size);
} else {
@@ -71,7 +71,7 @@ namespace NYsonPull {
stream_.flush_buffer({reinterpret_cast<const char*>(data),
size});
}
- }
+ }
};
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/cescape.h b/library/cpp/yson_pull/detail/cescape.h
index 1ea150e69a..2e468fc0f3 100644
--- a/library/cpp/yson_pull/detail/cescape.h
+++ b/library/cpp/yson_pull/detail/cescape.h
@@ -1,40 +1,40 @@
-#pragma once
-
-#include "byte_writer.h"
-#include "cescape_decode.h"
-#include "cescape_encode.h"
-#include "macros.h"
-
-#include <util/generic/strbuf.h>
+#pragma once
+
+#include "byte_writer.h"
+#include "cescape_decode.h"
+#include "cescape_encode.h"
+#include "macros.h"
+
+#include <util/generic/strbuf.h>
#include <util/generic/string.h>
-#include <util/generic/vector.h>
-
-/* REFERENCES FOR ESCAPE SEQUENCE INTERPRETATION:
- * C99 p. 6.4.3 Universal character names.
- * C99 p. 6.4.4.4 Character constants.
- *
- * <simple-escape-sequence> ::= {
- * \' , \" , \? , \\ ,
- * \a , \b , \f , \n , \r , \t , \v
- * }
- *
- * <octal-escape-sequence> ::= \ <octal-digit> {1, 3}
- * <hexadecimal-escape-sequence> ::= \x <hexadecimal-digit> +
- * <universal-character-name> ::= \u <hexadecimal-digit> {4}
- * || \U <hexadecimal-digit> {8}
- *
- * NOTE (6.4.4.4.7):
- * Each octal or hexadecimal escape sequence is the longest sequence of characters that can
- * constitute the escape sequence.
- *
- * THEREFORE:
- * - Octal escape sequence spans until rightmost non-octal-digit character.
- * - Octal escape sequence always terminates after three octal digits.
- * - Hexadecimal escape sequence spans until rightmost non-hexadecimal-digit character.
- * - Universal character name consists of exactly 4 or 8 hexadecimal digit.
- *
- */
-
+#include <util/generic/vector.h>
+
+/* REFERENCES FOR ESCAPE SEQUENCE INTERPRETATION:
+ * C99 p. 6.4.3 Universal character names.
+ * C99 p. 6.4.4.4 Character constants.
+ *
+ * <simple-escape-sequence> ::= {
+ * \' , \" , \? , \\ ,
+ * \a , \b , \f , \n , \r , \t , \v
+ * }
+ *
+ * <octal-escape-sequence> ::= \ <octal-digit> {1, 3}
+ * <hexadecimal-escape-sequence> ::= \x <hexadecimal-digit> +
+ * <universal-character-name> ::= \u <hexadecimal-digit> {4}
+ * || \U <hexadecimal-digit> {8}
+ *
+ * NOTE (6.4.4.4.7):
+ * Each octal or hexadecimal escape sequence is the longest sequence of characters that can
+ * constitute the escape sequence.
+ *
+ * THEREFORE:
+ * - Octal escape sequence spans until rightmost non-octal-digit character.
+ * - Octal escape sequence always terminates after three octal digits.
+ * - Hexadecimal escape sequence spans until rightmost non-hexadecimal-digit character.
+ * - Universal character name consists of exactly 4 or 8 hexadecimal digit.
+ *
+ */
+
namespace NYsonPull {
namespace NDetail {
namespace NCEscape {
@@ -48,7 +48,7 @@ namespace NYsonPull {
size);
});
}
-
+
// dest must have at least 4*data.size() bytes available
inline size_t encode(ui8* dest, TStringBuf data) {
auto* dest_begin = dest;
@@ -61,11 +61,11 @@ namespace NYsonPull {
});
return dest - dest_begin;
}
-
+
template <typename U>
void encode(byte_writer<U>& dest, TStringBuf data) {
auto& buffer = dest.stream().buffer();
- if (Y_LIKELY(buffer.available() >= data.size() * 4)) {
+ if (Y_LIKELY(buffer.available() >= data.size() * 4)) {
auto size = encode(buffer.pos(), data);
dest.advance(size);
} else {
@@ -77,14 +77,14 @@ namespace NYsonPull {
});
}
}
-
+
inline TString encode(TStringBuf data) {
TString result;
result.reserve(data.size());
encode(result, data);
return result;
- }
-
+ }
+
inline void decode(TString& dest, TStringBuf data) {
NImpl::unescape_impl(
reinterpret_cast<const ui8*>(data.begin()),
@@ -96,7 +96,7 @@ namespace NYsonPull {
dest.append(reinterpret_cast<const char*>(p), len);
});
}
-
+
inline void decode_inplace(TVector<ui8>& data) {
auto* out = static_cast<ui8*>(
::memchr(data.data(), '\\', data.size()));
@@ -115,14 +115,14 @@ namespace NYsonPull {
});
data.resize(out - &data[0]);
}
-
+
inline TString decode(TStringBuf data) {
TString result;
result.reserve(data.size());
decode(result, data);
return result;
}
-
+
ATTRIBUTE(noinline, cold)
inline TString quote(TStringBuf str) {
TString result;
@@ -132,7 +132,7 @@ namespace NYsonPull {
result += '"';
return result;
}
-
+
ATTRIBUTE(noinline, cold)
inline TString quote(ui8 ch) {
char c = ch;
diff --git a/library/cpp/yson_pull/detail/cescape_decode.h b/library/cpp/yson_pull/detail/cescape_decode.h
index 2ee5dd9500..377112924b 100644
--- a/library/cpp/yson_pull/detail/cescape_decode.h
+++ b/library/cpp/yson_pull/detail/cescape_decode.h
@@ -1,10 +1,10 @@
-#pragma once
-
-#include <util/system/types.h>
-
-#include <algorithm>
-#include <cstring>
-
+#pragma once
+
+#include <util/system/types.h>
+
+#include <algorithm>
+#include <cstring>
+
namespace NYsonPull {
namespace NDetail {
namespace NCEscape {
@@ -12,7 +12,7 @@ namespace NYsonPull {
inline ui8 as_digit(ui8 c) {
return c - ui8{'0'};
}
-
+
inline ui8 as_hexdigit(ui8 c) {
static constexpr ui8 hex_decode_map[256] = {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
@@ -37,10 +37,10 @@ namespace NYsonPull {
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255};
-
+
return hex_decode_map[c];
}
-
+
inline const ui8* read_oct(ui8& result, const ui8* p, ui8 n) {
auto digit = ui8{0};
while (n-- && (digit = as_digit(*p)) < 8) {
@@ -49,7 +49,7 @@ namespace NYsonPull {
}
return p;
}
-
+
inline const ui8* read_hex(ui8& result, const ui8* p, ui8 n) {
auto digit = ui8{0};
while (n-- && (digit = as_hexdigit(*p)) < 16) {
@@ -58,7 +58,7 @@ namespace NYsonPull {
}
return p;
}
-
+
inline const ui8* unescape_char_and_advance(
ui8& result,
const ui8* p,
@@ -88,7 +88,7 @@ namespace NYsonPull {
result = '\t';
++p;
break;
-
+
case 'x': {
++p;
result = 0;
@@ -101,7 +101,7 @@ namespace NYsonPull {
result = 'x';
}
} break;
-
+
case '0':
case '1':
case '2':
@@ -111,7 +111,7 @@ namespace NYsonPull {
result,
p, std::min<ptrdiff_t>(3, end - p));
break;
-
+
case '4':
case '5':
case '6':
@@ -124,7 +124,7 @@ namespace NYsonPull {
}
return p;
}
-
+
template <typename T, typename U>
inline void unescape_impl(
const ui8* p,
@@ -148,7 +148,7 @@ namespace NYsonPull {
}
}
}
- }
+ }
} // namespace NCEscape
} // namespace NDetail
}
diff --git a/library/cpp/yson_pull/detail/cescape_encode.h b/library/cpp/yson_pull/detail/cescape_encode.h
index bf5765f1d9..bf9a44ba5f 100644
--- a/library/cpp/yson_pull/detail/cescape_encode.h
+++ b/library/cpp/yson_pull/detail/cescape_encode.h
@@ -1,11 +1,11 @@
-#pragma once
-
+#pragma once
+
#include <util/system/types.h>
-
-// Whether to ensure strict ASCII compatibility
-// Turns UTF-8 strings into unreadable garbage for no known reason
-//#define CESCAPE_STRICT_ASCII
-
+
+// Whether to ensure strict ASCII compatibility
+// Turns UTF-8 strings into unreadable garbage for no known reason
+//#define CESCAPE_STRICT_ASCII
+
namespace NYsonPull {
namespace NDetail {
namespace NCEscape {
@@ -14,29 +14,29 @@ namespace NYsonPull {
constexpr ui8 hex_digits[] = "0123456789ABCDEF";
return hex_digits[value];
}
-
+
inline ui8 oct_digit(ui8 value) {
return '0' + value;
}
-
+
inline bool is_printable(ui8 c) {
-#ifdef CESCAPE_STRICT_ASCII
+#ifdef CESCAPE_STRICT_ASCII
return c >= 32 && c <= 126;
-#else
+#else
return c >= 32;
-#endif
+#endif
}
-
+
inline bool is_hex_digit(ui8 c) {
return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
}
-
+
inline bool is_oct_digit(ui8 c) {
return c >= '0' && c <= '7';
}
-
+
constexpr size_t ESCAPE_C_BUFFER_SIZE = 4;
-
+
inline size_t escape_char(
ui8 c,
ui8 next,
@@ -85,16 +85,16 @@ namespace NYsonPull {
return 4;
}
}
-
+
template <typename T>
inline void escape_impl(const ui8* str, size_t len, T&& consume) {
ui8 buffer[ESCAPE_C_BUFFER_SIZE];
-
+
size_t i, j;
for (i = 0, j = 0; i < len; ++i) {
auto next_char = i + 1 < len ? str[i + 1] : 0;
size_t rlen = escape_char(str[i], next_char, buffer);
-
+
if (rlen > 1) {
consume(str + j, i - j);
j = i + 1;
diff --git a/library/cpp/yson_pull/detail/fail.h b/library/cpp/yson_pull/detail/fail.h
index 6937612d0b..a140f34c91 100644
--- a/library/cpp/yson_pull/detail/fail.h
+++ b/library/cpp/yson_pull/detail/fail.h
@@ -1,11 +1,11 @@
-#pragma once
-
-#include "format_string.h"
-#include "macros.h"
-
+#pragma once
+
+#include "format_string.h"
+#include "macros.h"
+
#include <library/cpp/yson_pull/exceptions.h>
#include <library/cpp/yson_pull/position_info.h>
-
+
namespace NYsonPull {
namespace NDetail {
template <typename... Args>
diff --git a/library/cpp/yson_pull/detail/format_string.h b/library/cpp/yson_pull/detail/format_string.h
index 683fd1bf36..7413beb6f1 100644
--- a/library/cpp/yson_pull/detail/format_string.h
+++ b/library/cpp/yson_pull/detail/format_string.h
@@ -1,26 +1,26 @@
-#pragma once
-
-#include <util/generic/strbuf.h>
+#pragma once
+
+#include <util/generic/strbuf.h>
#include <util/generic/string.h>
-#include <util/string/builder.h>
-
+#include <util/string/builder.h>
+
namespace NYsonPull {
namespace NDetail {
namespace NImpl {
inline void apply_args(TStringBuilder&) {
}
-
+
template <typename T, typename... Args>
inline void apply_args(TStringBuilder& builder, T&& arg, Args&&... args) {
apply_args(builder << arg, std::forward<Args>(args)...);
}
}
-
+
template <typename... Args>
TString format_string(Args&&... args) {
TStringBuilder builder;
NImpl::apply_args(builder, std::forward<Args>(args)...);
return TString(std::move(builder));
}
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/input/buffered.h b/library/cpp/yson_pull/detail/input/buffered.h
index 9b1482577f..fef577df8b 100644
--- a/library/cpp/yson_pull/detail/input/buffered.h
+++ b/library/cpp/yson_pull/detail/input/buffered.h
@@ -1,31 +1,31 @@
-#pragma once
-
+#pragma once
+
#include <library/cpp/yson_pull/detail/macros.h>
-
+
#include <library/cpp/yson_pull/exceptions.h>
#include <library/cpp/yson_pull/input.h>
-
-#include <cstdio>
-#include <memory>
-
+
+#include <cstdio>
+#include <memory>
+
namespace NYsonPull {
namespace NDetail {
namespace NInput {
class TBuffered: public NYsonPull::NInput::IStream {
TArrayHolder<ui8> buffer_;
size_t size_;
-
+
public:
explicit TBuffered(size_t buffer_size)
: buffer_{new ui8[buffer_size]}
, size_{buffer_size} {
}
-
+
protected:
ui8* buffer_data() const {
return buffer_.Get();
}
-
+
size_t buffer_size() const {
return size_;
}
diff --git a/library/cpp/yson_pull/detail/input/stdio_file.h b/library/cpp/yson_pull/detail/input/stdio_file.h
index c412b7e59b..328931d435 100644
--- a/library/cpp/yson_pull/detail/input/stdio_file.h
+++ b/library/cpp/yson_pull/detail/input/stdio_file.h
@@ -1,35 +1,35 @@
-#pragma once
-
-#include "buffered.h"
-
+#pragma once
+
+#include "buffered.h"
+
#include <library/cpp/yson_pull/detail/macros.h>
-
+
#include <library/cpp/yson_pull/exceptions.h>
#include <library/cpp/yson_pull/input.h>
-
-#include <cstdio>
-#include <memory>
-
+
+#include <cstdio>
+#include <memory>
+
namespace NYsonPull {
namespace NDetail {
namespace NInput {
class TStdioFile: public TBuffered {
FILE* file_;
-
+
public:
TStdioFile(FILE* file, size_t buffer_size)
: TBuffered(buffer_size)
, file_{file} {
}
-
+
protected:
result do_fill_buffer() override {
auto nread = ::fread(buffer_data(), 1, buffer_size(), file_);
- if (Y_UNLIKELY(nread == 0)) {
- if (ferror(file_)) {
+ if (Y_UNLIKELY(nread == 0)) {
+ if (ferror(file_)) {
throw NException::TSystemError();
}
- if (feof(file_)) {
+ if (feof(file_)) {
return result::at_end;
}
}
@@ -37,6 +37,6 @@ namespace NYsonPull {
return result::have_more_data;
}
};
- }
+ }
} // namespace NDetail
}
diff --git a/library/cpp/yson_pull/detail/input/stream.h b/library/cpp/yson_pull/detail/input/stream.h
index 791cd5a3f5..5ed993f606 100644
--- a/library/cpp/yson_pull/detail/input/stream.h
+++ b/library/cpp/yson_pull/detail/input/stream.h
@@ -1,69 +1,69 @@
-#pragma once
-
+#pragma once
+
#include <library/cpp/yson_pull/detail/macros.h>
-
+
#include <library/cpp/yson_pull/input.h>
-
-#include <util/stream/buffered.h>
-#include <util/stream/file.h>
-#include <util/stream/zerocopy.h>
-#include <util/system/file.h>
-
-namespace NYsonPull {
- namespace NDetail {
- namespace NInput {
- class TStreamBase: public NYsonPull::NInput::IStream {
- protected:
+
+#include <util/stream/buffered.h>
+#include <util/stream/file.h>
+#include <util/stream/zerocopy.h>
+#include <util/system/file.h>
+
+namespace NYsonPull {
+ namespace NDetail {
+ namespace NInput {
+ class TStreamBase: public NYsonPull::NInput::IStream {
+ protected:
result DoFillBufferFrom(IZeroCopyInput& input) {
- void* ptr = nullptr;
- size_t size = input.Next(&ptr);
- if (Y_UNLIKELY(size == 0)) {
- return result::at_end;
- }
- buffer().reset(static_cast<ui8*>(ptr), static_cast<ui8*>(ptr) + size);
- return result::have_more_data;
- }
- };
-
- class TZeroCopy: public TStreamBase {
+ void* ptr = nullptr;
+ size_t size = input.Next(&ptr);
+ if (Y_UNLIKELY(size == 0)) {
+ return result::at_end;
+ }
+ buffer().reset(static_cast<ui8*>(ptr), static_cast<ui8*>(ptr) + size);
+ return result::have_more_data;
+ }
+ };
+
+ class TZeroCopy: public TStreamBase {
IZeroCopyInput* Input;
-
- public:
+
+ public:
explicit TZeroCopy(IZeroCopyInput* input)
- : Input(input)
- {
- }
-
- protected:
- result do_fill_buffer() override {
- return DoFillBufferFrom(*Input);
- }
- };
-
+ : Input(input)
+ {
+ }
+
+ protected:
+ result do_fill_buffer() override {
+ return DoFillBufferFrom(*Input);
+ }
+ };
+
template <typename TBuffered>
- class TOwned: public TStreamBase {
- TBuffered Input;
-
- public:
+ class TOwned: public TStreamBase {
+ TBuffered Input;
+
+ public:
template <typename... Args>
- explicit TOwned(Args&&... args)
- : Input(std::forward<Args>(args)...)
- {
- }
-
- protected:
- result do_fill_buffer() override {
- return DoFillBufferFrom(Input);
- }
- };
-
+ explicit TOwned(Args&&... args)
+ : Input(std::forward<Args>(args)...)
+ {
+ }
+
+ protected:
+ result do_fill_buffer() override {
+ return DoFillBufferFrom(Input);
+ }
+ };
+
class TFHandle: public TOwned<TFileInput> {
- public:
- TFHandle(int fd, size_t buffer_size)
+ public:
+ TFHandle(int fd, size_t buffer_size)
: TOwned<TFileInput>(Duplicate(fd), buffer_size)
- {
- }
- };
- }
+ {
+ }
+ };
+ }
} // namespace NDetail
}
diff --git a/library/cpp/yson_pull/detail/lexer_base.h b/library/cpp/yson_pull/detail/lexer_base.h
index 572bdb3d18..20919e496a 100644
--- a/library/cpp/yson_pull/detail/lexer_base.h
+++ b/library/cpp/yson_pull/detail/lexer_base.h
@@ -1,27 +1,27 @@
-#pragma once
-
-#include "byte_reader.h"
-#include "cescape.h"
-#include "macros.h"
-#include "number.h"
+#pragma once
+
+#include "byte_reader.h"
+#include "cescape.h"
+#include "macros.h"
+#include "number.h"
#include "percent_scalar.h"
-#include "stream_counter.h"
-#include "varint.h"
-
-#include <util/generic/maybe.h>
-#include <util/generic/vector.h>
-#include <util/string/cast.h>
-
+#include "stream_counter.h"
+#include "varint.h"
+
+#include <util/generic/maybe.h>
+#include <util/generic/vector.h>
+#include <util/string/cast.h>
+
namespace NYsonPull {
namespace NDetail {
template <bool EnableLinePositionInfo>
class lexer_base: public byte_reader<stream_counter<EnableLinePositionInfo>> {
using Base = byte_reader<
stream_counter<EnableLinePositionInfo>>;
-
+
TVector<ui8> token_buffer_;
TMaybe<size_t> memory_limit_;
-
+
public:
lexer_base(
NYsonPull::NInput::IStream& buffer,
@@ -29,28 +29,28 @@ namespace NYsonPull {
: Base(buffer)
, memory_limit_{memory_limit} {
}
-
+
ATTRIBUTE(noinline, hot)
ui8 skip_space_and_get_byte() {
auto& buf = Base::stream().buffer();
- if (Y_LIKELY(!buf.is_empty())) {
+ if (Y_LIKELY(!buf.is_empty())) {
auto ch = *buf.pos();
- if (Y_LIKELY(!is_space(ch))) {
+ if (Y_LIKELY(!is_space(ch))) {
return ch;
}
}
return skip_space_and_get_byte_fallback();
}
-
+
ATTRIBUTE(hot)
ui8 get_byte() {
auto& buf = Base::stream().buffer();
- if (Y_LIKELY(!buf.is_empty())) {
+ if (Y_LIKELY(!buf.is_empty())) {
return *buf.pos();
}
return Base::get_byte();
- }
-
+ }
+
number read_numeric() {
token_buffer_.clear();
auto type = number_type::int64;
@@ -64,7 +64,7 @@ namespace NYsonPull {
} else if (ch == 'u') {
token_buffer_.push_back(ch);
type = number_type::uint64;
- } else if (Y_UNLIKELY(isalpha(ch))) {
+ } else if (Y_UNLIKELY(isalpha(ch))) {
COLD_BLOCK_BYVALUE
Base::fail("Unexpected ", NCEscape::quote(ch), " in numeric literal");
COLD_BLOCK_END
@@ -74,7 +74,7 @@ namespace NYsonPull {
check_memory_limit();
Base::advance(1);
}
-
+
auto str = token_buffer();
try {
switch (type) {
@@ -86,12 +86,12 @@ namespace NYsonPull {
str.Chop(1); // 'u' suffix
return FromString<ui64>(str);
}
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
} catch (const std::exception& err) {
Base::fail(err.what());
}
- }
-
+ }
+
TStringBuf read_quoted_string() {
auto count_trailing_slashes = [](ui8* begin, ui8* end) {
auto count = size_t{0};
@@ -102,7 +102,7 @@ namespace NYsonPull {
}
return count;
};
-
+
token_buffer_.clear();
auto& buf = Base::stream().buffer();
while (true) {
@@ -135,12 +135,12 @@ namespace NYsonPull {
token_buffer_.push_back('"');
}
check_memory_limit();
- }
+ }
NCEscape::decode_inplace(token_buffer_);
return token_buffer();
- }
-
+ }
+
TStringBuf read_unquoted_string() {
token_buffer_.clear();
while (true) {
@@ -155,20 +155,20 @@ namespace NYsonPull {
Base::advance(1);
}
return token_buffer();
- }
-
+ }
+
ATTRIBUTE(noinline, hot)
TStringBuf read_binary_string() {
auto slength = NVarInt::read<i32>(*this);
- if (Y_UNLIKELY(slength < 0)) {
+ if (Y_UNLIKELY(slength < 0)) {
COLD_BLOCK_BYVALUE
Base::fail("Negative binary string literal length ", slength);
COLD_BLOCK_END
}
auto length = static_cast<ui32>(slength);
-
+
auto& buf = Base::stream().buffer();
- if (Y_LIKELY(buf.available() >= length)) {
+ if (Y_LIKELY(buf.available() >= length)) {
auto result = TStringBuf{
reinterpret_cast<const char*>(buf.pos()),
length};
@@ -177,8 +177,8 @@ namespace NYsonPull {
} else { // reading in Buffer
return read_binary_string_fallback(length);
}
- }
-
+ }
+
ATTRIBUTE(noinline)
TStringBuf read_binary_string_fallback(size_t length) {
auto& buf = Base::stream().buffer();
@@ -187,7 +187,7 @@ namespace NYsonPull {
while (needToRead) {
this->Base::template fill_buffer<false>();
auto chunk_size = std::min(needToRead, buf.available());
-
+
token_buffer_.insert(
token_buffer_.end(),
buf.pos(),
@@ -197,26 +197,26 @@ namespace NYsonPull {
Base::advance(chunk_size);
}
return token_buffer();
- }
-
+ }
+
percent_scalar read_percent_scalar() {
auto throw_incorrect_percent_scalar = [&]() {
Base::fail("Incorrect %-literal prefix ", NCEscape::quote(token_buffer()));
};
-
+
auto assert_literal = [&](TStringBuf literal) -> void {
for (size_t i = 2; i < literal.size(); ++i) {
token_buffer_.push_back(this->Base::template get_byte<false>());
Base::advance(1);
- if (Y_UNLIKELY(token_buffer_.back() != literal[i])) {
+ if (Y_UNLIKELY(token_buffer_.back() != literal[i])) {
throw_incorrect_percent_scalar();
}
}
};
-
+
token_buffer_.clear();
token_buffer_.push_back(this->Base::template get_byte<false>());
- Base::advance(1);
+ Base::advance(1);
switch (token_buffer_[0]) {
case 't':
@@ -236,32 +236,32 @@ namespace NYsonPull {
return percent_scalar(-std::numeric_limits<double>::infinity());
default:
throw_incorrect_percent_scalar();
- }
-
- Y_UNREACHABLE();
- }
+ }
+ Y_UNREACHABLE();
+ }
+
i64 read_binary_int64() {
return NVarInt::read<i64>(*this);
}
-
+
ui64 read_binary_uint64() {
return NVarInt::read<ui64>(*this);
}
-
+
double read_binary_double() {
union {
double as_double;
ui8 as_bytes[sizeof(double)];
} data;
static_assert(sizeof(data) == sizeof(double), "bad union size");
-
+
auto needToRead = sizeof(double);
-
+
auto& buf = Base::stream().buffer();
while (needToRead != 0) {
Base::fill_buffer();
-
+
auto chunk_size = std::min(needToRead, buf.available());
if (chunk_size == 0) {
Base::fail("Error parsing binary double literal");
@@ -274,8 +274,8 @@ namespace NYsonPull {
Base::advance(chunk_size);
}
return data.as_double;
- }
-
+ }
+
private:
static bool is_space(ui8 ch) {
static const ui8 lookupTable[] =
@@ -284,24 +284,24 @@ namespace NYsonPull {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-
+
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
return lookupTable[ch];
}
-
+
ATTRIBUTE(noinline, cold)
ui8 skip_space_and_get_byte_fallback() {
auto& buf = Base::stream().buffer();
@@ -318,12 +318,12 @@ namespace NYsonPull {
}
Base::advance(1);
}
- }
+ }
return Base::get_byte();
}
void check_memory_limit() {
- if (Y_UNLIKELY(memory_limit_ && token_buffer_.capacity() > *memory_limit_)) {
+ if (Y_UNLIKELY(memory_limit_ && token_buffer_.capacity() > *memory_limit_)) {
COLD_BLOCK_BYVALUE
Base::fail(
"Memory limit exceeded while parsing YSON stream: "
@@ -331,13 +331,13 @@ namespace NYsonPull {
token_buffer_.capacity(),
", limit ", *memory_limit_);
COLD_BLOCK_END
- }
- }
-
+ }
+ }
+
TStringBuf token_buffer() const {
auto* begin = reinterpret_cast<const char*>(token_buffer_.data());
return {begin, token_buffer_.size()};
}
};
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/macros.h b/library/cpp/yson_pull/detail/macros.h
index 7243f9cfe1..8d9707c351 100644
--- a/library/cpp/yson_pull/detail/macros.h
+++ b/library/cpp/yson_pull/detail/macros.h
@@ -1,24 +1,24 @@
-#pragma once
-
-#include <util/system/compiler.h>
-
-#if defined(__GNUC__)
-#define ATTRIBUTE(args...) __attribute__((args))
-#else
-#define ATTRIBUTE(...)
-#endif
-
-#if defined(__GNUC__) && !defined(__clang__)
+#pragma once
+
+#include <util/system/compiler.h>
+
+#if defined(__GNUC__)
+#define ATTRIBUTE(args...) __attribute__((args))
+#else
+#define ATTRIBUTE(...)
+#endif
+
+#if defined(__GNUC__) && !defined(__clang__)
#define COLD_BLOCK_BYVALUE [=]() ATTRIBUTE(noinline, cold) {
#define COLD_BLOCK_BYREF [&]() ATTRIBUTE(noinline, cold) {
#define COLD_BLOCK_END \
} \
();
-#else
-// Clang does not support gnu-style attributes on lambda functions yet
+#else
+// Clang does not support gnu-style attributes on lambda functions yet
#define COLD_BLOCK_BYVALUE [=]() {
#define COLD_BLOCK_BYREF [&]() {
#define COLD_BLOCK_END \
} \
();
-#endif
+#endif
diff --git a/library/cpp/yson_pull/detail/number.h b/library/cpp/yson_pull/detail/number.h
index 5595f55e05..0dc442e3d2 100644
--- a/library/cpp/yson_pull/detail/number.h
+++ b/library/cpp/yson_pull/detail/number.h
@@ -1,7 +1,7 @@
-#pragma once
-
+#pragma once
+
#include <util/system/types.h>
-
+
namespace NYsonPull {
namespace NDetail {
enum class number_type {
@@ -9,7 +9,7 @@ namespace NYsonPull {
uint64,
int64
};
-
+
struct number {
number_type type;
union {
@@ -17,21 +17,21 @@ namespace NYsonPull {
ui64 as_uint64;
i64 as_int64;
} value;
-
+
number(double v) {
type = number_type::float64;
value.as_float64 = v;
}
-
+
number(i64 v) {
type = number_type::int64;
value.as_int64 = v;
}
-
+
number(ui64 v) {
type = number_type::uint64;
value.as_uint64 = v;
}
};
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/output/buffered.h b/library/cpp/yson_pull/detail/output/buffered.h
index 475cf34785..fbb18b5467 100644
--- a/library/cpp/yson_pull/detail/output/buffered.h
+++ b/library/cpp/yson_pull/detail/output/buffered.h
@@ -1,11 +1,11 @@
-#pragma once
-
+#pragma once
+
#include <library/cpp/yson_pull/detail/macros.h>
-
+
#include <library/cpp/yson_pull/output.h>
-
-#include <util/generic/strbuf.h>
-
+
+#include <util/generic/strbuf.h>
+
namespace NYsonPull {
namespace NDetail {
namespace NOutput {
@@ -13,29 +13,29 @@ namespace NYsonPull {
class TBuffered: public NYsonPull::NOutput::IStream {
TArrayHolder<ui8> buffer_;
size_t size_;
-
+
public:
TBuffered(size_t buffer_size)
: buffer_{new ui8[buffer_size]}
, size_{buffer_size} {
reset_buffer();
}
-
+
protected:
void do_flush_buffer(TStringBuf extra) override {
auto& buf = buffer();
if (!buf.is_empty()) {
- do_write({reinterpret_cast<const char*>(buf.begin()), buf.used()});
+ do_write({reinterpret_cast<const char*>(buf.begin()), buf.used()});
reset_buffer();
}
if (extra.size() >= buf.available()) {
do_write(extra);
- } else if (extra.size() > 0) {
+ } else if (extra.size() > 0) {
::memcpy(buf.pos(), extra.data(), extra.size());
buf.advance(extra.size());
}
}
-
+
private:
void do_write(TStringBuf data) {
// CRTP dispatch
@@ -46,6 +46,6 @@ namespace NYsonPull {
buffer().reset(buffer_.Get(), buffer_.Get() + size_);
}
};
- }
+ }
} // namespace NDetail
}
diff --git a/library/cpp/yson_pull/detail/output/stdio_file.h b/library/cpp/yson_pull/detail/output/stdio_file.h
index 03f2b40dc5..d59ea6bfb9 100644
--- a/library/cpp/yson_pull/detail/output/stdio_file.h
+++ b/library/cpp/yson_pull/detail/output/stdio_file.h
@@ -1,33 +1,33 @@
-#pragma once
-
-#include "buffered.h"
-
+#pragma once
+
+#include "buffered.h"
+
#include <library/cpp/yson_pull/detail/macros.h>
-
+
#include <library/cpp/yson_pull/exceptions.h>
-
-#include <cstdio>
-
+
+#include <cstdio>
+
namespace NYsonPull {
namespace NDetail {
namespace NOutput {
class TStdioFile: public TBuffered<TStdioFile> {
FILE* file_;
-
+
public:
TStdioFile(FILE* file, size_t buffer_size)
: TBuffered<TStdioFile>(buffer_size)
, file_(file)
{
}
-
+
void write(TStringBuf data) {
auto nwritten = ::fwrite(data.data(), 1, data.size(), file_);
- if (Y_UNLIKELY(static_cast<size_t>(nwritten) != data.size())) {
+ if (Y_UNLIKELY(static_cast<size_t>(nwritten) != data.size())) {
throw NException::TSystemError();
}
}
};
- }
+ }
} // namespace NDetail
}
diff --git a/library/cpp/yson_pull/detail/output/stream.h b/library/cpp/yson_pull/detail/output/stream.h
index d4810f3353..98ab7d9555 100644
--- a/library/cpp/yson_pull/detail/output/stream.h
+++ b/library/cpp/yson_pull/detail/output/stream.h
@@ -1,56 +1,56 @@
-#pragma once
-
-#include "buffered.h"
-
+#pragma once
+
+#include "buffered.h"
+
#include <library/cpp/yson_pull/detail/macros.h>
#include <library/cpp/yson_pull/exceptions.h>
-
-#include <util/stream/output.h>
-#include <util/stream/file.h>
-#include <util/system/file.h>
-
-namespace NYsonPull {
- namespace NDetail {
- namespace NOutput {
- class TStream: public TBuffered<TStream> {
+
+#include <util/stream/output.h>
+#include <util/stream/file.h>
+#include <util/system/file.h>
+
+namespace NYsonPull {
+ namespace NDetail {
+ namespace NOutput {
+ class TStream: public TBuffered<TStream> {
IOutputStream* Output;
-
- public:
+
+ public:
TStream(IOutputStream* output, size_t buffer_size)
- : TBuffered<TStream>(buffer_size)
- , Output(output)
- {
- }
-
- void write(TStringBuf data) {
- Output->Write(data);
- }
- };
-
+ : TBuffered<TStream>(buffer_size)
+ , Output(output)
+ {
+ }
+
+ void write(TStringBuf data) {
+ Output->Write(data);
+ }
+ };
+
template <typename TOutput>
- class TOwned: public TBuffered<TOwned<TOutput>> {
- TOutput Output;
-
- public:
+ class TOwned: public TBuffered<TOwned<TOutput>> {
+ TOutput Output;
+
+ public:
template <typename... Args>
- TOwned(size_t buffer_size, Args&&... args)
- : TBuffered<TOwned>(buffer_size)
- , Output(std::forward<Args>(args)...)
- {
- }
-
- void write(TStringBuf data) {
- Output.Write(data);
- }
- };
-
+ TOwned(size_t buffer_size, Args&&... args)
+ : TBuffered<TOwned>(buffer_size)
+ , Output(std::forward<Args>(args)...)
+ {
+ }
+
+ void write(TStringBuf data) {
+ Output.Write(data);
+ }
+ };
+
class TFHandle: public TOwned<TUnbufferedFileOutput> {
- public:
- TFHandle(int fd, size_t buffer_size)
+ public:
+ TFHandle(int fd, size_t buffer_size)
: TOwned<TUnbufferedFileOutput>(buffer_size, Duplicate(fd))
- {
- }
- };
- }
+ {
+ }
+ };
+ }
} // namespace NDetail
}
diff --git a/library/cpp/yson_pull/detail/reader.h b/library/cpp/yson_pull/detail/reader.h
index 0e02396358..4aa99e88e0 100644
--- a/library/cpp/yson_pull/detail/reader.h
+++ b/library/cpp/yson_pull/detail/reader.h
@@ -1,18 +1,18 @@
-#pragma once
-
-#include "lexer_base.h"
-#include "symbols.h"
-
+#pragma once
+
+#include "lexer_base.h"
+#include "symbols.h"
+
#include <library/cpp/yson_pull/reader.h>
-
-#include <util/generic/maybe.h>
-#include <util/generic/vector.h>
-
+
+#include <util/generic/maybe.h>
+#include <util/generic/vector.h>
+
namespace NYsonPull {
namespace NDetail {
/*! \internal */
////////////////////////////////////////////////////////////////////////////////
-
+
enum class special_token : ui8 {
// Special values:
// YSON
@@ -26,7 +26,7 @@ namespace NYsonPull {
left_angle = 7, // <
right_angle = 8, // >
};
-
+
// char_class tree representation:
// Root = xb
// BinaryStringOrOtherSpecialToken = x0b
@@ -48,7 +48,7 @@ namespace NYsonPull {
// Percent = 11011b
enum class char_class : ui8 {
binary_string = 0, // = 00b
-
+
special_token_mask = 2, // = 10b
semicolon = 2 + (0 << 2),
equals = 2 + (1 << 2),
@@ -59,14 +59,14 @@ namespace NYsonPull {
right_brace = 2 + (6 << 2),
left_angle = 2 + (7 << 2),
right_angle = 2 + (8 << 2),
-
+
binary_scalar_mask = 1,
binary_int64 = 1 + (0 << 2), // = 001b
binary_double = 1 + (1 << 2), // = 101b
binary_false = 1 + (2 << 2), // = 1001b
binary_true = 1 + (3 << 2), // = 1101b
binary_uint64 = 1 + (4 << 2), // = 10001b
-
+
other_mask = 3,
quote = 3 + (0 << 2), // = 00011b
number = 3 + (1 << 2), // = 00111b
@@ -74,30 +74,30 @@ namespace NYsonPull {
percent = 3 + (6 << 2), // = 11011b
none = 3 + (5 << 2), // = 10111b
};
-
+
#define CHAR_SUBCLASS(x) (static_cast<ui8>(x) >> 2)
-
+
inline char_class get_char_class(ui8 ch) {
-#define NN char_class::none
-#define BS char_class::binary_string
-#define BI char_class::binary_int64
-#define BD char_class::binary_double
-#define BF char_class::binary_false
-#define BT char_class::binary_true
-#define BU char_class::binary_uint64
-#define SP NN // char_class::space
-#define NB char_class::number
-#define ST char_class::string
-#define QU char_class::quote
-#define PC char_class::percent
-#define TT(name) (static_cast<char_class>( \
+#define NN char_class::none
+#define BS char_class::binary_string
+#define BI char_class::binary_int64
+#define BD char_class::binary_double
+#define BF char_class::binary_false
+#define BT char_class::binary_true
+#define BU char_class::binary_uint64
+#define SP NN // char_class::space
+#define NB char_class::number
+#define ST char_class::string
+#define QU char_class::quote
+#define PC char_class::percent
+#define TT(name) (static_cast<char_class>( \
(static_cast<ui8>(special_token::name) << 2) | static_cast<ui8>(char_class::special_token_mask)))
-
+
static constexpr char_class lookup[256] =
{
NN, BS, BI, BD, BF, BT, BU, NN, NN, SP, SP, SP, SP, SP, NN, NN,
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
-
+
// 32
SP, // ' '
NN, // '!'
@@ -115,7 +115,7 @@ namespace NYsonPull {
NB, // '-'
NN, // '.'
NN, // '/'
-
+
// 48
NB, NB, NB, NB, NB, NB, NB, NB, NB, NB, // '0' - '9'
NN, // ':'
@@ -124,7 +124,7 @@ namespace NYsonPull {
TT(equals), // '='
TT(right_angle), // '>'
NN, // '?'
-
+
// 64
NN, // '@'
ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, // 'A' - 'M'
@@ -134,10 +134,10 @@ namespace NYsonPull {
TT(right_bracket), // ']'
NN, // '^'
ST, // '_'
-
+
// 96
NN, // '`'
-
+
ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, // 'a' - 'm'
ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, // 'n' - 'z'
TT(left_brace), // '{'
@@ -150,24 +150,24 @@ namespace NYsonPull {
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
-
+
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN,
NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN, NN};
-
-#undef NN
-#undef BS
-#undef BI
-#undef BD
-#undef SP
-#undef NB
-#undef ST
-#undef QU
-#undef TT
+
+#undef NN
+#undef BS
+#undef BI
+#undef BD
+#undef SP
+#undef NB
+#undef ST
+#undef QU
+#undef TT
return lookup[ch];
}
-
+
template <bool EnableLinePositionInfo>
class gen_reader_impl {
enum class state {
@@ -177,20 +177,20 @@ namespace NYsonPull {
equals = 3, //! expecting '=' (followed by value)
value = 4, //! expecting a value
value_noattr = 5, //! expecting a value w/o attrs (after attrs)
-
+
// by design, rare states have numbers starting from first_rare_state
first_rare_state = 6,
before_begin = first_rare_state, //! before started reading the stream
before_end = first_rare_state + 1, //! Expecting end of stream
after_end = first_rare_state + 2, //! after end of stream
};
-
+
lexer_base<EnableLinePositionInfo> lexer_;
state state_;
TEvent event_;
TVector<EEventType> stack_;
EStreamType mode_;
-
+
public:
gen_reader_impl(
NYsonPull::NInput::IStream& buffer,
@@ -200,14 +200,14 @@ namespace NYsonPull {
, state_{state::before_begin}
, mode_{mode} {
}
-
+
const TEvent& last_event() const {
return event_;
}
-
+
ATTRIBUTE(hot)
const TEvent& next_event() {
- if (Y_LIKELY(state_ < state::first_rare_state)) {
+ if (Y_LIKELY(state_ < state::first_rare_state)) {
// 'hot' handler for in-stream events
next_event_hot();
} else {
@@ -216,15 +216,15 @@ namespace NYsonPull {
}
return event_;
}
-
+
private:
ATTRIBUTE(hot)
void next_event_hot() {
auto ch = lexer_.get_byte();
auto cls = get_char_class(ch);
- if (Y_UNLIKELY(cls == char_class::none)) {
+ if (Y_UNLIKELY(cls == char_class::none)) {
ch = lexer_.skip_space_and_get_byte();
- if (Y_UNLIKELY(ch == NSymbol::eof)) {
+ if (Y_UNLIKELY(ch == NSymbol::eof)) {
handle_eof();
return;
}
@@ -253,10 +253,10 @@ namespace NYsonPull {
state_delimiter(ch, cls);
break;
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
- }
-
+ }
+
ATTRIBUTE(noinline, cold)
void next_event_cold() {
switch (state_) {
@@ -269,22 +269,22 @@ namespace NYsonPull {
state_before_end();
break;
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
}
-
+
//! Present a scalar value for caller
template <typename T>
void yield(T value) {
event_ = TEvent{TScalar{value}};
}
-
+
//! Present a scalar value with non-scalar tag (i.e. key)
template <typename T>
void yield(EEventType type, T value) {
event_ = TEvent{type, TScalar{value}};
}
-
+
//! Present a value from number variant
void yield(const number& value) {
switch (value.type) {
@@ -299,7 +299,7 @@ namespace NYsonPull {
break;
}
}
-
+
//! Present a value from %-literal variant
void yield(const percent_scalar& value) {
switch (value.type) {
@@ -316,47 +316,47 @@ namespace NYsonPull {
void yield(EEventType type) {
event_ = TEvent{type};
}
-
+
//! Push the opening of a paired event
void push(EEventType type) {
stack_.push_back(type);
}
-
+
//! Close the paired_event, verify that delimiters are well-formed
void pop(EEventType first, EEventType last) {
- if (Y_UNLIKELY(stack_.empty() || stack_.back() != first)) {
+ if (Y_UNLIKELY(stack_.empty() || stack_.back() != first)) {
pop_fail(first, last);
return;
}
stack_.pop_back();
-
+
yield(last);
switch (first) {
- case EEventType::BeginList:
+ case EEventType::BeginList:
next(state::delimiter);
break;
-
- case EEventType::BeginMap:
+
+ case EEventType::BeginMap:
next(state::delimiter);
break;
-
- case EEventType::BeginAttributes:
+
+ case EEventType::BeginAttributes:
next(state::value_noattr);
break;
-
- case EEventType::BeginStream:
+
+ case EEventType::BeginStream:
next(state::after_end);
break;
-
+
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
-
- if (Y_UNLIKELY(mode_ == EStreamType::Node && stack_.size() == 1 && state_ == state::delimiter)) {
+
+ if (Y_UNLIKELY(mode_ == EStreamType::Node && stack_.size() == 1 && state_ == state::delimiter)) {
next(state::before_end);
}
}
-
+
ATTRIBUTE(noinline, cold)
void pop_fail(EEventType first, EEventType last) {
if (stack_.empty()) {
@@ -365,16 +365,16 @@ namespace NYsonPull {
lexer_.fail("Unpaired events: expected opening '", first, "' for '", last, "', but '", stack_.back(), "' is found.");
}
}
-
+
//! Transition to new_state
void next(state new_state) {
state_ = new_state;
}
-
+
bool in_map() {
- return (stack_.back() == EEventType::BeginMap) || (stack_.back() == EEventType::BeginAttributes) || (stack_.back() == EEventType::BeginStream && mode_ == EStreamType::MapFragment);
+ return (stack_.back() == EEventType::BeginMap) || (stack_.back() == EEventType::BeginAttributes) || (stack_.back() == EEventType::BeginStream && mode_ == EStreamType::MapFragment);
}
-
+
ATTRIBUTE(noinline, cold)
void handle_eof() {
switch (state_) {
@@ -382,18 +382,18 @@ namespace NYsonPull {
case state::maybe_key:
case state::delimiter:
case state::before_end:
- pop(EEventType::BeginStream, EEventType::EndStream);
+ pop(EEventType::BeginStream, EEventType::EndStream);
return;
-
+
default:
lexer_.fail("Unexpected end of stream");
}
}
-
+
ATTRIBUTE(noinline, cold)
void state_before_begin() {
- push(EEventType::BeginStream);
- yield(EEventType::BeginStream);
+ push(EEventType::BeginStream);
+ yield(EEventType::BeginStream);
switch (mode_) {
case EStreamType::Node:
next(state::value);
@@ -405,10 +405,10 @@ namespace NYsonPull {
next(state::maybe_key);
break;
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
}
-
+
ATTRIBUTE(noinline, cold)
void state_before_end() {
auto ch = lexer_.skip_space_and_get_byte();
@@ -418,10 +418,10 @@ namespace NYsonPull {
lexer_.fail("Expected stream end, but found ", NCEscape::quote(ch));
}
}
-
+
ATTRIBUTE(hot)
void state_delimiter(ui8 ch, char_class cls) {
- if (Y_LIKELY(ch == NSymbol::item_separator)) {
+ if (Y_LIKELY(ch == NSymbol::item_separator)) {
lexer_.advance(1);
next(in_map() ? state::maybe_key : state::maybe_value);
// immediately read next value
@@ -430,7 +430,7 @@ namespace NYsonPull {
}
state_delimiter_fallback(ch, cls);
}
-
+
ATTRIBUTE(noinline, hot)
void state_delimiter_fallback(ui8 ch, char_class cls) {
auto cls_bits = static_cast<ui8>(cls);
@@ -439,24 +439,24 @@ namespace NYsonPull {
lexer_.advance(1);
switch (token) {
/* // handled in the fast track
- case special_token::semicolon:
- next(in_map()? state::maybe_key : state::maybe_value);
- // immediately read next value
- return next_event();
- */
-
+ case special_token::semicolon:
+ next(in_map()? state::maybe_key : state::maybe_value);
+ // immediately read next value
+ return next_event();
+ */
+
case special_token::right_bracket:
- pop(EEventType::BeginList, EEventType::EndList);
+ pop(EEventType::BeginList, EEventType::EndList);
return;
-
+
case special_token::right_brace:
- pop(EEventType::BeginMap, EEventType::EndMap);
+ pop(EEventType::BeginMap, EEventType::EndMap);
return;
-
+
case special_token::right_angle:
- pop(EEventType::BeginAttributes, EEventType::EndAttributes);
+ pop(EEventType::BeginAttributes, EEventType::EndAttributes);
return;
-
+
default:
break;
}
@@ -470,14 +470,14 @@ namespace NYsonPull {
NCEscape::quote(NSymbol::end_map), ", ",
NCEscape::quote(NSymbol::end_attributes));
COLD_BLOCK_END
- }
-
+ }
+
ATTRIBUTE(noinline, hot)
void state_maybe_key(ui8 ch, char_class cls) {
auto key = TStringBuf{};
// Keys are always strings, put binary-string key into fast lane
- if (Y_LIKELY(ch == NSymbol::string_marker)) {
- lexer_.advance(1);
+ if (Y_LIKELY(ch == NSymbol::string_marker)) {
+ lexer_.advance(1);
key = lexer_.read_binary_string();
} else {
switch (cls) {
@@ -485,21 +485,21 @@ namespace NYsonPull {
lexer_.advance(1);
key = lexer_.read_quoted_string();
break;
-
+
case char_class::string:
key = lexer_.read_unquoted_string();
break;
-
+
case char_class::right_brace:
lexer_.advance(1);
- pop(EEventType::BeginMap, EEventType::EndMap);
+ pop(EEventType::BeginMap, EEventType::EndMap);
return;
-
+
case char_class::right_angle:
lexer_.advance(1);
- pop(EEventType::BeginAttributes, EEventType::EndAttributes);
+ pop(EEventType::BeginAttributes, EEventType::EndAttributes);
return;
-
+
default:
COLD_BLOCK_BYVALUE
lexer_.fail("Unexpected ", NCEscape::quote(ch), ", expected key string");
@@ -507,25 +507,25 @@ namespace NYsonPull {
}
}
- yield(EEventType::Key, key);
+ yield(EEventType::Key, key);
next(state::equals);
}
ATTRIBUTE(hot)
void state_equals(ui8 ch) {
// skip '='
- if (Y_UNLIKELY(ch != NSymbol::key_value_separator)) {
- COLD_BLOCK_BYVALUE
+ if (Y_UNLIKELY(ch != NSymbol::key_value_separator)) {
+ COLD_BLOCK_BYVALUE
lexer_.fail("Unexpected ", NCEscape::quote(ch), ", expected ", NCEscape::quote(NSymbol::key_value_separator));
- COLD_BLOCK_END
+ COLD_BLOCK_END
}
lexer_.advance(1);
next(state::value);
// immediately read the following value
// (this symbol yields no result)
next_event_hot();
- }
-
+ }
+
ATTRIBUTE(noinline, hot)
void state_value(ui8 ch, char_class cls) {
auto cls_bits = static_cast<ui8>(cls);
@@ -549,7 +549,7 @@ namespace NYsonPull {
}
}
}
-
+
ATTRIBUTE(noinline)
void state_value_special(special_token token, ui8 ch) {
// Value starters are always accepted values
@@ -558,37 +558,37 @@ namespace NYsonPull {
yield(TScalar{});
next(state::delimiter);
return;
-
+
case special_token::left_bracket:
- push(EEventType::BeginList);
- yield(EEventType::BeginList);
+ push(EEventType::BeginList);
+ yield(EEventType::BeginList);
next(state::maybe_value);
return;
-
+
case special_token::left_brace:
- push(EEventType::BeginMap);
- yield(EEventType::BeginMap);
+ push(EEventType::BeginMap);
+ yield(EEventType::BeginMap);
next(state::maybe_key);
return;
-
+
default:
break;
}
-
+
// ...closing-chars are only allowed in maybe_value state
if (state_ == state::maybe_value) {
switch (token) {
case special_token::right_bracket:
- pop(EEventType::BeginList, EEventType::EndList);
+ pop(EEventType::BeginList, EEventType::EndList);
return;
-
+
case special_token::right_brace:
- pop(EEventType::BeginMap, EEventType::EndMap);
+ pop(EEventType::BeginMap, EEventType::EndMap);
return;
-
+
// right_angle is impossible in maybe_value state
// (only in delimiter, maybe_key)
-
+
default:
break;
}
@@ -596,17 +596,17 @@ namespace NYsonPull {
// attributes are not allowed after attributes (thus, value_noattr state)
if (state_ != state::value_noattr && token == special_token::left_angle) {
- push(EEventType::BeginAttributes);
- yield(EEventType::BeginAttributes);
+ push(EEventType::BeginAttributes);
+ yield(EEventType::BeginAttributes);
next(state::maybe_key);
- return;
+ return;
}
-
+
COLD_BLOCK_BYVALUE
lexer_.fail("Unexpected ", NCEscape::quote(ch));
COLD_BLOCK_END
- }
-
+ }
+
ATTRIBUTE(hot)
void state_value_binary_scalar(char_class cls) {
lexer_.advance(1);
@@ -614,28 +614,28 @@ namespace NYsonPull {
case char_class::binary_double:
yield(lexer_.read_binary_double());
break;
-
+
case char_class::binary_int64:
yield(lexer_.read_binary_int64());
break;
-
+
case char_class::binary_uint64:
yield(lexer_.read_binary_uint64());
break;
-
+
case char_class::binary_false:
yield(false);
break;
-
+
case char_class::binary_true:
yield(true);
break;
-
+
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
}
-
+
ATTRIBUTE(noinline)
void state_value_text_scalar(char_class cls) {
switch (cls) {
@@ -643,20 +643,20 @@ namespace NYsonPull {
lexer_.advance(1);
yield(lexer_.read_quoted_string());
break;
-
+
case char_class::number:
yield(lexer_.read_numeric());
break;
-
+
case char_class::string:
yield(lexer_.read_unquoted_string());
break;
-
+
case char_class::percent:
lexer_.advance(1);
yield(lexer_.read_percent_scalar());
break;
-
+
case char_class::none:
COLD_BLOCK_BYVALUE
lexer_.fail("Invalid yson value.");
@@ -664,14 +664,14 @@ namespace NYsonPull {
break;
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
}
};
-
+
class reader_impl: public gen_reader_impl<false> {
public:
using gen_reader_impl<false>::gen_reader_impl;
};
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/stream_counter.h b/library/cpp/yson_pull/detail/stream_counter.h
index 3b41b27eb6..c96698d091 100644
--- a/library/cpp/yson_pull/detail/stream_counter.h
+++ b/library/cpp/yson_pull/detail/stream_counter.h
@@ -1,26 +1,26 @@
-#pragma once
-
+#pragma once
+
#include <library/cpp/yson_pull/position_info.h>
-
-#include <cstddef>
-
+
+#include <cstddef>
+
namespace NYsonPull {
namespace NDetail {
template <bool EnableLinePositionInfo>
class stream_counter;
-
+
template <>
class stream_counter<true> {
private:
size_t offset_ = 0;
size_t line_ = 1;
size_t column_ = 1;
-
+
public:
TPositionInfo info() const {
return {offset_, line_, column_};
}
-
+
void update(const ui8* begin, const ui8* end) {
offset_ += end - begin;
for (auto current = begin; current != end; ++current) {
@@ -30,22 +30,22 @@ namespace NYsonPull {
column_ = 1;
}
}
- }
+ }
};
-
+
template <>
class stream_counter<false> {
private:
size_t offset_ = 0;
-
+
public:
TPositionInfo info() const {
return {offset_, {}, {}};
}
-
+
void update(const ui8* begin, const ui8* end) {
offset_ += end - begin;
}
};
- }
+ }
}
diff --git a/library/cpp/yson_pull/detail/symbols.h b/library/cpp/yson_pull/detail/symbols.h
index fe94bb9c41..be49f80695 100644
--- a/library/cpp/yson_pull/detail/symbols.h
+++ b/library/cpp/yson_pull/detail/symbols.h
@@ -1,38 +1,38 @@
-#pragma once
-
-#include <util/generic/strbuf.h>
+#pragma once
+
+#include <util/generic/strbuf.h>
#include <util/system/types.h>
-
+
namespace NYsonPull {
namespace NDetail {
namespace NSymbol {
#define SYM(name, value) constexpr ui8 name = value
-
+
//! Indicates the beginning of a list.
SYM(begin_list, '[');
//! Indicates the end of a list.
SYM(end_list, ']');
-
+
//! Indicates the beginning of a map.
SYM(begin_map, '{');
//! Indicates the end of a map.
SYM(end_map, '}');
-
+
//! Indicates the beginning of an attribute map.
SYM(begin_attributes, '<');
//! Indicates the end of an attribute map.
SYM(end_attributes, '>');
-
+
//! Separates items in lists and pairs in maps or attribute maps.
SYM(item_separator, ';');
//! Separates keys from values in maps and attribute maps.
SYM(key_value_separator, '=');
-
+
//! Indicates an entity.
SYM(entity, '#');
//! Indicates end of stream.
SYM(eof, '\0');
-
+
//! Marks the beginning of a binary string literal.
SYM(string_marker, '\x01');
//! Marks the beginning of a binary int64 literal.
@@ -45,11 +45,11 @@ namespace NYsonPull {
SYM(false_marker, '\x04');
//! Marks a binary `true' boolean value.
SYM(true_marker, '\x05');
-
+
//! Text string quote symbol
SYM(quote, '"');
-
-#undef SYM
+
+#undef SYM
}
}
}
diff --git a/library/cpp/yson_pull/detail/traits.h b/library/cpp/yson_pull/detail/traits.h
index 869a3b9c44..0d1ab6f660 100644
--- a/library/cpp/yson_pull/detail/traits.h
+++ b/library/cpp/yson_pull/detail/traits.h
@@ -1,7 +1,7 @@
-#pragma once
-
-#include <type_traits>
-
+#pragma once
+
+#include <type_traits>
+
namespace NYsonPull {
namespace NDetail {
namespace NTraits {
@@ -9,17 +9,17 @@ namespace NYsonPull {
using if_signed = typename std::enable_if<
std::is_signed<T>::value,
U>::type;
-
+
template <typename T, typename U>
using if_unsigned = typename std::enable_if<
std::is_unsigned<T>::value,
U>::type;
-
+
template <typename T>
using to_unsigned = typename std::enable_if<
std::is_signed<T>::value,
typename std::make_unsigned<T>::type>::type;
-
+
template <typename T>
using to_signed = typename std::enable_if<
std::is_unsigned<T>::value,
diff --git a/library/cpp/yson_pull/detail/varint.h b/library/cpp/yson_pull/detail/varint.h
index 38bf45d925..6426238d75 100644
--- a/library/cpp/yson_pull/detail/varint.h
+++ b/library/cpp/yson_pull/detail/varint.h
@@ -1,15 +1,15 @@
-#pragma once
-
-#include "byte_reader.h"
-#include "byte_writer.h"
-#include "traits.h"
-#include "zigzag.h"
-
-#include <util/system/types.h>
-
-#include <cstddef>
-#include <type_traits>
-
+#pragma once
+
+#include "byte_reader.h"
+#include "byte_writer.h"
+#include "traits.h"
+#include "zigzag.h"
+
+#include <util/system/types.h>
+
+#include <cstddef>
+#include <type_traits>
+
namespace NYsonPull {
namespace NDetail {
namespace NVarInt {
@@ -18,7 +18,7 @@ namespace NYsonPull {
constexpr inline size_t max_size() {
return (8 * sizeof(T) - 1) / 7 + 1;
}
-
+
template <typename T>
inline size_t write(ui64 value, T&& consume) {
auto stop = false;
@@ -35,17 +35,17 @@ namespace NYsonPull {
}
return nwritten;
}
-
+
template <typename U>
inline bool read_fast(byte_reader<U>& reader, ui64* value) {
auto& buf = reader.stream().buffer();
auto* ptr = buf.pos();
ui32 b;
-
+
// Splitting into 32-bit pieces gives better performance on 32-bit
// processors.
ui32 part0 = 0, part1 = 0, part2 = 0;
-
+
b = *(ptr++);
part0 = (b & 0x7F);
if (!(b & 0x80))
@@ -86,17 +86,17 @@ namespace NYsonPull {
part2 |= (b & 0x7F) << 7;
if (!(b & 0x80))
goto done;
-
+
// We have overrun the maximum size of a Varint (10 bytes). The data
// must be corrupt.
return false;
-
+
done:
reader.advance(ptr - buf.pos());
*value = (static_cast<ui64>(part0)) | (static_cast<ui64>(part1) << 28) | (static_cast<ui64>(part2) << 56);
return true;
}
-
+
template <typename U>
inline bool read_fast(byte_reader<U>& reader, ui32* value) {
// Fast path: We have enough bytes left in the buffer to guarantee that
@@ -105,7 +105,7 @@ namespace NYsonPull {
auto* ptr = buf.pos();
ui32 b;
ui32 result;
-
+
b = *(ptr++);
result = (b & 0x7F);
if (!(b & 0x80))
@@ -126,37 +126,37 @@ namespace NYsonPull {
result |= b << 28;
if (!(b & 0x80))
goto done;
-
+
// FIXME
// If the input is larger than 32 bits, we still need to read it all
// and discard the high-order bits.
-
+
for (size_t i = 0; i < max_size<ui64>() - max_size<ui32>(); i++) {
b = *(ptr++);
if (!(b & 0x80))
goto done;
}
-
+
// We have overrun the maximum size of a Varint (10 bytes). Assume
// the data is corrupt.
return false;
-
+
done:
reader.advance(ptr - buf.pos());
*value = result;
return true;
}
-
+
template <typename U>
inline bool read_slow(byte_reader<U>& reader, ui64* value) {
// Slow path: This read might cross the end of the buffer, so we
// need to check and refresh the buffer if and when it does.
-
+
auto& buf = reader.stream().buffer();
ui64 result = 0;
int count = 0;
ui32 b;
-
+
do {
if (count == max_size<ui64>()) {
return false;
@@ -170,11 +170,11 @@ namespace NYsonPull {
reader.advance(1);
++count;
} while (b & 0x80);
-
+
*value = result;
return true;
}
-
+
template <typename U>
inline bool read_slow(byte_reader<U>& reader, ui32* value) {
ui64 result;
@@ -183,18 +183,18 @@ namespace NYsonPull {
*value = static_cast<ui32>(result);
return true;
}
-
+
return false;
}
-
+
// Following functions is an adaptation
// of Protobuf code from coded_stream.cc
template <typename T, typename U>
inline bool read_dispatch(byte_reader<U>& reader, T* value) {
auto& buf = reader.stream().buffer();
- // NOTE: checking for 64-bit max_size(), since 32-bit
- // read_fast() might fallback to 64-bit reading
- if (buf.available() >= max_size<ui64>() ||
+ // NOTE: checking for 64-bit max_size(), since 32-bit
+ // read_fast() might fallback to 64-bit reading
+ if (buf.available() >= max_size<ui64>() ||
// Optimization: If the Varint ends at exactly the end of the buffer,
// we can detect that and still use the fast path.
(!buf.is_empty() && !(buf.end()[-1] & 0x80)))
@@ -207,11 +207,11 @@ namespace NYsonPull {
return read_slow(reader, value);
}
}
-
+
}
-
+
// Various functions to read/write varints.
-
+
// Returns the number of bytes written.
template <typename T>
inline NTraits::if_unsigned<T, size_t> write(ui8* data, T value) {
@@ -219,21 +219,21 @@ namespace NYsonPull {
static_cast<ui64>(value),
[&](ui8 byte) { *data++ = byte; });
}
-
+
template <typename T>
inline NTraits::if_signed<T, size_t> write(ui8* data, T value) {
return NImpl::write(
static_cast<ui64>(NZigZag::encode(value)),
[&](ui8 byte) { *data++ = byte; });
}
-
+
template <typename T, typename U>
inline void write(byte_writer<U>& stream, T value) {
ui8 data[NImpl::max_size<T>()];
auto size = write(data, value);
stream.write(data, size);
}
-
+
template <typename T, typename U>
inline NTraits::if_unsigned<T, T> read(byte_reader<U>& reader) {
auto value = T{};
@@ -243,13 +243,13 @@ namespace NYsonPull {
reader.advance(1);
return value;
}
-
- if (Y_UNLIKELY(!NImpl::read_dispatch(reader, &value))) {
+
+ if (Y_UNLIKELY(!NImpl::read_dispatch(reader, &value))) {
reader.fail("Error parsing varint value");
}
return value;
}
-
+
template <typename T, typename U>
inline NTraits::if_signed<T, T> read(byte_reader<U>& reader) {
return NZigZag::decode(
diff --git a/library/cpp/yson_pull/detail/writer.h b/library/cpp/yson_pull/detail/writer.h
index b24b994292..ebd6b4edf2 100644
--- a/library/cpp/yson_pull/detail/writer.h
+++ b/library/cpp/yson_pull/detail/writer.h
@@ -1,23 +1,23 @@
-#pragma once
-
-#include "byte_writer.h"
-#include "cescape.h"
+#pragma once
+
+#include "byte_writer.h"
+#include "cescape.h"
#include "percent_scalar.h"
-#include "stream_counter.h"
-#include "symbols.h"
-#include "varint.h"
-
+#include "stream_counter.h"
+#include "symbols.h"
+#include "varint.h"
+
#include <library/cpp/yson_pull/consumer.h>
#include <library/cpp/yson_pull/event.h>
#include <library/cpp/yson_pull/output.h>
#include <library/cpp/yson_pull/stream_type.h>
#include <library/cpp/yson_pull/writer.h>
-
-#include <util/generic/vector.h>
-#include <util/system/yassert.h>
-
-#include <cmath>
-
+
+#include <util/generic/vector.h>
+#include <util/system/yassert.h>
+
+#include <cmath>
+
namespace NYsonPull {
namespace NDetail {
class writer: public IConsumer {
@@ -30,91 +30,91 @@ namespace NYsonPull {
before_end,
after_end,
};
-
+
byte_writer<stream_counter<false>> stream_;
TVector<EEventType> stack_;
bool need_item_separator_ = false;
EStreamType mode_ = EStreamType::ListFragment;
state state_ = state::before_begin;
-
+
public:
- void OnBeginStream() override {
- update_state(EEventType::BeginStream);
+ void OnBeginStream() override {
+ update_state(EEventType::BeginStream);
}
-
- void OnEndStream() override {
- update_state(EEventType::EndStream);
+
+ void OnEndStream() override {
+ update_state(EEventType::EndStream);
stream_.flush_buffer();
}
-
- void OnBeginList() override {
+
+ void OnBeginList() override {
begin_node();
write(NSymbol::begin_list);
- update_state(EEventType::BeginList);
+ update_state(EEventType::BeginList);
begin_collection(collection_type::list);
}
-
- void OnEndList() override {
- update_state(EEventType::EndList);
+
+ void OnEndList() override {
+ update_state(EEventType::EndList);
end_collection(collection_type::list);
write(NSymbol::end_list);
end_node();
}
-
- void OnBeginMap() override {
+
+ void OnBeginMap() override {
begin_node();
write(NSymbol::begin_map);
- update_state(EEventType::BeginMap);
+ update_state(EEventType::BeginMap);
begin_collection(collection_type::map);
}
-
- void OnEndMap() override {
- update_state(EEventType::EndMap);
+
+ void OnEndMap() override {
+ update_state(EEventType::EndMap);
end_collection(collection_type::map);
write(NSymbol::end_map);
end_node();
}
-
- void OnBeginAttributes() override {
+
+ void OnBeginAttributes() override {
begin_node();
write(NSymbol::begin_attributes);
- update_state(EEventType::BeginAttributes);
+ update_state(EEventType::BeginAttributes);
begin_collection(collection_type::attributes);
}
-
- void OnEndAttributes() override {
- update_state(EEventType::EndAttributes);
+
+ void OnEndAttributes() override {
+ update_state(EEventType::EndAttributes);
end_collection(collection_type::attributes);
write(NSymbol::end_attributes);
// no end_node
}
-
- void OnEntity() override {
- begin_node();
- update_state(EEventType::Scalar);
+
+ void OnEntity() override {
+ begin_node();
+ update_state(EEventType::Scalar);
write(NSymbol::entity);
end_node();
}
-
+
protected:
enum class collection_type {
list,
map,
attributes,
};
-
+
writer(NYsonPull::NOutput::IStream& stream, EStreamType mode)
: stream_(stream)
, mode_{mode} {
}
-
+
bool need_item_separator() const {
return need_item_separator_;
}
void need_item_separator(bool value) {
need_item_separator_ = value;
}
-
+
size_t depth() const {
Y_ASSERT(!stack_.empty());
if (mode_ == EStreamType::Node) {
@@ -126,124 +126,124 @@ namespace NYsonPull {
EStreamType mode() const {
return mode_;
}
-
+
void write(ui8 c) {
stream_.write(c);
}
-
+
void write(TStringBuf value) {
write_raw(value.data(), value.size());
}
-
+
void write_raw(const void* ptr, size_t len) {
stream_.write(static_cast<const ui8*>(ptr), len);
}
-
+
template <typename T>
void write_varint(T value) {
NVarInt::write(stream_, value);
}
-
+
void write_escaped_string(TStringBuf value) {
write(NSymbol::quote);
NCEscape::encode(stream_, value);
write(NSymbol::quote);
}
-
+
void push(EEventType type) {
stack_.push_back(type);
}
-
+
void pop(EEventType type) {
if (stack_.empty()) {
fail("Unpaired events: empty event stack");
- }
+ }
if (stack_.back() != type) {
fail("Unpaired events: expected ", type, ", got ", stack_.back());
- }
+ }
stack_.pop_back();
}
-
+
void update_state(EEventType event) {
switch (state_) {
case state::before_begin:
- if (event != EEventType::BeginStream) {
+ if (event != EEventType::BeginStream) {
fail("Expected begin_stream, got ", event);
}
begin_stream();
return;
-
+
case state::before_end:
- if (event != EEventType::EndStream) {
+ if (event != EEventType::EndStream) {
fail("Expected end_stream, got ", event);
}
- end_stream();
- return;
-
+ end_stream();
+ return;
+
case state::after_end:
fail("Attempted write past stream end");
-
+
case state::maybe_key:
- if (event == EEventType::Key) {
+ if (event == EEventType::Key) {
state_ = state::value;
return;
}
-
+
switch (event) {
- case EEventType::EndStream:
+ case EEventType::EndStream:
end_stream();
return;
-
- case EEventType::EndMap:
- pop(EEventType::BeginMap);
+
+ case EEventType::EndMap:
+ pop(EEventType::BeginMap);
next_state();
return;
-
- case EEventType::EndAttributes:
- pop(EEventType::BeginAttributes);
+
+ case EEventType::EndAttributes:
+ pop(EEventType::BeginAttributes);
state_ = state::value_noattr;
return;
-
+
default:
fail("Unexpected event ", event, " in maybe_key");
}
break;
-
+
case state::maybe_value:
switch (event) {
- case EEventType::EndList:
- pop(EEventType::BeginList);
+ case EEventType::EndList:
+ pop(EEventType::BeginList);
next_state();
return;
-
- case EEventType::EndStream:
+
+ case EEventType::EndStream:
end_stream();
return;
-
+
default:
break;
}
[[fallthrough]];
case state::value:
- if (event == EEventType::BeginAttributes) {
- push(EEventType::BeginAttributes);
+ if (event == EEventType::BeginAttributes) {
+ push(EEventType::BeginAttributes);
next_state();
return;
}
[[fallthrough]];
case state::value_noattr:
switch (event) {
- case EEventType::Scalar:
+ case EEventType::Scalar:
next_state();
return;
- case EEventType::BeginList:
- push(EEventType::BeginList);
+ case EEventType::BeginList:
+ push(EEventType::BeginList);
next_state();
return;
- case EEventType::BeginMap:
- push(EEventType::BeginMap);
+ case EEventType::BeginMap:
+ push(EEventType::BeginMap);
next_state();
return;
@@ -251,94 +251,94 @@ namespace NYsonPull {
fail("Unexpected event ", event, " (in value_*)");
}
break;
- }
+ }
}
-
+
void next_state() {
Y_ASSERT(!stack_.empty());
switch (stack_.back()) {
- case EEventType::BeginMap:
- case EEventType::BeginAttributes:
+ case EEventType::BeginMap:
+ case EEventType::BeginAttributes:
state_ = state::maybe_key;
break;
-
- case EEventType::BeginList:
+
+ case EEventType::BeginList:
state_ = state::maybe_value;
break;
-
- case EEventType::BeginStream:
+
+ case EEventType::BeginStream:
state_ = state::before_end;
break;
-
+
default:
- Y_UNREACHABLE();
+ Y_UNREACHABLE();
}
}
-
+
void begin_stream() {
- push(EEventType::BeginStream);
+ push(EEventType::BeginStream);
switch (mode_) {
case EStreamType::ListFragment:
- push(EEventType::BeginList);
+ push(EEventType::BeginList);
state_ = state::maybe_value;
break;
-
+
case EStreamType::MapFragment:
- push(EEventType::BeginMap);
+ push(EEventType::BeginMap);
state_ = state::maybe_key;
break;
-
+
case EStreamType::Node:
state_ = state::value;
break;
}
}
-
+
void end_stream() {
switch (mode_) {
case EStreamType::ListFragment:
- pop(EEventType::BeginList);
+ pop(EEventType::BeginList);
break;
-
+
case EStreamType::MapFragment:
- pop(EEventType::BeginMap);
+ pop(EEventType::BeginMap);
break;
-
+
case EStreamType::Node:
break;
}
- pop(EEventType::BeginStream);
+ pop(EEventType::BeginStream);
state_ = state::after_end;
}
-
+
virtual void begin_node() {
if (need_item_separator_) {
write(NSymbol::item_separator);
}
}
-
+
virtual void end_node() {
need_item_separator_ = true;
}
-
+
virtual void begin_key() {
begin_node();
}
-
+
virtual void end_key() {
need_item_separator_ = false;
write(NSymbol::key_value_separator);
}
-
+
virtual void begin_collection(collection_type type) {
Y_UNUSED(type);
need_item_separator_ = false;
}
-
+
virtual void end_collection(collection_type type) {
need_item_separator_ = (type != collection_type::attributes);
}
-
+
template <typename... Args>
ATTRIBUTE(noinline, cold)
void fail[[noreturn]](const char* msg, Args&&... args) {
@@ -350,62 +350,62 @@ namespace NYsonPull {
stream_.counter().info());
}
};
-
- class TBinaryWriterImpl final: public writer {
+
+ class TBinaryWriterImpl final: public writer {
public:
- TBinaryWriterImpl(NYsonPull::NOutput::IStream& stream, EStreamType mode)
+ TBinaryWriterImpl(NYsonPull::NOutput::IStream& stream, EStreamType mode)
: writer(stream, mode)
{
}
-
- void OnScalarBoolean(bool value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarBoolean(bool value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
write(value ? NSymbol::true_marker : NSymbol::false_marker);
end_node();
}
-
- void OnScalarInt64(i64 value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarInt64(i64 value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
write(NSymbol::int64_marker);
write_varint(value);
end_node();
}
-
- void OnScalarUInt64(ui64 value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarUInt64(ui64 value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
write(NSymbol::uint64_marker);
write_varint(value);
end_node();
}
-
- void OnScalarFloat64(double value) override {
+
+ void OnScalarFloat64(double value) override {
update_state(EEventType::Scalar);
-
+
begin_node();
write(NSymbol::double_marker);
write_raw(&value, sizeof value);
end_node();
}
-
- void OnScalarString(TStringBuf value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarString(TStringBuf value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
write(NSymbol::string_marker);
write_varint(static_cast<i32>(value.size()));
write_raw(value.data(), value.size());
end_node();
}
-
- void OnKey(TStringBuf name) override {
- update_state(EEventType::Key);
-
+
+ void OnKey(TStringBuf name) override {
+ update_state(EEventType::Key);
+
begin_key();
write(NSymbol::string_marker);
write_varint(static_cast<i32>(name.size()));
@@ -413,50 +413,50 @@ namespace NYsonPull {
end_key();
}
};
-
- class TTextWriterImpl: public writer {
+
+ class TTextWriterImpl: public writer {
public:
- TTextWriterImpl(NYsonPull::NOutput::IStream& stream, EStreamType mode)
+ TTextWriterImpl(NYsonPull::NOutput::IStream& stream, EStreamType mode)
: writer(stream, mode)
{
}
-
- void OnScalarBoolean(bool value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarBoolean(bool value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
write(value ? percent_scalar::true_literal : percent_scalar::false_literal);
end_node();
}
-
- void OnScalarInt64(i64 value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarInt64(i64 value) override {
+ update_state(EEventType::Scalar);
+
char buf[32];
- auto len = ::snprintf(buf, sizeof(buf), "%" PRIi64, value);
-
+ auto len = ::snprintf(buf, sizeof(buf), "%" PRIi64, value);
+
begin_node();
write_raw(buf, len);
end_node();
}
-
- void OnScalarUInt64(ui64 value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarUInt64(ui64 value) override {
+ update_state(EEventType::Scalar);
+
char buf[32];
- auto len = ::snprintf(buf, sizeof(buf), "%" PRIu64, value);
-
+ auto len = ::snprintf(buf, sizeof(buf), "%" PRIu64, value);
+
begin_node();
write_raw(buf, len);
write('u');
end_node();
}
-
- void OnScalarFloat64(double value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarFloat64(double value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
-
+
if (std::isfinite(value)) {
char buf[32];
auto len = ::snprintf(buf, sizeof(buf), "%#.17lg", value);
@@ -467,27 +467,27 @@ namespace NYsonPull {
write(percent_scalar::positive_inf_literal);
} else {
write(percent_scalar::negative_inf_literal);
- }
+ }
end_node();
}
-
- void OnScalarString(TStringBuf value) override {
- update_state(EEventType::Scalar);
-
+
+ void OnScalarString(TStringBuf value) override {
+ update_state(EEventType::Scalar);
+
begin_node();
write_escaped_string(value);
end_node();
}
-
- void OnKey(TStringBuf name) override {
- update_state(EEventType::Key);
-
+
+ void OnKey(TStringBuf name) override {
+ update_state(EEventType::Key);
+
begin_key();
write_escaped_string(name);
end_key();
}
-
+
protected:
void begin_node() override {
if (need_item_separator()) {
@@ -495,7 +495,7 @@ namespace NYsonPull {
write(' ');
}
}
-
+
void end_node() override {
if (mode() != EStreamType::Node && depth() == 0) {
write(NSymbol::item_separator);
@@ -505,26 +505,26 @@ namespace NYsonPull {
writer::end_node();
}
}
-
+
void end_key() override {
write(' ');
writer::end_key();
write(' ');
}
};
-
- class TPrettyWriterImpl final: public TTextWriterImpl {
+
+ class TPrettyWriterImpl final: public TTextWriterImpl {
size_t indent_size_;
-
+
public:
- TPrettyWriterImpl(
+ TPrettyWriterImpl(
NYsonPull::NOutput::IStream& stream,
EStreamType mode,
size_t indent_size)
- : TTextWriterImpl(stream, mode)
+ : TTextWriterImpl(stream, mode)
, indent_size_{indent_size} {
}
-
+
protected:
void begin_node() override {
if (need_item_separator()) {
@@ -532,35 +532,35 @@ namespace NYsonPull {
newline();
}
}
-
+
void begin_collection(collection_type type) override {
- TTextWriterImpl::begin_collection(type);
+ TTextWriterImpl::begin_collection(type);
newline();
}
-
+
void end_collection(collection_type type) override {
- TTextWriterImpl::end_collection(type);
+ TTextWriterImpl::end_collection(type);
newline();
}
-
+
void newline() {
write('\n');
indent(depth());
}
-
+
void indent(size_t count) {
for (size_t i = 0; i < count * indent_size_; ++i) {
write(' ');
}
}
};
-
+
template <typename T, typename... Args>
NYsonPull::TWriter make_writer(
THolder<NYsonPull::NOutput::IStream> stream,
Args&&... args) {
auto impl = MakeHolder<T>(*stream, std::forward<Args>(args)...);
return NYsonPull::TWriter(std::move(stream), std::move(impl));
- }
- }
+ }
+ }
}
diff --git a/library/cpp/yson_pull/detail/zigzag.h b/library/cpp/yson_pull/detail/zigzag.h
index 98fcac0e9f..14917d11b8 100644
--- a/library/cpp/yson_pull/detail/zigzag.h
+++ b/library/cpp/yson_pull/detail/zigzag.h
@@ -1,23 +1,23 @@
-#pragma once
-
-#include "traits.h"
-
+#pragma once
+
+#include "traits.h"
+
namespace NYsonPull {
namespace NDetail {
namespace NZigZag {
//! Functions that provide coding of integers with property: 0 <= f(x) <= 2 * |x|
-
- template <typename TSigned>
- inline NTraits::to_unsigned<TSigned> encode(TSigned x) {
- using TUnsigned = NTraits::to_unsigned<TSigned>;
- constexpr auto rshift = sizeof(TSigned) * 8 - 1;
- return (static_cast<TUnsigned>(x) << 1) ^ static_cast<TUnsigned>(x >> rshift);
+
+ template <typename TSigned>
+ inline NTraits::to_unsigned<TSigned> encode(TSigned x) {
+ using TUnsigned = NTraits::to_unsigned<TSigned>;
+ constexpr auto rshift = sizeof(TSigned) * 8 - 1;
+ return (static_cast<TUnsigned>(x) << 1) ^ static_cast<TUnsigned>(x >> rshift);
}
-
- template <typename TUnsigned>
- inline NTraits::to_signed<TUnsigned> decode(TUnsigned x) {
- using TSigned = NTraits::to_signed<TUnsigned>;
- return static_cast<TSigned>(x >> 1) ^ -static_cast<TSigned>(x & 1);
+
+ template <typename TUnsigned>
+ inline NTraits::to_signed<TUnsigned> decode(TUnsigned x) {
+ using TSigned = NTraits::to_signed<TUnsigned>;
+ return static_cast<TSigned>(x >> 1) ^ -static_cast<TSigned>(x & 1);
}
}
} // namespace NDetail
diff --git a/library/cpp/yson_pull/event.cpp b/library/cpp/yson_pull/event.cpp
index b7ede494b6..f7d5014608 100644
--- a/library/cpp/yson_pull/event.cpp
+++ b/library/cpp/yson_pull/event.cpp
@@ -1,18 +1,18 @@
-#include "event.h"
-
+#include "event.h"
+
#include <library/cpp/yson_pull/detail/cescape.h>
-
-#include <util/stream/output.h>
-
-using namespace NYsonPull;
-
+
+#include <util/stream/output.h>
+
+using namespace NYsonPull;
+
template <>
void Out<TEvent>(IOutputStream& out, const TEvent& value) {
- out << '(' << value.Type();
- if (value.Type() == EEventType::Scalar) {
- out << ' ' << value.AsScalar();
- } else if (value.Type() == EEventType::Key) {
- out << ' ' << NYsonPull::NDetail::NCEscape::quote(value.AsString());
- }
- out << ')';
-}
+ out << '(' << value.Type();
+ if (value.Type() == EEventType::Scalar) {
+ out << ' ' << value.AsScalar();
+ } else if (value.Type() == EEventType::Key) {
+ out << ' ' << NYsonPull::NDetail::NCEscape::quote(value.AsString());
+ }
+ out << ')';
+}
diff --git a/library/cpp/yson_pull/event.h b/library/cpp/yson_pull/event.h
index b41d5ea3b5..c8ecca7a45 100644
--- a/library/cpp/yson_pull/event.h
+++ b/library/cpp/yson_pull/event.h
@@ -1,13 +1,13 @@
-#pragma once
-
-#include "cyson_enums.h"
-#include "scalar.h"
-
-#include <util/generic/strbuf.h>
-#include <util/system/types.h>
-#include <util/system/yassert.h>
-
-namespace NYsonPull {
+#pragma once
+
+#include "cyson_enums.h"
+#include "scalar.h"
+
+#include <util/generic/strbuf.h>
+#include <util/system/types.h>
+#include <util/system/yassert.h>
+
+namespace NYsonPull {
//! A well-formed decoded YSON stream can be described by the following grammar:
//!
//! STREAM[node] ::= begin_stream VALUE end_stream
@@ -21,65 +21,65 @@ namespace NYsonPull {
//! VALUE_NOATTR ::= scalar(Scalar) | LIST | MAP
//! LIST ::= begin_list LIST_FRAGMENT end_list
//! MAP ::= begin_map MAP_FRAGMENT end_map
-
+
//! \brief YSON event type tag. Corresponds to YSON grammar.
enum class EEventType {
- BeginStream = YSON_EVENT_BEGIN_STREAM,
- EndStream = YSON_EVENT_END_STREAM,
- BeginList = YSON_EVENT_BEGIN_LIST,
- EndList = YSON_EVENT_END_LIST,
- BeginMap = YSON_EVENT_BEGIN_MAP,
- EndMap = YSON_EVENT_END_MAP,
- BeginAttributes = YSON_EVENT_BEGIN_ATTRIBUTES,
- EndAttributes = YSON_EVENT_END_ATTRIBUTES,
- Key = YSON_EVENT_KEY,
- Scalar = YSON_EVENT_SCALAR,
+ BeginStream = YSON_EVENT_BEGIN_STREAM,
+ EndStream = YSON_EVENT_END_STREAM,
+ BeginList = YSON_EVENT_BEGIN_LIST,
+ EndList = YSON_EVENT_END_LIST,
+ BeginMap = YSON_EVENT_BEGIN_MAP,
+ EndMap = YSON_EVENT_END_MAP,
+ BeginAttributes = YSON_EVENT_BEGIN_ATTRIBUTES,
+ EndAttributes = YSON_EVENT_END_ATTRIBUTES,
+ Key = YSON_EVENT_KEY,
+ Scalar = YSON_EVENT_SCALAR,
};
-
+
//! \brief YSON event variant type.
class TEvent {
- EEventType Type_;
- TScalar Value_;
-
+ EEventType Type_;
+ TScalar Value_;
+
public:
//! \brief Construct a tag-only event.
- explicit constexpr TEvent(EEventType type = EEventType::BeginStream)
- : Type_{type} {
+ explicit constexpr TEvent(EEventType type = EEventType::BeginStream)
+ : Type_{type} {
}
-
+
//! \brief Construct a tag+value event.
//!
//! Only \p EEventType::key is meaningful.
constexpr TEvent(EEventType type, const TScalar& value)
- : Type_{type}
- , Value_{value} {
+ : Type_{type}
+ , Value_{value} {
}
-
+
//! \brief Construct a \p EEventType::scalar event.
explicit constexpr TEvent(const TScalar& value)
- : Type_{EEventType::Scalar}
- , Value_{value} {
+ : Type_{EEventType::Scalar}
+ , Value_{value} {
}
-
- EEventType Type() const {
- return Type_;
+
+ EEventType Type() const {
+ return Type_;
}
-
+
//! \brief Get TScalar value.
//!
//! Undefined behaviour when event type is not \p EEventType::scalar.
- const TScalar& AsScalar() const {
- Y_ASSERT(Type_ == EEventType::Scalar || Type_ == EEventType::Key);
- return Value_;
+ const TScalar& AsScalar() const {
+ Y_ASSERT(Type_ == EEventType::Scalar || Type_ == EEventType::Key);
+ return Value_;
}
-
+
//! \brief Get string value.
//!
//! Undefined behaviour when event type is not \p EEventType::key.
- TStringBuf AsString() const {
- Y_ASSERT(Type_ == EEventType::Key || (Type_ == EEventType::Scalar && Value_.Type() == EScalarType::String));
- return Value_.AsString();
+ TStringBuf AsString() const {
+ Y_ASSERT(Type_ == EEventType::Key || (Type_ == EEventType::Scalar && Value_.Type() == EScalarType::String));
+ return Value_.AsString();
}
};
-
+
}
diff --git a/library/cpp/yson_pull/exceptions.cpp b/library/cpp/yson_pull/exceptions.cpp
index e1d68493e7..dde4df4c35 100644
--- a/library/cpp/yson_pull/exceptions.cpp
+++ b/library/cpp/yson_pull/exceptions.cpp
@@ -1,45 +1,45 @@
-#include "exceptions.h"
-
-#include <util/string/builder.h>
-
-#include <cerrno>
-#include <cstring>
-
-using namespace NYsonPull::NException;
-
-const char* TBadStream::what() const noexcept {
- TStringBuilder stream;
- stream << "Invalid YSON";
- if (Position_.Offset || Position_.Line || Position_.Column) {
- bool first = true;
- stream << " at ";
- if (Position_.Offset) {
- stream << "offset " << *Position_.Offset;
- first = false;
- }
- if (Position_.Line) {
- if (!first) {
- stream << ", ";
- }
- stream << "line " << *Position_.Line;
- first = false;
- }
- if (Position_.Column) {
- if (!first) {
- stream << ", ";
- }
- stream << "column " << *Position_.Column;
- }
- }
- stream << ": " << Message_;
- FormattedMessage_ = stream;
- return FormattedMessage_.c_str();
-}
-
+#include "exceptions.h"
+
+#include <util/string/builder.h>
+
+#include <cerrno>
+#include <cstring>
+
+using namespace NYsonPull::NException;
+
+const char* TBadStream::what() const noexcept {
+ TStringBuilder stream;
+ stream << "Invalid YSON";
+ if (Position_.Offset || Position_.Line || Position_.Column) {
+ bool first = true;
+ stream << " at ";
+ if (Position_.Offset) {
+ stream << "offset " << *Position_.Offset;
+ first = false;
+ }
+ if (Position_.Line) {
+ if (!first) {
+ stream << ", ";
+ }
+ stream << "line " << *Position_.Line;
+ first = false;
+ }
+ if (Position_.Column) {
+ if (!first) {
+ stream << ", ";
+ }
+ stream << "column " << *Position_.Column;
+ }
+ }
+ stream << ": " << Message_;
+ FormattedMessage_ = stream;
+ return FormattedMessage_.c_str();
+}
+
NYsonPull::NException::TSystemError::TSystemError()
- : SavedErrno_{errno} {
-}
-
-const char* NYsonPull::NException::TSystemError::what() const noexcept {
- return ::strerror(SavedErrno_);
+ : SavedErrno_{errno} {
}
+
+const char* NYsonPull::NException::TSystemError::what() const noexcept {
+ return ::strerror(SavedErrno_);
+}
diff --git a/library/cpp/yson_pull/exceptions.h b/library/cpp/yson_pull/exceptions.h
index ebfed950a5..12dbd0013d 100644
--- a/library/cpp/yson_pull/exceptions.h
+++ b/library/cpp/yson_pull/exceptions.h
@@ -1,58 +1,58 @@
-#pragma once
-
-#include "position_info.h"
-
+#pragma once
+
+#include "position_info.h"
+
#include <util/generic/string.h>
-
-#include <stdexcept>
-#include <string>
-
+
+#include <stdexcept>
+#include <string>
+
namespace NYsonPull {
namespace NException {
class TBadStream: public std::exception {
TString Message_;
- TPositionInfo Position_;
+ TPositionInfo Position_;
mutable TString FormattedMessage_;
-
+
public:
TBadStream(
TString message,
const TPositionInfo& position)
- : Message_(std::move(message))
- , Position_(position)
+ : Message_(std::move(message))
+ , Position_(position)
{
}
-
- const TPositionInfo& Position() const {
- return Position_;
+
+ const TPositionInfo& Position() const {
+ return Position_;
}
-
+
const char* what() const noexcept override;
};
-
+
class TBadInput: public TBadStream {
public:
using TBadStream::TBadStream;
};
-
+
class TBadOutput: public TBadStream {
public:
using TBadStream::TBadStream;
};
-
+
class TSystemError: public std::exception {
- int SavedErrno_;
-
+ int SavedErrno_;
+
public:
TSystemError();
TSystemError(int saved_errno)
- : SavedErrno_{saved_errno} {
+ : SavedErrno_{saved_errno} {
}
-
+
int saved_errno() const noexcept {
- return SavedErrno_;
+ return SavedErrno_;
}
-
+
const char* what() const noexcept override;
};
}
diff --git a/library/cpp/yson_pull/input.cpp b/library/cpp/yson_pull/input.cpp
index 1373c89868..c0ee776e64 100644
--- a/library/cpp/yson_pull/input.cpp
+++ b/library/cpp/yson_pull/input.cpp
@@ -1,33 +1,33 @@
-#include "input.h"
-
+#include "input.h"
+
#include <library/cpp/yson_pull/detail/input/stdio_file.h>
#include <library/cpp/yson_pull/detail/input/stream.h>
-
-#include <util/generic/ptr.h>
-#include <util/stream/file.h>
-#include <util/stream/mem.h>
-
-using namespace NYsonPull::NInput;
-using namespace NYsonPull::NDetail::NInput;
-
-namespace NInput = NYsonPull::NInput;
-
-THolder<IStream> NInput::FromStdioFile(FILE* file, size_t buffer_size) {
- return MakeHolder<TStdioFile>(file, buffer_size);
-}
-
-THolder<IStream> NInput::FromPosixFd(int fd, size_t buffer_size) {
- return MakeHolder<TFHandle>(fd, buffer_size);
-}
-
-THolder<IStream> NInput::FromMemory(TStringBuf data) {
- return MakeHolder<TOwned<TMemoryInput>>(data);
-}
-
+
+#include <util/generic/ptr.h>
+#include <util/stream/file.h>
+#include <util/stream/mem.h>
+
+using namespace NYsonPull::NInput;
+using namespace NYsonPull::NDetail::NInput;
+
+namespace NInput = NYsonPull::NInput;
+
+THolder<IStream> NInput::FromStdioFile(FILE* file, size_t buffer_size) {
+ return MakeHolder<TStdioFile>(file, buffer_size);
+}
+
+THolder<IStream> NInput::FromPosixFd(int fd, size_t buffer_size) {
+ return MakeHolder<TFHandle>(fd, buffer_size);
+}
+
+THolder<IStream> NInput::FromMemory(TStringBuf data) {
+ return MakeHolder<TOwned<TMemoryInput>>(data);
+}
+
THolder<IStream> NInput::FromInputStream(IInputStream* input, size_t buffer_size) {
- return MakeHolder<TOwned<TBufferedInput>>(input, buffer_size);
-}
-
+ return MakeHolder<TOwned<TBufferedInput>>(input, buffer_size);
+}
+
THolder<IStream> NInput::FromZeroCopyInput(IZeroCopyInput* input) {
- return MakeHolder<TZeroCopy>(input);
-}
+ return MakeHolder<TZeroCopy>(input);
+}
diff --git a/library/cpp/yson_pull/input.h b/library/cpp/yson_pull/input.h
index 2cdfae857e..f060c29535 100644
--- a/library/cpp/yson_pull/input.h
+++ b/library/cpp/yson_pull/input.h
@@ -1,18 +1,18 @@
-#pragma once
-
-#include "buffer.h"
-
-#include <util/generic/ptr.h>
-#include <util/generic/strbuf.h>
-#include <util/system/types.h>
-#include <util/system/yassert.h>
-
-#include <cstddef>
-#include <memory>
-
+#pragma once
+
+#include "buffer.h"
+
+#include <util/generic/ptr.h>
+#include <util/generic/strbuf.h>
+#include <util/system/types.h>
+#include <util/system/yassert.h>
+
+#include <cstddef>
+#include <memory>
+
class IInputStream;
class IZeroCopyInput;
-
+
namespace NYsonPull {
namespace NInput {
//! \brief Input stream adaptor interface.
@@ -21,33 +21,33 @@ namespace NYsonPull {
class IStream {
input_buffer buffer_;
bool at_end_ = false;
-
+
public:
virtual ~IStream() = default;
-
+
bool at_end() const {
return at_end_;
}
-
+
input_buffer& buffer() noexcept {
return buffer_;
}
const input_buffer& buffer() const noexcept {
return buffer_;
}
-
+
void fill_buffer() {
while (buffer_.is_empty() && !at_end()) {
at_end_ = do_fill_buffer() == result::at_end;
}
}
-
+
protected:
enum class result {
have_more_data, //! May continue reading
at_end, //! Reached end of stream
};
-
+
//! \brief Read next chunk of data.
//!
//! The implementation is to discard the buffer contents
@@ -57,25 +57,25 @@ namespace NYsonPull {
//! Read is assumed to always succeed unless it throws an exception.
virtual result do_fill_buffer() = 0;
};
-
+
//! \brief Read data from a contiguous memory block (i.e. a string)
//!
//! Does not take ownership on memory.
- THolder<IStream> FromMemory(TStringBuf data);
-
+ THolder<IStream> FromMemory(TStringBuf data);
+
//! \brief Read data from C FILE* object.
//!
//! Does not take ownership on file object.
//! Data is buffered internally regardless of file buffering.
- THolder<IStream> FromStdioFile(FILE* file, size_t buffer_size = 65536);
-
+ THolder<IStream> FromStdioFile(FILE* file, size_t buffer_size = 65536);
+
//! \brief Read data from POSIX file descriptor.
//!
//! Does not take ownership on streambuf.
- THolder<IStream> FromPosixFd(int fd, size_t buffer_size = 65536);
-
+ THolder<IStream> FromPosixFd(int fd, size_t buffer_size = 65536);
+
THolder<IStream> FromZeroCopyInput(IZeroCopyInput* input);
-
+
THolder<IStream> FromInputStream(IInputStream* input, size_t buffer_size = 65536);
}
}
diff --git a/library/cpp/yson_pull/output.cpp b/library/cpp/yson_pull/output.cpp
index 27c9ef9e69..c036606f35 100644
--- a/library/cpp/yson_pull/output.cpp
+++ b/library/cpp/yson_pull/output.cpp
@@ -1,29 +1,29 @@
-#include "output.h"
-
+#include "output.h"
+
#include <library/cpp/yson_pull/detail/output/stdio_file.h>
#include <library/cpp/yson_pull/detail/output/stream.h>
-
-#include <util/generic/ptr.h>
-#include <util/stream/file.h>
-#include <util/stream/str.h>
-
-using namespace NYsonPull::NOutput;
-using namespace NYsonPull::NDetail::NOutput;
-
-namespace NOutput = NYsonPull::NOutput;
-
-THolder<IStream> NOutput::FromStdioFile(FILE* file, size_t buffer_size) {
- return MakeHolder<TStdioFile>(file, buffer_size);
-}
-
-THolder<IStream> NOutput::FromPosixFd(int fd, size_t buffer_size) {
- return MakeHolder<TFHandle>(fd, buffer_size);
-}
-
+
+#include <util/generic/ptr.h>
+#include <util/stream/file.h>
+#include <util/stream/str.h>
+
+using namespace NYsonPull::NOutput;
+using namespace NYsonPull::NDetail::NOutput;
+
+namespace NOutput = NYsonPull::NOutput;
+
+THolder<IStream> NOutput::FromStdioFile(FILE* file, size_t buffer_size) {
+ return MakeHolder<TStdioFile>(file, buffer_size);
+}
+
+THolder<IStream> NOutput::FromPosixFd(int fd, size_t buffer_size) {
+ return MakeHolder<TFHandle>(fd, buffer_size);
+}
+
THolder<IStream> NOutput::FromString(TString* output, size_t buffer_size) {
- return MakeHolder<TOwned<TStringOutput>>(buffer_size, *output);
-}
-
+ return MakeHolder<TOwned<TStringOutput>>(buffer_size, *output);
+}
+
THolder<IStream> NOutput::FromOutputStream(IOutputStream* output, size_t buffer_size) {
- return MakeHolder<TStream>(output, buffer_size);
-}
+ return MakeHolder<TStream>(output, buffer_size);
+}
diff --git a/library/cpp/yson_pull/output.h b/library/cpp/yson_pull/output.h
index 2d78107a93..62412a2f4d 100644
--- a/library/cpp/yson_pull/output.h
+++ b/library/cpp/yson_pull/output.h
@@ -1,35 +1,35 @@
-#pragma once
-
-#include "buffer.h"
-
-#include <util/generic/ptr.h>
-#include <util/generic/strbuf.h>
-#include <util/system/types.h>
-#include <util/system/yassert.h>
-
-#include <cstddef>
-#include <cstdio>
-#include <cstring>
-#include <memory>
-
-//! \brief Output stream adaptor interface.
-//!
-//! Represents a model of an optionally-buffered writer.
+#pragma once
+
+#include "buffer.h"
+
+#include <util/generic/ptr.h>
+#include <util/generic/strbuf.h>
+#include <util/system/types.h>
+#include <util/system/yassert.h>
+
+#include <cstddef>
+#include <cstdio>
+#include <cstring>
+#include <memory>
+
+//! \brief Output stream adaptor interface.
+//!
+//! Represents a model of an optionally-buffered writer.
namespace NYsonPull {
namespace NOutput {
class IStream {
output_buffer buffer_;
-
+
public:
virtual ~IStream() = default;
-
+
output_buffer& buffer() noexcept {
return buffer_;
}
const output_buffer& buffer() const noexcept {
return buffer_;
}
-
+
void flush_buffer(TStringBuf extra = {}) {
if (!extra.empty() || !buffer_.is_empty()) {
do_flush_buffer(extra);
@@ -38,7 +38,7 @@ namespace NYsonPull {
do_flush_buffer({});
}
}
-
+
protected:
//! \brief Flush data to underlying stream.
//!
@@ -51,15 +51,15 @@ namespace NYsonPull {
//! Write is assumed to always succeed unless it throws an exception.
virtual void do_flush_buffer(TStringBuf extra) = 0;
};
-
- //! \brief Write data to C FILE* object.
- THolder<IStream> FromStdioFile(FILE* file, size_t buffer_size = 0);
-
- //! \brief Write data to POSIX file descriptor
- THolder<IStream> FromPosixFd(int fd, size_t buffer_size = 65536);
-
+
+ //! \brief Write data to C FILE* object.
+ THolder<IStream> FromStdioFile(FILE* file, size_t buffer_size = 0);
+
+ //! \brief Write data to POSIX file descriptor
+ THolder<IStream> FromPosixFd(int fd, size_t buffer_size = 65536);
+
THolder<IStream> FromOutputStream(IOutputStream* output, size_t buffer_size = 65536);
-
+
THolder<IStream> FromString(TString* output, size_t buffer_size = 1024);
}
}
diff --git a/library/cpp/yson_pull/position_info.h b/library/cpp/yson_pull/position_info.h
index a65c4663a9..3401fe94ee 100644
--- a/library/cpp/yson_pull/position_info.h
+++ b/library/cpp/yson_pull/position_info.h
@@ -1,23 +1,23 @@
-#pragma once
-
-#include <util/generic/maybe.h>
+#pragma once
+
+#include <util/generic/maybe.h>
#include <util/system/types.h>
-
-namespace NYsonPull {
+
+namespace NYsonPull {
struct TPositionInfo {
- TMaybe<ui64> Offset;
- TMaybe<ui64> Line;
- TMaybe<ui64> Column;
-
+ TMaybe<ui64> Offset;
+ TMaybe<ui64> Line;
+ TMaybe<ui64> Column;
+
TPositionInfo() = default;
TPositionInfo(
TMaybe<ui64> offset_,
TMaybe<ui64> line_ = Nothing(),
TMaybe<ui64> column_ = Nothing())
- : Offset{offset_}
- , Line{line_}
- , Column{column_} {
+ : Offset{offset_}
+ , Line{line_}
+ , Column{column_} {
}
};
-
+
}
diff --git a/library/cpp/yson_pull/range.h b/library/cpp/yson_pull/range.h
index f4fcf3f206..d602d79911 100644
--- a/library/cpp/yson_pull/range.h
+++ b/library/cpp/yson_pull/range.h
@@ -1,35 +1,35 @@
-#pragma once
-
-#include "reader.h"
-
-#include <util/generic/iterator.h>
-
-namespace NYsonPull {
+#pragma once
+
+#include "reader.h"
+
+#include <util/generic/iterator.h>
+
+namespace NYsonPull {
class TStreamEventsRange: public TInputRangeAdaptor<TStreamEventsRange> {
TReader Reader_;
bool AtEnd;
-
+
public:
- TStreamEventsRange(THolder<NInput::IStream> stream, EStreamType mode)
+ TStreamEventsRange(THolder<NInput::IStream> stream, EStreamType mode)
: Reader_{std::move(stream), mode}
, AtEnd(false)
{
}
-
+
const TEvent* Last() const noexcept {
- return &Reader_.LastEvent();
+ return &Reader_.LastEvent();
}
-
+
const TEvent* Next() {
if (Y_UNLIKELY(AtEnd)) {
return nullptr;
}
-
- auto* event = &Reader_.NextEvent();
- if (event->Type() == EEventType::EndStream) {
+
+ auto* event = &Reader_.NextEvent();
+ if (event->Type() == EEventType::EndStream) {
AtEnd = true;
}
return event;
- }
+ }
};
}
diff --git a/library/cpp/yson_pull/read_ops.cpp b/library/cpp/yson_pull/read_ops.cpp
index 9d7e6a4a2d..9fa1fe79b3 100644
--- a/library/cpp/yson_pull/read_ops.cpp
+++ b/library/cpp/yson_pull/read_ops.cpp
@@ -1,66 +1,66 @@
-#include "read_ops.h"
-
-using namespace NYsonPull;
-using namespace NYsonPull::NReadOps;
-
-namespace {
+#include "read_ops.h"
+
+using namespace NYsonPull;
+using namespace NYsonPull::NReadOps;
+
+namespace {
bool TrySkipValueUntil(EEventType end, TReader& reader) {
- const auto& event = reader.NextEvent();
- if (event.Type() == end) {
+ const auto& event = reader.NextEvent();
+ if (event.Type() == end) {
return false;
}
SkipCurrentValue(event, reader);
return true;
}
-
+
bool TrySkipKeyValueUntil(EEventType end, TReader& reader) {
- const auto& event = reader.NextEvent();
- if (event.Type() == end) {
+ const auto& event = reader.NextEvent();
+ if (event.Type() == end) {
return false;
}
- Expect(event, EEventType::Key);
+ Expect(event, EEventType::Key);
SkipValue(reader);
return true;
}
-}
-
-void NYsonPull::NReadOps::SkipCurrentValue(const TEvent& event, TReader& reader) {
- switch (event.Type()) {
- case EEventType::BeginList:
- while (TrySkipValueUntil(EEventType::EndList, reader)) {
+}
+
+void NYsonPull::NReadOps::SkipCurrentValue(const TEvent& event, TReader& reader) {
+ switch (event.Type()) {
+ case EEventType::BeginList:
+ while (TrySkipValueUntil(EEventType::EndList, reader)) {
}
return;
-
- case EEventType::BeginMap:
- while (TrySkipKeyValueUntil(EEventType::EndMap, reader)) {
+
+ case EEventType::BeginMap:
+ while (TrySkipKeyValueUntil(EEventType::EndMap, reader)) {
}
return;
-
- case EEventType::BeginAttributes:
- while (TrySkipKeyValueUntil(EEventType::EndAttributes, reader)) {
+
+ case EEventType::BeginAttributes:
+ while (TrySkipKeyValueUntil(EEventType::EndAttributes, reader)) {
}
// attributes after attributes are disallowed in TReader
SkipValue(reader);
return;
-
- case EEventType::Scalar:
+
+ case EEventType::Scalar:
return;
-
+
default:
throw yexception() << "Unexpected event: " << event;
}
-}
-
-void NYsonPull::NReadOps::SkipValue(TReader& reader) {
- const auto& event = reader.NextEvent();
+}
+
+void NYsonPull::NReadOps::SkipValue(TReader& reader) {
+ const auto& event = reader.NextEvent();
SkipCurrentValue(event, reader);
-}
-
-void NYsonPull::NReadOps::SkipControlRecords(TReader& reader) {
- const auto* event = &reader.LastEvent();
- while (event->Type() == EEventType::BeginAttributes) {
- SkipCurrentValue(*event, reader);
- event = &reader.NextEvent();
- }
- Expect(*event, EEventType::BeginMap);
-}
+}
+
+void NYsonPull::NReadOps::SkipControlRecords(TReader& reader) {
+ const auto* event = &reader.LastEvent();
+ while (event->Type() == EEventType::BeginAttributes) {
+ SkipCurrentValue(*event, reader);
+ event = &reader.NextEvent();
+ }
+ Expect(*event, EEventType::BeginMap);
+}
diff --git a/library/cpp/yson_pull/read_ops.h b/library/cpp/yson_pull/read_ops.h
index 5c084983ea..91d8e3700d 100644
--- a/library/cpp/yson_pull/read_ops.h
+++ b/library/cpp/yson_pull/read_ops.h
@@ -1,142 +1,142 @@
-#pragma once
-
-#include "reader.h"
-
-#include <util/generic/maybe.h>
-#include <util/generic/bt_exception.h>
-#include <util/generic/yexception.h>
-#include <util/system/yassert.h>
-
-/** Imperative recursive-descent parsing helpers.
- *
- * These functions help verify conditions and advance parser state.
- * For aggregate parsing functions, common precondition is to require Begin{X}
- * event prior to function invocation. Thus, parsers are composable by calling
- * sub-parser after dispatching on opening event, e.g.:
- *
- * if (reader.LastEvent().Type() == EEventType::BeginMap) {
- * ReadSomeMap(reader)
- * }
- *
- */
-
+#pragma once
+
+#include "reader.h"
+
+#include <util/generic/maybe.h>
+#include <util/generic/bt_exception.h>
+#include <util/generic/yexception.h>
+#include <util/system/yassert.h>
+
+/** Imperative recursive-descent parsing helpers.
+ *
+ * These functions help verify conditions and advance parser state.
+ * For aggregate parsing functions, common precondition is to require Begin{X}
+ * event prior to function invocation. Thus, parsers are composable by calling
+ * sub-parser after dispatching on opening event, e.g.:
+ *
+ * if (reader.LastEvent().Type() == EEventType::BeginMap) {
+ * ReadSomeMap(reader)
+ * }
+ *
+ */
+
namespace NYsonPull {
namespace NReadOps {
class TExpectationFailure: public TWithBackTrace<yexception> {
- };
-
+ };
+
inline void Expect(const TEvent& got, EEventType expected) {
- Y_ENSURE_EX(
- got.Type() == expected,
- TExpectationFailure() << "expected " << expected << ", got " << got);
+ Y_ENSURE_EX(
+ got.Type() == expected,
+ TExpectationFailure() << "expected " << expected << ", got " << got);
}
-
+
inline void Expect(const TScalar& got, EScalarType expected) {
- Y_ENSURE_EX(
- got.Type() == expected,
- TExpectationFailure() << "expected scalar " << expected << ", got " << got);
- }
-
- // ExpectBegin{X} functions verify that last event WAS X
- // SkipBegin{X} functions verify that next event WILL BE X and CONSUME it
-
- inline void ExpectBeginStream(TReader& reader) {
- Expect(reader.LastEvent(), EEventType::BeginStream);
- }
-
- inline void SkipBeginStream(TReader& reader) {
- Expect(reader.NextEvent(), EEventType::BeginStream);
- }
-
+ Y_ENSURE_EX(
+ got.Type() == expected,
+ TExpectationFailure() << "expected scalar " << expected << ", got " << got);
+ }
+
+ // ExpectBegin{X} functions verify that last event WAS X
+ // SkipBegin{X} functions verify that next event WILL BE X and CONSUME it
+
+ inline void ExpectBeginStream(TReader& reader) {
+ Expect(reader.LastEvent(), EEventType::BeginStream);
+ }
+
+ inline void SkipBeginStream(TReader& reader) {
+ Expect(reader.NextEvent(), EEventType::BeginStream);
+ }
+
inline void ExpectBeginMap(TReader& reader) {
- Expect(reader.LastEvent(), EEventType::BeginMap);
+ Expect(reader.LastEvent(), EEventType::BeginMap);
}
-
+
inline void SkipBeginMap(TReader& reader) {
- Expect(reader.NextEvent(), EEventType::BeginMap);
+ Expect(reader.NextEvent(), EEventType::BeginMap);
}
-
+
inline void ExpectBeginList(TReader& reader) {
- Expect(reader.LastEvent(), EEventType::BeginList);
+ Expect(reader.LastEvent(), EEventType::BeginList);
}
-
+
inline void SkipBeginList(TReader& reader) {
- Expect(reader.NextEvent(), EEventType::BeginList);
+ Expect(reader.NextEvent(), EEventType::BeginList);
}
-
+
inline bool ReadListItem(TReader& reader) {
- return reader.NextEvent().Type() != EEventType::EndList;
+ return reader.NextEvent().Type() != EEventType::EndList;
}
-
+
inline TMaybe<TStringBuf> ReadKey(TReader& reader) {
- const auto& event = reader.NextEvent();
- switch (event.Type()) {
- case EEventType::Key:
- return event.AsString();
- case EEventType::EndMap:
+ const auto& event = reader.NextEvent();
+ switch (event.Type()) {
+ case EEventType::Key:
+ return event.AsString();
+ case EEventType::EndMap:
return Nothing();
default:
ythrow yexception() << "Unexpected event: " << event;
}
}
-
+
template <typename T = const TScalar&>
inline T ReadScalar(TReader& reader);
-
+
template <>
inline const TScalar& ReadScalar<const TScalar&>(TReader& reader) {
- const auto& event = reader.NextEvent();
- Expect(event, EEventType::Scalar);
- return event.AsScalar();
+ const auto& event = reader.NextEvent();
+ Expect(event, EEventType::Scalar);
+ return event.AsScalar();
}
-
+
template <>
inline i64 ReadScalar<i64>(TReader& reader) {
const auto& scalar = ReadScalar(reader);
- Expect(scalar, EScalarType::Int64);
- return scalar.AsInt64();
+ Expect(scalar, EScalarType::Int64);
+ return scalar.AsInt64();
}
-
+
template <>
inline ui64 ReadScalar<ui64>(TReader& reader) {
const auto& scalar = ReadScalar(reader);
- Expect(scalar, EScalarType::UInt64);
- return scalar.AsUInt64();
+ Expect(scalar, EScalarType::UInt64);
+ return scalar.AsUInt64();
}
-
+
template <>
inline double ReadScalar<double>(TReader& reader) {
const auto& scalar = ReadScalar(reader);
- Expect(scalar, EScalarType::Float64);
- return scalar.AsFloat64();
+ Expect(scalar, EScalarType::Float64);
+ return scalar.AsFloat64();
}
-
+
template <>
inline TStringBuf ReadScalar<TStringBuf>(TReader& reader) {
const auto& scalar = ReadScalar(reader);
- Expect(scalar, EScalarType::String);
- return scalar.AsString();
+ Expect(scalar, EScalarType::String);
+ return scalar.AsString();
}
-
+
template <>
inline TString ReadScalar<TString>(TReader& reader) {
return TString(ReadScalar<TStringBuf>(reader));
}
-
+
template <>
inline bool ReadScalar<bool>(TReader& reader) {
const auto& scalar = ReadScalar(reader);
- Expect(scalar, EScalarType::Boolean);
- return scalar.AsBoolean();
+ Expect(scalar, EScalarType::Boolean);
+ return scalar.AsBoolean();
}
-
+
// Skip value that was already started with `event`
void SkipCurrentValue(const TEvent& event, TReader& reader);
-
+
// Skip value that starts at `reader.next_event()`
void SkipValue(TReader& reader);
-
- // Skip values with attributes, wait for map value
- void SkipControlRecords(TReader& reader);
+
+ // Skip values with attributes, wait for map value
+ void SkipControlRecords(TReader& reader);
}
}
diff --git a/library/cpp/yson_pull/reader.cpp b/library/cpp/yson_pull/reader.cpp
index ea26852756..655ab8e4ad 100644
--- a/library/cpp/yson_pull/reader.cpp
+++ b/library/cpp/yson_pull/reader.cpp
@@ -1,27 +1,27 @@
-#include "reader.h"
+#include "reader.h"
#include <library/cpp/yson_pull/detail/reader.h>
-
-using namespace NYsonPull;
-
-TReader::TReader(
- THolder<NInput::IStream> stream,
+
+using namespace NYsonPull;
+
+TReader::TReader(
+ THolder<NInput::IStream> stream,
EStreamType mode)
- : Stream_{std::move(stream)}
- , Impl_{MakeHolder<NDetail::reader_impl>(*Stream_, mode)} {
+ : Stream_{std::move(stream)}
+ , Impl_{MakeHolder<NDetail::reader_impl>(*Stream_, mode)} {
}
-
+
TReader::TReader(TReader&& other) noexcept
- : Stream_{std::move(other.Stream_)}
- , Impl_{std::move(other.Impl_)} {
+ : Stream_{std::move(other.Stream_)}
+ , Impl_{std::move(other.Impl_)} {
}
-
+
TReader::~TReader() {
}
-
-const TEvent& TReader::NextEvent() {
- return Impl_->next_event();
-}
-
-const TEvent& TReader::LastEvent() const noexcept {
- return Impl_->last_event();
-}
+
+const TEvent& TReader::NextEvent() {
+ return Impl_->next_event();
+}
+
+const TEvent& TReader::LastEvent() const noexcept {
+ return Impl_->last_event();
+}
diff --git a/library/cpp/yson_pull/reader.h b/library/cpp/yson_pull/reader.h
index f839b19071..ad47fa0ea2 100644
--- a/library/cpp/yson_pull/reader.h
+++ b/library/cpp/yson_pull/reader.h
@@ -1,37 +1,37 @@
-#pragma once
-
-#include "event.h"
-#include "input.h"
-#include "stream_type.h"
-
-#include <util/system/yassert.h>
-
-#include <memory>
-
-namespace NYsonPull {
+#pragma once
+
+#include "event.h"
+#include "input.h"
+#include "stream_type.h"
+
+#include <util/system/yassert.h>
+
+#include <memory>
+
+namespace NYsonPull {
namespace NDetail {
class reader_impl;
}
-
+
//! \brief YSON reader facade class.
//!
//! Owns an input stream.
class TReader {
- THolder<NInput::IStream> Stream_;
- THolder<NDetail::reader_impl> Impl_;
-
+ THolder<NInput::IStream> Stream_;
+ THolder<NDetail::reader_impl> Impl_;
+
public:
TReader(THolder<NInput::IStream> stream, EStreamType mode);
TReader(TReader&&) noexcept;
~TReader();
-
+
//! \brief Advance stream to next event and return it.
//!
- //! Any event data is invalidated by a call to NextEvent();
- const TEvent& NextEvent();
-
+ //! Any event data is invalidated by a call to NextEvent();
+ const TEvent& NextEvent();
+
//! \brief Get last returned event.
- const TEvent& LastEvent() const noexcept;
+ const TEvent& LastEvent() const noexcept;
};
-
+
}
diff --git a/library/cpp/yson_pull/scalar.cpp b/library/cpp/yson_pull/scalar.cpp
index 4325542e7a..adc24ba8d3 100644
--- a/library/cpp/yson_pull/scalar.cpp
+++ b/library/cpp/yson_pull/scalar.cpp
@@ -1,57 +1,57 @@
-#include "scalar.h"
-
+#include "scalar.h"
+
#include <library/cpp/yson_pull/detail/cescape.h>
-
-#include <util/stream/output.h>
-
-using namespace NYsonPull;
-
+
+#include <util/stream/output.h>
+
+using namespace NYsonPull;
+
template <>
void Out<TScalar>(IOutputStream& out, const TScalar& value) {
- out << '(' << value.Type();
- if (value.Type() != EScalarType::Entity) {
- out << ' ';
- }
- switch (value.Type()) {
- case EScalarType::Boolean:
- out << (value.AsBoolean() ? "true" : "false");
- break;
- case EScalarType::String:
- out << NYsonPull::NDetail::NCEscape::quote(value.AsString());
- break;
- case EScalarType::Int64:
- out << value.AsInt64();
- break;
- case EScalarType::UInt64:
- out << value.AsUInt64();
- break;
- case EScalarType::Float64:
- out << value.AsFloat64();
- break;
+ out << '(' << value.Type();
+ if (value.Type() != EScalarType::Entity) {
+ out << ' ';
+ }
+ switch (value.Type()) {
+ case EScalarType::Boolean:
+ out << (value.AsBoolean() ? "true" : "false");
+ break;
+ case EScalarType::String:
+ out << NYsonPull::NDetail::NCEscape::quote(value.AsString());
+ break;
+ case EScalarType::Int64:
+ out << value.AsInt64();
+ break;
+ case EScalarType::UInt64:
+ out << value.AsUInt64();
+ break;
+ case EScalarType::Float64:
+ out << value.AsFloat64();
+ break;
default:
break;
- }
- out << ')';
-}
-
+ }
+ out << ')';
+}
+
bool NYsonPull::operator==(const TScalar& left, const TScalar& right) noexcept {
- if (left.Type() != right.Type()) {
- return false;
- }
- switch (left.Type()) {
- case EScalarType::Boolean:
- return left.AsBoolean() == right.AsBoolean();
- case EScalarType::String:
- return left.AsString() == right.AsString();
- case EScalarType::Int64:
- return left.AsInt64() == right.AsInt64();
- case EScalarType::UInt64:
- return left.AsUInt64() == right.AsUInt64();
- case EScalarType::Float64:
- return left.AsFloat64() == right.AsFloat64();
- case EScalarType::Entity:
- return true;
+ if (left.Type() != right.Type()) {
+ return false;
+ }
+ switch (left.Type()) {
+ case EScalarType::Boolean:
+ return left.AsBoolean() == right.AsBoolean();
+ case EScalarType::String:
+ return left.AsString() == right.AsString();
+ case EScalarType::Int64:
+ return left.AsInt64() == right.AsInt64();
+ case EScalarType::UInt64:
+ return left.AsUInt64() == right.AsUInt64();
+ case EScalarType::Float64:
+ return left.AsFloat64() == right.AsFloat64();
+ case EScalarType::Entity:
+ return true;
default:
- Y_UNREACHABLE();
- }
-}
+ Y_UNREACHABLE();
+ }
+}
diff --git a/library/cpp/yson_pull/scalar.h b/library/cpp/yson_pull/scalar.h
index 509fce8b5e..35d5d08379 100644
--- a/library/cpp/yson_pull/scalar.h
+++ b/library/cpp/yson_pull/scalar.h
@@ -1,146 +1,146 @@
-#pragma once
-
-#include "cyson_enums.h"
-
-#include <util/generic/strbuf.h>
-#include <util/system/types.h>
-#include <util/system/yassert.h>
-
-namespace NYsonPull {
+#pragma once
+
+#include "cyson_enums.h"
+
+#include <util/generic/strbuf.h>
+#include <util/system/types.h>
+#include <util/system/yassert.h>
+
+namespace NYsonPull {
//! \brief YSON TScalar value type tag
enum class EScalarType {
- Entity = YSON_SCALAR_ENTITY,
- Boolean = YSON_SCALAR_BOOLEAN,
- Int64 = YSON_SCALAR_INT64,
- UInt64 = YSON_SCALAR_UINT64,
- Float64 = YSON_SCALAR_FLOAT64,
- String = YSON_SCALAR_STRING,
+ Entity = YSON_SCALAR_ENTITY,
+ Boolean = YSON_SCALAR_BOOLEAN,
+ Int64 = YSON_SCALAR_INT64,
+ UInt64 = YSON_SCALAR_UINT64,
+ Float64 = YSON_SCALAR_FLOAT64,
+ String = YSON_SCALAR_STRING,
};
-
+
//! \brief YSON TScalar value variant
class TScalar {
//! \internal \brief YSON TScalar value underlying representation
- union TScalarValue {
- struct TScalarStringRef {
- const char* Data;
- size_t Size;
+ union TScalarValue {
+ struct TScalarStringRef {
+ const char* Data;
+ size_t Size;
};
-
+
ui8 AsNothing[1];
- bool AsBoolean;
- i64 AsInt64;
- ui64 AsUInt64;
- double AsFloat64;
- TScalarStringRef AsString;
-
- constexpr TScalarValue()
- : AsNothing{} {
+ bool AsBoolean;
+ i64 AsInt64;
+ ui64 AsUInt64;
+ double AsFloat64;
+ TScalarStringRef AsString;
+
+ constexpr TScalarValue()
+ : AsNothing{} {
}
-
- explicit constexpr TScalarValue(bool value)
- : AsBoolean{value} {
+
+ explicit constexpr TScalarValue(bool value)
+ : AsBoolean{value} {
}
-
- explicit constexpr TScalarValue(i64 value)
- : AsInt64{value} {
+
+ explicit constexpr TScalarValue(i64 value)
+ : AsInt64{value} {
}
-
- explicit constexpr TScalarValue(ui64 value)
- : AsUInt64{value} {
+
+ explicit constexpr TScalarValue(ui64 value)
+ : AsUInt64{value} {
}
-
- explicit constexpr TScalarValue(double value)
- : AsFloat64{value} {
+
+ explicit constexpr TScalarValue(double value)
+ : AsFloat64{value} {
}
-
- explicit constexpr TScalarValue(TStringBuf value)
- : AsString{value.data(), value.size()} {
+
+ explicit constexpr TScalarValue(TStringBuf value)
+ : AsString{value.data(), value.size()} {
}
};
static_assert(
- sizeof(TScalarValue) == sizeof(TStringBuf),
+ sizeof(TScalarValue) == sizeof(TStringBuf),
"bad scalar_value size");
-
- EScalarType Type_;
- TScalarValue Value_;
-
+
+ EScalarType Type_;
+ TScalarValue Value_;
+
public:
constexpr TScalar()
- : Type_{EScalarType::Entity} {
+ : Type_{EScalarType::Entity} {
}
-
+
explicit constexpr TScalar(bool value)
- : Type_{EScalarType::Boolean}
- , Value_{value} {
+ : Type_{EScalarType::Boolean}
+ , Value_{value} {
}
-
+
explicit constexpr TScalar(i64 value)
- : Type_{EScalarType::Int64}
- , Value_{value} {
+ : Type_{EScalarType::Int64}
+ , Value_{value} {
}
-
+
explicit constexpr TScalar(ui64 value)
- : Type_{EScalarType::UInt64}
- , Value_{value} {
+ : Type_{EScalarType::UInt64}
+ , Value_{value} {
}
-
+
explicit constexpr TScalar(double value)
- : Type_{EScalarType::Float64}
- , Value_{value} {
+ : Type_{EScalarType::Float64}
+ , Value_{value} {
}
-
+
explicit constexpr TScalar(TStringBuf value)
- : Type_{EScalarType::String}
- , Value_{value} {
+ : Type_{EScalarType::String}
+ , Value_{value} {
}
-
+
// Disambiguation for literal constants
// In the absence of this constructor,
// they get implicitly converted to bool (yikes!)
explicit TScalar(const char* value)
- : Type_{EScalarType::String}
- , Value_{TStringBuf{value}} {
+ : Type_{EScalarType::String}
+ , Value_{TStringBuf{value}} {
}
-
- EScalarType Type() const {
- return Type_;
+
+ EScalarType Type() const {
+ return Type_;
}
-
-#define CAST_TO(Type) \
- Y_ASSERT(Type_ == EScalarType::Type); \
- return Value_.As##Type
-
- bool AsBoolean() const {
- CAST_TO(Boolean);
+
+#define CAST_TO(Type) \
+ Y_ASSERT(Type_ == EScalarType::Type); \
+ return Value_.As##Type
+
+ bool AsBoolean() const {
+ CAST_TO(Boolean);
}
- i64 AsInt64() const {
- CAST_TO(Int64);
+ i64 AsInt64() const {
+ CAST_TO(Int64);
}
- ui64 AsUInt64() const {
- CAST_TO(UInt64);
+ ui64 AsUInt64() const {
+ CAST_TO(UInt64);
}
- double AsFloat64() const {
- CAST_TO(Float64);
+ double AsFloat64() const {
+ CAST_TO(Float64);
}
-#undef CAST_TO
-
- TStringBuf AsString() const {
- Y_ASSERT(Type_ == EScalarType::String);
+#undef CAST_TO
+
+ TStringBuf AsString() const {
+ Y_ASSERT(Type_ == EScalarType::String);
return TStringBuf{
- Value_.AsString.Data,
- Value_.AsString.Size,
+ Value_.AsString.Data,
+ Value_.AsString.Size,
};
}
-
- const TScalarValue& AsUnsafeValue() const {
- return Value_;
+
+ const TScalarValue& AsUnsafeValue() const {
+ return Value_;
}
};
-
+
bool operator==(const TScalar& left, const TScalar& right) noexcept;
-
+
inline bool operator!=(const TScalar& left, const TScalar& right) noexcept {
return !(left == right);
}
-
+
}
diff --git a/library/cpp/yson_pull/stream_type.h b/library/cpp/yson_pull/stream_type.h
index beac87fe1b..bb8b26c9a2 100644
--- a/library/cpp/yson_pull/stream_type.h
+++ b/library/cpp/yson_pull/stream_type.h
@@ -1,8 +1,8 @@
-#pragma once
-
-#include "cyson_enums.h"
-
-namespace NYsonPull {
+#pragma once
+
+#include "cyson_enums.h"
+
+namespace NYsonPull {
enum class EStreamType {
Node = YSON_STREAM_TYPE_NODE,
ListFragment = YSON_STREAM_TYPE_LIST_FRAGMENT,
diff --git a/library/cpp/yson_pull/ut/cescape_ut.cpp b/library/cpp/yson_pull/ut/cescape_ut.cpp
index 6628ba1d15..50b0f6ff09 100644
--- a/library/cpp/yson_pull/ut/cescape_ut.cpp
+++ b/library/cpp/yson_pull/ut/cescape_ut.cpp
@@ -1,10 +1,10 @@
#include <library/cpp/yson_pull/detail/cescape.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-using namespace NYsonPull::NDetail;
-
-namespace {
+
+using namespace NYsonPull::NDetail;
+
+namespace {
void test_roundtrip(const TVector<ui8>& str) {
TStringBuf str_buf(
reinterpret_cast<const char*>(str.data()),
@@ -17,7 +17,7 @@ namespace {
<< "B[" << tmp.size() << "]: " << tmp << '\n'
<< "C[" << dest.size() << "]: " << dest);
}
-
+
template <size_t N>
void test_exhaustive(TVector<ui8>& str) {
for (int i = 0; i < 256; ++i) {
@@ -25,33 +25,33 @@ namespace {
test_exhaustive<N - 1>(str);
}
}
-
+
template <>
void test_exhaustive<0>(TVector<ui8>& str) {
test_roundtrip(str);
- }
-
+ }
+
template <size_t N>
void test_exhaustive() {
TVector<ui8> str(N, ' ');
test_exhaustive<N>(str);
}
-
-} // anonymous namespace
-
+
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(CEscape) {
Y_UNIT_TEST(ExhaustiveOneChar) {
test_exhaustive<1>();
}
-
+
Y_UNIT_TEST(ExhaustiveTwoChars) {
test_exhaustive<2>();
}
-
+
Y_UNIT_TEST(ExhaustiveThreeChars) {
test_exhaustive<3>();
}
-
+
Y_UNIT_TEST(SpecialEscapeEncode) {
//UNIT_ASSERT_VALUES_EQUAL(R"(\b)", NCEscape::encode("\b"));
//UNIT_ASSERT_VALUES_EQUAL(R"(\f)", NCEscape::encode("\f"));
@@ -59,7 +59,7 @@ Y_UNIT_TEST_SUITE(CEscape) {
UNIT_ASSERT_VALUES_EQUAL(R"(\r)", NCEscape::encode("\r"));
UNIT_ASSERT_VALUES_EQUAL(R"(\t)", NCEscape::encode("\t"));
}
-
+
Y_UNIT_TEST(SpecialEscapeDecode) {
UNIT_ASSERT_VALUES_EQUAL("\b", NCEscape::decode(R"(\b)"));
UNIT_ASSERT_VALUES_EQUAL("\f", NCEscape::decode(R"(\f)"));
@@ -67,5 +67,5 @@ Y_UNIT_TEST_SUITE(CEscape) {
UNIT_ASSERT_VALUES_EQUAL("\r", NCEscape::decode(R"(\r)"));
UNIT_ASSERT_VALUES_EQUAL("\t", NCEscape::decode(R"(\t)"));
}
-
+
} // Y_UNIT_TEST_SUITE(CEscape)
diff --git a/library/cpp/yson_pull/ut/loop_ut.cpp b/library/cpp/yson_pull/ut/loop_ut.cpp
index 8c7b11dd1c..b7f4086ba2 100644
--- a/library/cpp/yson_pull/ut/loop_ut.cpp
+++ b/library/cpp/yson_pull/ut/loop_ut.cpp
@@ -2,18 +2,18 @@
#include <library/cpp/yson_pull/output.h>
#include <library/cpp/yson_pull/reader.h>
#include <library/cpp/yson_pull/writer.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-#include <cerrno>
-#include <cmath>
-
-#ifdef _unix_
-#include <unistd.h>
-#include <sys/wait.h>
-#endif
-
-namespace {
+
+#include <cerrno>
+#include <cmath>
+
+#ifdef _unix_
+#include <unistd.h>
+#include <sys/wait.h>
+#endif
+
+namespace {
constexpr const char* alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -30,215 +30,215 @@ namespace {
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
-
+
void generate(NYsonPull::TWriter& writer, size_t count) {
- writer.BeginStream();
+ writer.BeginStream();
for (size_t i = 0; i < count; ++i) {
- writer.BeginMap()
- .Key("ints")
- .BeginList()
- .Int64(0)
- .Int64(-1)
- .Int64(1000)
- .Int64(-1000)
- .EndList()
- .Key("uints")
- .BeginList()
- .UInt64(0)
- .UInt64(1000)
- .UInt64(10000000)
- .EndList()
- .Key("entities")
- .BeginList()
- .Entity()
- .BeginAttributes()
- .Key("color")
- .String("blue")
- .Key("size")
- .Int64(100)
- .EndAttributes()
- .Entity()
- .Entity()
- .EndList()
- .Key("booleans")
- .BeginList()
- .Boolean(true)
- .Boolean(false)
- .Boolean(true)
- .EndList()
- .Key("floats")
- .BeginList()
- .Float64(0.0)
- .Float64(13.0e30)
- .Float64(M_PI)
- .EndList()
- .Key("strings")
- .BeginList()
- .String("hello")
- .String("")
- .String("foo \"-bar-\" baz")
- .String("oh\nwow")
- .String(alphabet)
- .EndList()
- .EndMap();
+ writer.BeginMap()
+ .Key("ints")
+ .BeginList()
+ .Int64(0)
+ .Int64(-1)
+ .Int64(1000)
+ .Int64(-1000)
+ .EndList()
+ .Key("uints")
+ .BeginList()
+ .UInt64(0)
+ .UInt64(1000)
+ .UInt64(10000000)
+ .EndList()
+ .Key("entities")
+ .BeginList()
+ .Entity()
+ .BeginAttributes()
+ .Key("color")
+ .String("blue")
+ .Key("size")
+ .Int64(100)
+ .EndAttributes()
+ .Entity()
+ .Entity()
+ .EndList()
+ .Key("booleans")
+ .BeginList()
+ .Boolean(true)
+ .Boolean(false)
+ .Boolean(true)
+ .EndList()
+ .Key("floats")
+ .BeginList()
+ .Float64(0.0)
+ .Float64(13.0e30)
+ .Float64(M_PI)
+ .EndList()
+ .Key("strings")
+ .BeginList()
+ .String("hello")
+ .String("")
+ .String("foo \"-bar-\" baz")
+ .String("oh\nwow")
+ .String(alphabet)
+ .EndList()
+ .EndMap();
}
- writer.EndStream();
- }
-
-#ifdef __clang__
+ writer.EndStream();
+ }
+
+#ifdef __clang__
// XXX: With all the macros below (esp. UNIT_ASSERT_VALUES_EQUAL) unfolded,
// the time it takes clang to optimize generated code becomes abysmal.
// Locally disabling optimization brings it back to normal.
__attribute__((optnone))
-#endif // __clang__
+#endif // __clang__
void
verify(NYsonPull::TReader& reader, size_t count) {
#define NEXT(name__) \
{ \
- auto& name__ = reader.NextEvent(); // SCOPED_TRACE(e);
-#define END_NEXT }
+ auto& name__ = reader.NextEvent(); // SCOPED_TRACE(e);
+#define END_NEXT }
#define NEXT_TYPE(type__) \
NEXT(e) { \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::type__, e.Type()); \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::type__, e.Type()); \
} \
END_NEXT
#define NEXT_KEY(key__) \
NEXT(e) { \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type()); \
- UNIT_ASSERT_VALUES_EQUAL(key__, e.AsString()); \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type()); \
+ UNIT_ASSERT_VALUES_EQUAL(key__, e.AsString()); \
} \
END_NEXT
-#define NEXT_SCALAR(type__, value__) \
- NEXT(e) { \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type()); \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::type__, e.AsScalar().Type()); \
- UNIT_ASSERT_VALUES_EQUAL(value__, e.AsScalar().As##type__()); \
- } \
- END_NEXT
-#define NEXT_ENTITY() \
- NEXT(e) { \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type()); \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Entity, e.AsScalar().Type()); \
- } \
+#define NEXT_SCALAR(type__, value__) \
+ NEXT(e) { \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type()); \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::type__, e.AsScalar().Type()); \
+ UNIT_ASSERT_VALUES_EQUAL(value__, e.AsScalar().As##type__()); \
+ } \
END_NEXT
-#define NEXT_FLOAT64(value__) \
+#define NEXT_ENTITY() \
+ NEXT(e) { \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type()); \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Entity, e.AsScalar().Type()); \
+ } \
+ END_NEXT
+#define NEXT_FLOAT64(value__) \
NEXT(e) { \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type()); \
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Float64, e.AsScalar().Type()); \
- UNIT_ASSERT_DOUBLES_EQUAL(value__, e.AsScalar().AsFloat64(), 1e-5); \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type()); \
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Float64, e.AsScalar().Type()); \
+ UNIT_ASSERT_DOUBLES_EQUAL(value__, e.AsScalar().AsFloat64(), 1e-5); \
} \
END_NEXT
-
+
constexpr auto true_ = true;
constexpr auto false_ = false;
-
- NEXT_TYPE(BeginStream);
+
+ NEXT_TYPE(BeginStream);
for (size_t i = 0; i < count; ++i) {
- NEXT_TYPE(BeginMap);
+ NEXT_TYPE(BeginMap);
NEXT_KEY("ints") {
- NEXT_TYPE(BeginList);
- NEXT_SCALAR(Int64, 0);
- NEXT_SCALAR(Int64, -1);
- NEXT_SCALAR(Int64, 1000);
- NEXT_SCALAR(Int64, -1000);
- NEXT_TYPE(EndList);
+ NEXT_TYPE(BeginList);
+ NEXT_SCALAR(Int64, 0);
+ NEXT_SCALAR(Int64, -1);
+ NEXT_SCALAR(Int64, 1000);
+ NEXT_SCALAR(Int64, -1000);
+ NEXT_TYPE(EndList);
}
NEXT_KEY("uints") {
- NEXT_TYPE(BeginList);
- NEXT_SCALAR(UInt64, 0U);
- NEXT_SCALAR(UInt64, 1000U);
- NEXT_SCALAR(UInt64, 10000000U);
- NEXT_TYPE(EndList);
+ NEXT_TYPE(BeginList);
+ NEXT_SCALAR(UInt64, 0U);
+ NEXT_SCALAR(UInt64, 1000U);
+ NEXT_SCALAR(UInt64, 10000000U);
+ NEXT_TYPE(EndList);
}
NEXT_KEY("entities") {
- NEXT_TYPE(BeginList);
+ NEXT_TYPE(BeginList);
NEXT_ENTITY();
- NEXT_TYPE(BeginAttributes) {
+ NEXT_TYPE(BeginAttributes) {
NEXT_KEY("color") {
- NEXT_SCALAR(String, "blue");
+ NEXT_SCALAR(String, "blue");
}
NEXT_KEY("size") {
- NEXT_SCALAR(Int64, 100);
+ NEXT_SCALAR(Int64, 100);
}
- }
- NEXT_TYPE(EndAttributes);
+ }
+ NEXT_TYPE(EndAttributes);
NEXT_ENTITY();
NEXT_ENTITY();
- NEXT_TYPE(EndList);
+ NEXT_TYPE(EndList);
}
NEXT_KEY("booleans") {
- NEXT_TYPE(BeginList);
- NEXT_SCALAR(Boolean, true_);
- NEXT_SCALAR(Boolean, false_);
- NEXT_SCALAR(Boolean, true_);
- NEXT_TYPE(EndList);
+ NEXT_TYPE(BeginList);
+ NEXT_SCALAR(Boolean, true_);
+ NEXT_SCALAR(Boolean, false_);
+ NEXT_SCALAR(Boolean, true_);
+ NEXT_TYPE(EndList);
}
NEXT_KEY("floats") {
- NEXT_TYPE(BeginList);
+ NEXT_TYPE(BeginList);
NEXT_FLOAT64(0.0);
NEXT_FLOAT64(13.0e30);
NEXT_FLOAT64(M_PI);
- NEXT_TYPE(EndList);
+ NEXT_TYPE(EndList);
}
NEXT_KEY("strings") {
- NEXT_TYPE(BeginList);
- NEXT_SCALAR(String, "hello");
- NEXT_SCALAR(String, "");
- NEXT_SCALAR(String, "foo \"-bar-\" baz");
- NEXT_SCALAR(String, "oh\nwow");
- NEXT_SCALAR(String, alphabet);
- NEXT_TYPE(EndList);
+ NEXT_TYPE(BeginList);
+ NEXT_SCALAR(String, "hello");
+ NEXT_SCALAR(String, "");
+ NEXT_SCALAR(String, "foo \"-bar-\" baz");
+ NEXT_SCALAR(String, "oh\nwow");
+ NEXT_SCALAR(String, alphabet);
+ NEXT_TYPE(EndList);
}
- NEXT_TYPE(EndMap);
- }
- NEXT_TYPE(EndStream);
-
-#undef NEXT
-#undef END_NEXT
-#undef NEXT_TYPE
-#undef NEXT_KEY
-#undef NEXT_SCALAR
+ NEXT_TYPE(EndMap);
+ }
+ NEXT_TYPE(EndStream);
+
+#undef NEXT
+#undef END_NEXT
+#undef NEXT_TYPE
+#undef NEXT_KEY
+#undef NEXT_SCALAR
}
-
+
class sys_error {};
-
+
IOutputStream& operator<<(IOutputStream& stream, const sys_error&) {
stream << strerror(errno);
return stream;
}
-
- NYsonPull::TReader make_reader(THolder<NYsonPull::NInput::IStream> stream) {
- return NYsonPull::TReader(
- std::move(stream),
- NYsonPull::EStreamType::ListFragment);
- }
-
- template <typename Function>
- void test_memory(Function make_writer, size_t nrepeat) {
+
+ NYsonPull::TReader make_reader(THolder<NYsonPull::NInput::IStream> stream) {
+ return NYsonPull::TReader(
+ std::move(stream),
+ NYsonPull::EStreamType::ListFragment);
+ }
+
+ template <typename Function>
+ void test_memory(Function make_writer, size_t nrepeat) {
TString text;
- {
- auto writer = make_writer(NYsonPull::NOutput::FromString(&text));
- generate(writer, nrepeat);
- }
- {
- auto reader = make_reader(NYsonPull::NInput::FromMemory(text));
- verify(reader, nrepeat);
- }
- {
- TStringInput input(text);
- auto reader = make_reader(NYsonPull::NInput::FromInputStream(&input, /* buffer_size = */ 1));
- verify(reader, nrepeat);
- }
- }
-
-#ifdef _unix_
+ {
+ auto writer = make_writer(NYsonPull::NOutput::FromString(&text));
+ generate(writer, nrepeat);
+ }
+ {
+ auto reader = make_reader(NYsonPull::NInput::FromMemory(text));
+ verify(reader, nrepeat);
+ }
+ {
+ TStringInput input(text);
+ auto reader = make_reader(NYsonPull::NInput::FromInputStream(&input, /* buffer_size = */ 1));
+ verify(reader, nrepeat);
+ }
+ }
+
+#ifdef _unix_
template <typename Here, typename There>
void pipe(Here&& reader, There&& writer) {
int fildes[2];
UNIT_ASSERT_VALUES_EQUAL_C(0, ::pipe(fildes), sys_error());
auto read_fd = fildes[0];
auto write_fd = fildes[1];
-
+
auto pid = ::fork();
UNIT_ASSERT_C(pid >= 0, sys_error());
if (pid > 0) {
@@ -255,8 +255,8 @@ namespace {
}
int stat_loc;
UNIT_ASSERT_VALUES_EQUAL_C(pid, ::waitpid(pid, &stat_loc, 0), sys_error());
- }
-
+ }
+
template <typename Function>
void test_posix_fd(
Function make_writer,
@@ -265,15 +265,15 @@ namespace {
size_t write_buffer_size) {
pipe(
[&](int fd) {
- auto reader = make_reader(NYsonPull::NInput::FromPosixFd(fd, read_buffer_size));
+ auto reader = make_reader(NYsonPull::NInput::FromPosixFd(fd, read_buffer_size));
verify(reader, nrepeat);
},
[&](int fd) {
- auto writer = make_writer(NYsonPull::NOutput::FromPosixFd(fd, write_buffer_size));
+ auto writer = make_writer(NYsonPull::NOutput::FromPosixFd(fd, write_buffer_size));
generate(writer, nrepeat);
});
}
-
+
template <typename Function>
void test_stdio_file(
Function make_writer,
@@ -284,99 +284,99 @@ namespace {
[&](int fd) {
auto file = ::fdopen(fd, "rb");
UNIT_ASSERT_C(file != nullptr, sys_error());
- auto reader = make_reader(NYsonPull::NInput::FromStdioFile(file, read_buffer_size));
+ auto reader = make_reader(NYsonPull::NInput::FromStdioFile(file, read_buffer_size));
verify(reader, nrepeat);
},
[&](int fd) {
auto file = ::fdopen(fd, "wb");
Y_UNUSED(write_buffer_size);
- auto writer = make_writer(NYsonPull::NOutput::FromStdioFile(file, write_buffer_size));
+ auto writer = make_writer(NYsonPull::NOutput::FromStdioFile(file, write_buffer_size));
generate(writer, nrepeat);
fflush(file);
});
}
-#endif
-
+#endif
+
NYsonPull::TWriter text(THolder<NYsonPull::NOutput::IStream> stream) {
- return NYsonPull::MakeTextWriter(
+ return NYsonPull::MakeTextWriter(
std::move(stream),
NYsonPull::EStreamType::ListFragment);
}
-
+
NYsonPull::TWriter pretty_text(THolder<NYsonPull::NOutput::IStream> stream) {
- return NYsonPull::MakePrettyTextWriter(
+ return NYsonPull::MakePrettyTextWriter(
std::move(stream),
NYsonPull::EStreamType::ListFragment);
}
-
+
NYsonPull::TWriter binary(THolder<NYsonPull::NOutput::IStream> stream) {
- return NYsonPull::MakeBinaryWriter(
+ return NYsonPull::MakeBinaryWriter(
std::move(stream),
NYsonPull::EStreamType::ListFragment);
}
-} // anonymous namespace
-
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(Loop) {
Y_UNIT_TEST(memory_pretty_text) {
test_memory(pretty_text, 100);
}
-
+
Y_UNIT_TEST(memory_text) {
test_memory(text, 100);
}
-
+
Y_UNIT_TEST(memory_binary) {
test_memory(binary, 100);
}
-
-#ifdef _unix_
+
+#ifdef _unix_
Y_UNIT_TEST(posix_fd_pretty_text_buffered) {
test_posix_fd(pretty_text, 100, 1024, 1024);
}
-
+
Y_UNIT_TEST(posix_fd_pretty_text_unbuffered) {
test_posix_fd(pretty_text, 100, 1, 0);
}
-
+
Y_UNIT_TEST(posix_fd_text_buffered) {
test_posix_fd(text, 100, 1024, 1024);
}
-
+
Y_UNIT_TEST(posix_fd_text_unbuffered) {
test_posix_fd(text, 100, 1, 0);
}
-
+
Y_UNIT_TEST(posix_fd_binary_buffered) {
test_posix_fd(binary, 100, 1024, 1024);
}
-
+
Y_UNIT_TEST(posix_fd_binary_unbuffered) {
test_posix_fd(binary, 100, 1, 0);
}
-
+
Y_UNIT_TEST(stdio_file_pretty_text_buffered) {
test_stdio_file(pretty_text, 100, 1024, 1024);
}
-
+
Y_UNIT_TEST(stdio_file_pretty_text_unbuffered) {
test_stdio_file(pretty_text, 100, 1, 0);
}
-
+
Y_UNIT_TEST(stdio_file_text_buffered) {
test_stdio_file(text, 100, 1024, 1024);
}
-
+
Y_UNIT_TEST(stdio_file_text_unbuffered) {
test_stdio_file(text, 100, 1, 0);
}
-
+
Y_UNIT_TEST(stdio_file_binary_buffered) {
test_stdio_file(binary, 100, 1024, 1024);
}
-
+
Y_UNIT_TEST(stdio_file_binary_unbuffered) {
test_stdio_file(binary, 100, 1, 0);
}
-#endif
+#endif
} // Y_UNIT_TEST_SUITE(Loop)
diff --git a/library/cpp/yson_pull/ut/reader_ut.cpp b/library/cpp/yson_pull/ut/reader_ut.cpp
index 1184265ddb..c8853f0ec9 100644
--- a/library/cpp/yson_pull/ut/reader_ut.cpp
+++ b/library/cpp/yson_pull/ut/reader_ut.cpp
@@ -3,24 +3,24 @@
#include <library/cpp/yson_pull/reader.h>
#include <library/cpp/yson_pull/detail/cescape.h>
#include <library/cpp/yson_pull/detail/macros.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
-namespace {
+
+namespace {
NYsonPull::TReader memory_reader(TStringBuf data, NYsonPull::EStreamType mode) {
return NYsonPull::TReader(
NYsonPull::NInput::FromMemory(data),
mode);
}
-
+
template <typename T>
void expect_scalar(const NYsonPull::TScalar& scalar, T value) {
UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{value}, scalar);
}
-
+
template <>
void expect_scalar(const NYsonPull::TScalar& scalar, double value) {
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Float64, scalar.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EScalarType::Float64, scalar.Type());
auto scalarValue = scalar.AsFloat64();
auto message = TStringBuilder() << "expected " << value << ", got " << scalarValue;
@@ -36,55 +36,55 @@ namespace {
UNIT_ASSERT_C(std::isinf(scalarValue) && (scalarValue < 0), message);
}
}
-
+
template <typename T>
void test_scalar(TStringBuf data, T value) {
// SCOPED_TRACE(NYsonPull::detail::cescape::quote(data));
auto reader = memory_reader(data, NYsonPull::EStreamType::Node);
-
+
try {
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
{
- auto& event = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, event.Type());
- expect_scalar(event.AsScalar(), value);
+ auto& event = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, event.Type());
+ expect_scalar(event.AsScalar(), value);
}
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
} catch (const std::exception& err) {
UNIT_FAIL(err.what());
- }
- }
-
+ }
+ }
+
void consume(TStringBuf data, NYsonPull::EStreamType mode = NYsonPull::EStreamType::Node) {
// SCOPED_TRACE(NYsonPull::detail::cescape::quote(data));
- auto input_range = NYsonPull::TStreamEventsRange(
+ auto input_range = NYsonPull::TStreamEventsRange(
NYsonPull::NInput::FromMemory(data),
mode);
for (auto& event : input_range) {
Y_UNUSED(event);
}
- }
-
-#define ACCEPT(data) UNIT_ASSERT_NO_EXCEPTION(consume(data))
-#define REJECT(data) UNIT_ASSERT_EXCEPTION(consume(data), NYsonPull::NException::TBadInput)
-
-#define ACCEPT2(data, mode) UNIT_ASSERT_NO_EXCEPTION(consume(data, mode))
-#define REJECT2(data, mode) UNIT_ASSERT_EXCEPTION(consume(data, mode), NYsonPull::NException::TBadInput)
-
-} // anonymous namespace
-
+ }
+
+#define ACCEPT(data) UNIT_ASSERT_NO_EXCEPTION(consume(data))
+#define REJECT(data) UNIT_ASSERT_EXCEPTION(consume(data), NYsonPull::NException::TBadInput)
+
+#define ACCEPT2(data, mode) UNIT_ASSERT_NO_EXCEPTION(consume(data, mode))
+#define REJECT2(data, mode) UNIT_ASSERT_EXCEPTION(consume(data, mode), NYsonPull::NException::TBadInput)
+
+} // anonymous namespace
+
Y_UNIT_TEST_SUITE(Reader) {
Y_UNIT_TEST(ScalarEntity) {
test_scalar(TStringBuf("#"), NYsonPull::TScalar{});
}
-
+
Y_UNIT_TEST(ScalarBoolean) {
test_scalar(TStringBuf("%true"), true);
test_scalar(TStringBuf("%false"), false);
-
+
test_scalar(TStringBuf("\x05"sv), true);
test_scalar(TStringBuf("\x04"sv), false);
-
+
REJECT("%");
REJECT("%trueth");
REJECT("%tru");
@@ -92,7 +92,7 @@ Y_UNIT_TEST_SUITE(Reader) {
REJECT("%fals");
REJECT("%hithere");
}
-
+
Y_UNIT_TEST(ScalarInt64) {
test_scalar(TStringBuf("1"), i64{1});
test_scalar(TStringBuf("+1"), i64{1});
@@ -101,17 +101,17 @@ Y_UNIT_TEST_SUITE(Reader) {
test_scalar(TStringBuf("-100000"), i64{-100000});
test_scalar(TStringBuf("9223372036854775807"), i64{9223372036854775807});
test_scalar(TStringBuf("+9223372036854775807"), i64{9223372036854775807});
-
+
test_scalar(TStringBuf("\x02\x02"sv), i64{1});
test_scalar(TStringBuf("\x02\xc0\x9a\x0c"sv), i64{100000});
test_scalar(TStringBuf("\x02\xbf\x9a\x0c"sv), i64{-100000});
test_scalar(TStringBuf("\x02\xfe\xff\xff\xff\xff\xff\xff\xff\xff\x01"sv), i64{9223372036854775807});
-
+
REJECT("1a2");
REJECT("1-1-1-1");
REJECT("1+0");
}
-
+
Y_UNIT_TEST(SclarUInt64) {
test_scalar(TStringBuf("1u"), ui64{1});
test_scalar(TStringBuf("+1u"), ui64{1});
@@ -121,14 +121,14 @@ Y_UNIT_TEST_SUITE(Reader) {
test_scalar(TStringBuf("+9223372036854775807u"), ui64{9223372036854775807u});
test_scalar(TStringBuf("18446744073709551615u"), ui64{18446744073709551615u});
test_scalar(TStringBuf("+18446744073709551615u"), ui64{18446744073709551615u});
-
+
REJECT("1a2u");
REJECT("1-1-1-1u");
REJECT("1+0u");
-
+
// TODO: binary
}
-
+
Y_UNIT_TEST(ScalarFloat64) {
test_scalar(TStringBuf("0.0"), double{0.0});
test_scalar(TStringBuf("+0.0"), double{0.0});
@@ -148,19 +148,19 @@ Y_UNIT_TEST_SUITE(Reader) {
test_scalar(TStringBuf("1e-12"), double{1e-12});
test_scalar(TStringBuf("+1e-12"), double{1e-12});
test_scalar(TStringBuf("-1e-12"), double{-1e-12});
-
+
test_scalar(TStringBuf("\x03\x00\x00\x00\x00\x00\x00\x00\x00"sv), double{0.0});
-
- test_scalar(
+
+ test_scalar(
TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf8\x7f"sv),
double{std::numeric_limits<double>::quiet_NaN()});
test_scalar(
TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\x7f"sv),
- double{std::numeric_limits<double>::infinity()});
- test_scalar(
+ double{std::numeric_limits<double>::infinity()});
+ test_scalar(
TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\xff"sv),
- double{-std::numeric_limits<double>::infinity()});
-
+ double{-std::numeric_limits<double>::infinity()});
+
test_scalar(
TStringBuf("%nan"),
double{std::numeric_limits<double>::quiet_NaN()});
@@ -170,14 +170,14 @@ Y_UNIT_TEST_SUITE(Reader) {
test_scalar(
TStringBuf("%-inf"),
double{-std::numeric_limits<double>::infinity()});
-
+
REJECT("++0.0");
REJECT("++1.0");
REJECT("++.1");
REJECT("1.0.0");
//REJECT("1e+10000");
REJECT(TStringBuf("\x03\x00\x00\x00\x00\x00\x00\x00"sv));
-
+
// XXX: Questionable behaviour?
ACCEPT("+.0");
ACCEPT("-.0");
@@ -192,7 +192,7 @@ Y_UNIT_TEST_SUITE(Reader) {
REJECT("%in");
REJECT("%-in");
}
-
+
Y_UNIT_TEST(ScalarString) {
test_scalar(TStringBuf(R"(foobar)"), TStringBuf("foobar"));
test_scalar(TStringBuf(R"(foobar11)"), TStringBuf("foobar11"));
@@ -200,115 +200,115 @@ Y_UNIT_TEST_SUITE(Reader) {
// wat? "\x0cf" parsed as a single char? no way!
test_scalar("\x01\x0c" "foobar"sv,
TStringBuf("foobar"));
-
+
REJECT(R"("foobar)");
REJECT("\x01\x0c" "fooba"sv);
REJECT("\x01\x0d" "foobar"sv); // negative length
}
-
+
Y_UNIT_TEST(EmptyList) {
auto reader = memory_reader("[]", NYsonPull::EStreamType::Node);
-
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginList, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndList, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
-
+
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginList, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndList, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
+
REJECT("[");
REJECT("]");
}
-
+
Y_UNIT_TEST(EmptyMap) {
auto reader = memory_reader("{}", NYsonPull::EStreamType::Node);
-
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginMap, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndMap, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
-
+
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginMap, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndMap, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
+
REJECT("{");
REJECT("}");
}
-
+
Y_UNIT_TEST(Sample) {
auto reader = memory_reader(
R"({"11"=11;"nothing"=#;"zero"=0.;"foo"="bar";"list"=[1;2;3]})",
NYsonPull::EStreamType::Node);
-
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginMap, reader.NextEvent().Type());
-
+
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginMap, reader.NextEvent().Type());
+
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
UNIT_ASSERT_VALUES_EQUAL(TStringBuf("11"), e.AsString());
}
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{11}}, e.AsScalar());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{11}}, e.AsScalar());
}
-
+
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
UNIT_ASSERT_VALUES_EQUAL(TStringBuf("nothing"), e.AsString());
}
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{}, e.AsScalar());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{}, e.AsScalar());
}
-
+
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
UNIT_ASSERT_VALUES_EQUAL(TStringBuf("zero"), e.AsString());
}
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{0.0}, e.AsScalar());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{0.0}, e.AsScalar());
}
-
+
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
UNIT_ASSERT_VALUES_EQUAL(TStringBuf("foo"), e.AsString());
}
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{TStringBuf("bar")}, e.AsScalar());
}
-
+
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Key, e.Type());
UNIT_ASSERT_VALUES_EQUAL(TStringBuf("list"), e.AsString());
}
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginList, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginList, reader.NextEvent().Type());
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{1}}, e.AsScalar());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{1}}, e.AsScalar());
}
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{2}}, e.AsScalar());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{2}}, e.AsScalar());
}
{
- auto& e = reader.NextEvent();
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{3}}, e.AsScalar());
+ auto& e = reader.NextEvent();
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, e.Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::TScalar{i64{3}}, e.AsScalar());
}
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndList, reader.NextEvent().Type());
-
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndMap, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
- }
-
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndList, reader.NextEvent().Type());
+
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndMap, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
+ }
+
Y_UNIT_TEST(Accept) {
ACCEPT("[]");
ACCEPT("{}");
@@ -318,7 +318,7 @@ Y_UNIT_TEST_SUITE(Reader) {
ACCEPT("[{};{};{};]");
ACCEPT("[<>{};<>{};<>{}]");
ACCEPT("[<>{};<>{};<>{};]");
-
+
ACCEPT("foo");
ACCEPT("[foo]");
ACCEPT("[foo;]");
@@ -328,83 +328,83 @@ Y_UNIT_TEST_SUITE(Reader) {
ACCEPT("{foo=<foo=foo>foo}");
ACCEPT("{foo=<foo=foo;>foo}");
ACCEPT("{foo=<foo=foo>[foo;foo]}");
- }
-
+ }
+
Y_UNIT_TEST(Reject) {
REJECT("[");
REJECT("{");
REJECT("<");
-
+
REJECT("[[}]");
REJECT("<>{]");
REJECT("[>]");
-
+
REJECT("<><>[]");
REJECT("[<>;<>]");
-
+
REJECT("{<>foo=foo}");
REJECT("{foo=<>}");
REJECT("{foo}");
-
+
REJECT("<a=b>");
REJECT("<>");
REJECT("@");
}
-
+
Y_UNIT_TEST(ReadPastEnd) {
auto reader = memory_reader("#", NYsonPull::EStreamType::Node);
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, reader.NextEvent().Type());
- UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
- UNIT_ASSERT_EXCEPTION(reader.NextEvent(), NYsonPull::NException::TBadInput);
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::BeginStream, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::Scalar, reader.NextEvent().Type());
+ UNIT_ASSERT_VALUES_EQUAL(NYsonPull::EEventType::EndStream, reader.NextEvent().Type());
+ UNIT_ASSERT_EXCEPTION(reader.NextEvent(), NYsonPull::NException::TBadInput);
}
-
- Y_UNIT_TEST(BadInput) {
- // max_size<ui32> < varint size < max_size<ui64>
- auto t = TString("\x01\xff\xff\xff\xff\xff\xff\xff\xff");
- auto reader = memory_reader(t, NYsonPull::EStreamType::Node);
-
- UNIT_ASSERT_EQUAL(reader.NextEvent().Type(), NYsonPull::EEventType::BeginStream);
- UNIT_ASSERT_EXCEPTION(reader.NextEvent(), NYsonPull::NException::TBadInput);
- }
-
+
+ Y_UNIT_TEST(BadInput) {
+ // max_size<ui32> < varint size < max_size<ui64>
+ auto t = TString("\x01\xff\xff\xff\xff\xff\xff\xff\xff");
+ auto reader = memory_reader(t, NYsonPull::EStreamType::Node);
+
+ UNIT_ASSERT_EQUAL(reader.NextEvent().Type(), NYsonPull::EEventType::BeginStream);
+ UNIT_ASSERT_EXCEPTION(reader.NextEvent(), NYsonPull::NException::TBadInput);
+ }
+
Y_UNIT_TEST(StreamType) {
- REJECT2("", NYsonPull::EStreamType::Node);
- ACCEPT2("", NYsonPull::EStreamType::ListFragment);
- ACCEPT2("", NYsonPull::EStreamType::MapFragment);
-
- ACCEPT2("[1]", NYsonPull::EStreamType::Node);
- ACCEPT2("[1]", NYsonPull::EStreamType::ListFragment);
- REJECT2("[1]", NYsonPull::EStreamType::MapFragment);
-
- ACCEPT2("<foo=bar>[1]", NYsonPull::EStreamType::Node);
- ACCEPT2("<foo=bar>[1]", NYsonPull::EStreamType::ListFragment);
- REJECT2("<foo=bar>[1]", NYsonPull::EStreamType::MapFragment);
-
- ACCEPT2(" [1] \t \t ", NYsonPull::EStreamType::Node);
- ACCEPT2(" [1] \t \t ", NYsonPull::EStreamType::ListFragment);
- REJECT2(" [1] \t \t ", NYsonPull::EStreamType::MapFragment);
-
- REJECT2("[1];", NYsonPull::EStreamType::Node);
- ACCEPT2("[1];", NYsonPull::EStreamType::ListFragment);
- REJECT2("[1];", NYsonPull::EStreamType::MapFragment);
-
- REJECT2("[1]; foobar", NYsonPull::EStreamType::Node);
- ACCEPT2("[1]; foobar", NYsonPull::EStreamType::ListFragment);
- REJECT2("[1]; foobar", NYsonPull::EStreamType::MapFragment);
-
- REJECT2("a=[1]", NYsonPull::EStreamType::Node);
- REJECT2("a=[1]", NYsonPull::EStreamType::ListFragment);
- ACCEPT2("a=[1]", NYsonPull::EStreamType::MapFragment);
-
- REJECT2("a=[1]; ", NYsonPull::EStreamType::Node);
- REJECT2("a=[1]; ", NYsonPull::EStreamType::ListFragment);
- ACCEPT2("a=[1]; ", NYsonPull::EStreamType::MapFragment);
-
- REJECT2("a=[1]; b=foobar", NYsonPull::EStreamType::Node);
- REJECT2("a=[1]; b=foobar", NYsonPull::EStreamType::ListFragment);
- ACCEPT2("a=[1]; b=foobar", NYsonPull::EStreamType::MapFragment);
+ REJECT2("", NYsonPull::EStreamType::Node);
+ ACCEPT2("", NYsonPull::EStreamType::ListFragment);
+ ACCEPT2("", NYsonPull::EStreamType::MapFragment);
+
+ ACCEPT2("[1]", NYsonPull::EStreamType::Node);
+ ACCEPT2("[1]", NYsonPull::EStreamType::ListFragment);
+ REJECT2("[1]", NYsonPull::EStreamType::MapFragment);
+
+ ACCEPT2("<foo=bar>[1]", NYsonPull::EStreamType::Node);
+ ACCEPT2("<foo=bar>[1]", NYsonPull::EStreamType::ListFragment);
+ REJECT2("<foo=bar>[1]", NYsonPull::EStreamType::MapFragment);
+
+ ACCEPT2(" [1] \t \t ", NYsonPull::EStreamType::Node);
+ ACCEPT2(" [1] \t \t ", NYsonPull::EStreamType::ListFragment);
+ REJECT2(" [1] \t \t ", NYsonPull::EStreamType::MapFragment);
+
+ REJECT2("[1];", NYsonPull::EStreamType::Node);
+ ACCEPT2("[1];", NYsonPull::EStreamType::ListFragment);
+ REJECT2("[1];", NYsonPull::EStreamType::MapFragment);
+
+ REJECT2("[1]; foobar", NYsonPull::EStreamType::Node);
+ ACCEPT2("[1]; foobar", NYsonPull::EStreamType::ListFragment);
+ REJECT2("[1]; foobar", NYsonPull::EStreamType::MapFragment);
+
+ REJECT2("a=[1]", NYsonPull::EStreamType::Node);
+ REJECT2("a=[1]", NYsonPull::EStreamType::ListFragment);
+ ACCEPT2("a=[1]", NYsonPull::EStreamType::MapFragment);
+
+ REJECT2("a=[1]; ", NYsonPull::EStreamType::Node);
+ REJECT2("a=[1]; ", NYsonPull::EStreamType::ListFragment);
+ ACCEPT2("a=[1]; ", NYsonPull::EStreamType::MapFragment);
+
+ REJECT2("a=[1]; b=foobar", NYsonPull::EStreamType::Node);
+ REJECT2("a=[1]; b=foobar", NYsonPull::EStreamType::ListFragment);
+ ACCEPT2("a=[1]; b=foobar", NYsonPull::EStreamType::MapFragment);
}
-
+
} // Y_UNIT_TEST_SUITE(Reader)
diff --git a/library/cpp/yson_pull/ut/writer_ut.cpp b/library/cpp/yson_pull/ut/writer_ut.cpp
index 5c304bad0f..87b2082ca5 100644
--- a/library/cpp/yson_pull/ut/writer_ut.cpp
+++ b/library/cpp/yson_pull/ut/writer_ut.cpp
@@ -1,56 +1,56 @@
#include <library/cpp/yson_pull/scalar.h>
#include <library/cpp/yson_pull/detail/writer.h>
-
+
#include <library/cpp/testing/unittest/registar.h>
-
+
#include <util/generic/string.h>
-
-#include <climits>
-#include <limits>
-
+
+#include <climits>
+#include <limits>
+
using namespace std::string_view_literals;
-namespace {
+namespace {
template <typename Writer, typename Function>
TString with_writer(Function&& function) {
TString result;
auto writer = NYsonPull::NDetail::make_writer<Writer>(
- NYsonPull::NOutput::FromString(&result),
+ NYsonPull::NOutput::FromString(&result),
NYsonPull::EStreamType::Node);
-
+
function(writer);
-
- return result;
+
+ return result;
}
-
+
template <typename Writer>
TString to_yson_string(const NYsonPull::TScalar& value) {
return with_writer<Writer>([&](NYsonPull::TWriter& writer) {
- writer.BeginStream().Scalar(value).EndStream();
+ writer.BeginStream().Scalar(value).EndStream();
});
}
-
+
template <typename T>
TString to_yson_binary_string(T&& value) {
- return to_yson_string<NYsonPull::NDetail::TBinaryWriterImpl>(std::forward<T>(value));
+ return to_yson_string<NYsonPull::NDetail::TBinaryWriterImpl>(std::forward<T>(value));
}
-
+
template <typename T>
TString to_yson_text_string(T&& value) {
- return to_yson_string<NYsonPull::NDetail::TTextWriterImpl>(std::forward<T>(value));
+ return to_yson_string<NYsonPull::NDetail::TTextWriterImpl>(std::forward<T>(value));
}
-
-} // anonymous namespace
-
-// =================== Text format =====================
-
+
+} // anonymous namespace
+
+// =================== Text format =====================
+
Y_UNIT_TEST_SUITE(Writer) {
Y_UNIT_TEST(TextEntity) {
UNIT_ASSERT_VALUES_EQUAL(
"#",
to_yson_text_string(NYsonPull::TScalar{}));
}
-
+
Y_UNIT_TEST(TextBoolean) {
UNIT_ASSERT_VALUES_EQUAL(
"%false",
@@ -59,7 +59,7 @@ Y_UNIT_TEST_SUITE(Writer) {
"%true",
to_yson_text_string(NYsonPull::TScalar{true}));
}
-
+
Y_UNIT_TEST(TextInt64) {
UNIT_ASSERT_VALUES_EQUAL(
"0",
@@ -79,7 +79,7 @@ Y_UNIT_TEST_SUITE(Writer) {
UNIT_ASSERT_VALUES_EQUAL(
"9223372036854775807",
to_yson_text_string(NYsonPull::TScalar{i64{INT64_MAX}}));
-
+
UNIT_ASSERT_VALUES_EQUAL(
"-200",
to_yson_text_string(NYsonPull::TScalar{i64{-200}}));
@@ -96,7 +96,7 @@ Y_UNIT_TEST_SUITE(Writer) {
"-9223372036854775808",
to_yson_text_string(NYsonPull::TScalar{i64{INT64_MIN}}));
}
-
+
Y_UNIT_TEST(TextUInt64) {
UNIT_ASSERT_VALUES_EQUAL(
"0u",
@@ -120,19 +120,19 @@ Y_UNIT_TEST_SUITE(Writer) {
"18446744073709551615u",
to_yson_text_string(NYsonPull::TScalar{ui64{UINT64_MAX}}));
}
-
+
Y_UNIT_TEST(TextFloat64) {
- UNIT_ASSERT_VALUES_EQUAL(
+ UNIT_ASSERT_VALUES_EQUAL(
"%inf",
- to_yson_text_string(NYsonPull::TScalar{std::numeric_limits<double>::infinity()}));
- UNIT_ASSERT_VALUES_EQUAL(
+ to_yson_text_string(NYsonPull::TScalar{std::numeric_limits<double>::infinity()}));
+ UNIT_ASSERT_VALUES_EQUAL(
"%-inf",
- to_yson_text_string(NYsonPull::TScalar{-std::numeric_limits<double>::infinity()}));
+ to_yson_text_string(NYsonPull::TScalar{-std::numeric_limits<double>::infinity()}));
UNIT_ASSERT_VALUES_EQUAL(
"%nan",
to_yson_text_string(NYsonPull::TScalar{std::numeric_limits<double>::quiet_NaN()}));
}
-
+
Y_UNIT_TEST(TextString) {
UNIT_ASSERT_VALUES_EQUAL(
R"("")",
@@ -144,15 +144,15 @@ Y_UNIT_TEST_SUITE(Writer) {
R"("hello\nworld")",
to_yson_text_string(NYsonPull::TScalar{"hello\nworld"}));
}
-
+
// =================== Binary format =====================
-
+
Y_UNIT_TEST(BinaryEntity) {
UNIT_ASSERT_VALUES_EQUAL(
"#",
to_yson_binary_string(NYsonPull::TScalar{}));
}
-
+
Y_UNIT_TEST(BinaryBoolean) {
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x4"),
@@ -161,7 +161,7 @@ Y_UNIT_TEST_SUITE(Writer) {
TStringBuf("\x5"),
to_yson_binary_string(NYsonPull::TScalar{true}));
}
-
+
Y_UNIT_TEST(BinaryInt64) {
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x2\0"sv),
@@ -181,7 +181,7 @@ Y_UNIT_TEST_SUITE(Writer) {
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x2\xFE\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1"),
to_yson_binary_string(NYsonPull::TScalar{i64{INT64_MAX}}));
-
+
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x2\x8F\x3"),
to_yson_binary_string(NYsonPull::TScalar{i64{-200}}));
@@ -198,7 +198,7 @@ Y_UNIT_TEST_SUITE(Writer) {
TStringBuf("\x2\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1"),
to_yson_binary_string(NYsonPull::TScalar{i64{INT64_MIN}}));
}
-
+
Y_UNIT_TEST(BinaryUInt64) {
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x6\0"sv),
@@ -222,14 +222,14 @@ Y_UNIT_TEST_SUITE(Writer) {
TStringBuf("\x6\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x1"),
to_yson_binary_string(NYsonPull::TScalar{ui64{UINT64_MAX}}));
}
-
+
Y_UNIT_TEST(BinaryFloat64) {
- UNIT_ASSERT_VALUES_EQUAL(
+ UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\x7f"sv),
- to_yson_binary_string(NYsonPull::TScalar{std::numeric_limits<double>::infinity()}));
- UNIT_ASSERT_VALUES_EQUAL(
+ to_yson_binary_string(NYsonPull::TScalar{std::numeric_limits<double>::infinity()}));
+ UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf0\xff"sv),
- to_yson_binary_string(NYsonPull::TScalar{-std::numeric_limits<double>::infinity()}));
+ to_yson_binary_string(NYsonPull::TScalar{-std::numeric_limits<double>::infinity()}));
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x03\x00\x00\x00\x00\x00\x00\xf8\x7f"sv),
to_yson_binary_string(NYsonPull::TScalar{std::numeric_limits<double>::quiet_NaN()}));
@@ -240,7 +240,7 @@ Y_UNIT_TEST_SUITE(Writer) {
TStringBuf("\x03\x9a\x99\x99\x99\x99\x99\xf1\xbf"),
to_yson_binary_string(NYsonPull::TScalar{double{-1.1}}));
}
-
+
Y_UNIT_TEST(BinaryString) {
UNIT_ASSERT_VALUES_EQUAL(
TStringBuf("\x1\0"sv),
@@ -252,5 +252,5 @@ Y_UNIT_TEST_SUITE(Writer) {
TStringBuf("\x1\x16hello\nworld"),
to_yson_binary_string(NYsonPull::TScalar{"hello\nworld"}));
}
-
+
} // Y_UNIT_TEST_SUITE(Writer)
diff --git a/library/cpp/yson_pull/ut/ya.make b/library/cpp/yson_pull/ut/ya.make
index a269dfd2ad..d2616ed8b9 100644
--- a/library/cpp/yson_pull/ut/ya.make
+++ b/library/cpp/yson_pull/ut/ya.make
@@ -1,12 +1,12 @@
UNITTEST_FOR(library/cpp/yson_pull)
-
-OWNER(borman)
-
-SRCS(
- cescape_ut.cpp
- reader_ut.cpp
- writer_ut.cpp
- loop_ut.cpp
-)
-
-END()
+
+OWNER(borman)
+
+SRCS(
+ cescape_ut.cpp
+ reader_ut.cpp
+ writer_ut.cpp
+ loop_ut.cpp
+)
+
+END()
diff --git a/library/cpp/yson_pull/writer.cpp b/library/cpp/yson_pull/writer.cpp
index 1df92bf40f..566b248714 100644
--- a/library/cpp/yson_pull/writer.cpp
+++ b/library/cpp/yson_pull/writer.cpp
@@ -1,30 +1,30 @@
-#include "writer.h"
+#include "writer.h"
#include <library/cpp/yson_pull/detail/writer.h>
-
-using namespace NYsonPull;
-
-TWriter NYsonPull::MakeBinaryWriter(
- THolder<NOutput::IStream> stream,
+
+using namespace NYsonPull;
+
+TWriter NYsonPull::MakeBinaryWriter(
+ THolder<NOutput::IStream> stream,
EStreamType mode) {
- return NYsonPull::NDetail::make_writer<NYsonPull::NDetail::TBinaryWriterImpl>(
- std::move(stream),
+ return NYsonPull::NDetail::make_writer<NYsonPull::NDetail::TBinaryWriterImpl>(
+ std::move(stream),
mode);
-}
-
-TWriter NYsonPull::MakeTextWriter(
- THolder<NOutput::IStream> stream,
+}
+
+TWriter NYsonPull::MakeTextWriter(
+ THolder<NOutput::IStream> stream,
EStreamType mode) {
- return NYsonPull::NDetail::make_writer<NYsonPull::NDetail::TTextWriterImpl>(
- std::move(stream),
+ return NYsonPull::NDetail::make_writer<NYsonPull::NDetail::TTextWriterImpl>(
+ std::move(stream),
mode);
-}
-
-TWriter NYsonPull::MakePrettyTextWriter(
- THolder<NOutput::IStream> stream,
- EStreamType mode,
+}
+
+TWriter NYsonPull::MakePrettyTextWriter(
+ THolder<NOutput::IStream> stream,
+ EStreamType mode,
size_t indent_size) {
- return NYsonPull::NDetail::make_writer<NYsonPull::NDetail::TPrettyWriterImpl>(
- std::move(stream),
- mode,
+ return NYsonPull::NDetail::make_writer<NYsonPull::NDetail::TPrettyWriterImpl>(
+ std::move(stream),
+ mode,
indent_size);
-}
+}
diff --git a/library/cpp/yson_pull/writer.h b/library/cpp/yson_pull/writer.h
index dec63328be..d937d18691 100644
--- a/library/cpp/yson_pull/writer.h
+++ b/library/cpp/yson_pull/writer.h
@@ -1,126 +1,126 @@
-#pragma once
-
-#include "consumer.h"
-#include "output.h"
-#include "scalar.h"
-#include "stream_type.h"
-
-#include <memory>
-
-namespace NYsonPull {
+#pragma once
+
+#include "consumer.h"
+#include "output.h"
+#include "scalar.h"
+#include "stream_type.h"
+
+#include <memory>
+
+namespace NYsonPull {
//! \brief YSON writer facade class
//!
//! Owns a YSON consumer and a corresponding output stream.
//! Methods invoke corresponding \p NYsonPull::IConsumer methods and can be chained.
class TWriter {
- THolder<NOutput::IStream> Stream_;
- THolder<IConsumer> Impl_;
-
+ THolder<NOutput::IStream> Stream_;
+ THolder<IConsumer> Impl_;
+
public:
TWriter(
THolder<NOutput::IStream> stream,
THolder<IConsumer> impl)
- : Stream_{std::move(stream)}
- , Impl_{std::move(impl)} {
+ : Stream_{std::move(stream)}
+ , Impl_{std::move(impl)} {
}
-
+
//! \brief Get a reference to underlying consumer.
//!
//! Useful with \p NYsonPull::bridge
- IConsumer& GetConsumer() {
- return *Impl_;
+ IConsumer& GetConsumer() {
+ return *Impl_;
}
-
- TWriter& BeginStream() {
- Impl_->OnBeginStream();
+
+ TWriter& BeginStream() {
+ Impl_->OnBeginStream();
return *this;
}
- TWriter& EndStream() {
- Impl_->OnEndStream();
+ TWriter& EndStream() {
+ Impl_->OnEndStream();
return *this;
}
-
- TWriter& BeginList() {
- Impl_->OnBeginList();
+
+ TWriter& BeginList() {
+ Impl_->OnBeginList();
return *this;
}
- TWriter& EndList() {
- Impl_->OnEndList();
+ TWriter& EndList() {
+ Impl_->OnEndList();
return *this;
}
-
- TWriter& BeginMap() {
- Impl_->OnBeginMap();
+
+ TWriter& BeginMap() {
+ Impl_->OnBeginMap();
return *this;
}
- TWriter& EndMap() {
- Impl_->OnEndMap();
+ TWriter& EndMap() {
+ Impl_->OnEndMap();
return *this;
}
-
- TWriter& BeginAttributes() {
- Impl_->OnBeginAttributes();
+
+ TWriter& BeginAttributes() {
+ Impl_->OnBeginAttributes();
return *this;
}
- TWriter& EndAttributes() {
- Impl_->OnEndAttributes();
+ TWriter& EndAttributes() {
+ Impl_->OnEndAttributes();
return *this;
}
-
- TWriter& Key(TStringBuf name) {
- Impl_->OnKey(name);
+
+ TWriter& Key(TStringBuf name) {
+ Impl_->OnKey(name);
return *this;
}
-
- TWriter& Entity() {
- Impl_->OnEntity();
+
+ TWriter& Entity() {
+ Impl_->OnEntity();
return *this;
}
- TWriter& Boolean(bool value) {
- Impl_->OnScalarBoolean(value);
+ TWriter& Boolean(bool value) {
+ Impl_->OnScalarBoolean(value);
return *this;
}
- TWriter& Int64(i64 value) {
- Impl_->OnScalarInt64(value);
+ TWriter& Int64(i64 value) {
+ Impl_->OnScalarInt64(value);
return *this;
}
- TWriter& UInt64(ui64 value) {
- Impl_->OnScalarUInt64(value);
+ TWriter& UInt64(ui64 value) {
+ Impl_->OnScalarUInt64(value);
return *this;
}
- TWriter& Float64(double value) {
- Impl_->OnScalarFloat64(value);
+ TWriter& Float64(double value) {
+ Impl_->OnScalarFloat64(value);
return *this;
}
- TWriter& String(TStringBuf value) {
- Impl_->OnScalarString(value);
+ TWriter& String(TStringBuf value) {
+ Impl_->OnScalarString(value);
return *this;
}
-
- TWriter& Scalar(const TScalar& value) {
- Impl_->OnScalar(value);
+
+ TWriter& Scalar(const TScalar& value) {
+ Impl_->OnScalar(value);
return *this;
}
- TWriter& Event(const TEvent& value) {
- Impl_->OnEvent(value);
+ TWriter& Event(const TEvent& value) {
+ Impl_->OnEvent(value);
return *this;
}
};
-
+
//! \brief Construct a writer for binary YSON format.
- TWriter MakeBinaryWriter(
+ TWriter MakeBinaryWriter(
THolder<NOutput::IStream> stream,
EStreamType mode);
-
+
//! \brief Construct a writer for text YSON format.
- TWriter MakeTextWriter(
+ TWriter MakeTextWriter(
THolder<NOutput::IStream> stream,
EStreamType mode);
-
+
//! \brief Construct a writer for pretty text YSON format.
- TWriter MakePrettyTextWriter(
+ TWriter MakePrettyTextWriter(
THolder<NOutput::IStream> stream,
EStreamType mode,
size_t indent_size = 4);
-
+
}
diff --git a/library/cpp/yson_pull/ya.make b/library/cpp/yson_pull/ya.make
index a373e0a6ba..42af77c4b1 100644
--- a/library/cpp/yson_pull/ya.make
+++ b/library/cpp/yson_pull/ya.make
@@ -1,21 +1,21 @@
-LIBRARY(yson_pull)
+LIBRARY(yson_pull)
+
+OWNER(borman)
+
+SRCS(
+ consumer.cpp
+ event.cpp
+ exceptions.cpp
+ input.cpp
+ output.cpp
+ read_ops.cpp
+ reader.cpp
+ scalar.cpp
+ writer.cpp
+)
+
+GENERATE_ENUM_SERIALIZATION(event.h)
-OWNER(borman)
-
-SRCS(
- consumer.cpp
- event.cpp
- exceptions.cpp
- input.cpp
- output.cpp
- read_ops.cpp
- reader.cpp
- scalar.cpp
- writer.cpp
-)
-
-GENERATE_ENUM_SERIALIZATION(event.h)
-
-GENERATE_ENUM_SERIALIZATION(scalar.h)
-
-END()
+GENERATE_ENUM_SERIALIZATION(scalar.h)
+
+END()
diff --git a/library/cpp/yson_pull/yson.h b/library/cpp/yson_pull/yson.h
index a77eaa5c94..ecfa2b6604 100644
--- a/library/cpp/yson_pull/yson.h
+++ b/library/cpp/yson_pull/yson.h
@@ -1,14 +1,14 @@
-#pragma once
-
-#include "bridge.h"
-#include "consumer.h"
-#include "event.h"
-#include "exceptions.h"
-#include "input.h"
-#include "output.h"
-#include "position_info.h"
-#include "range.h"
-#include "reader.h"
-#include "scalar.h"
-#include "stream_type.h"
-#include "writer.h"
+#pragma once
+
+#include "bridge.h"
+#include "consumer.h"
+#include "event.h"
+#include "exceptions.h"
+#include "input.h"
+#include "output.h"
+#include "position_info.h"
+#include "range.h"
+#include "reader.h"
+#include "scalar.h"
+#include "stream_type.h"
+#include "writer.h"