Skip to content

feat: adds front and back methods to Value type #1458

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions include/json/value.h
Original file line number Diff line number Diff line change
@@ -585,6 +585,22 @@ class JSON_API Value {
iterator begin();
iterator end();

/// \brief Returns a reference to the first element in the `Value`.
/// Requires that this value holds an array or json object, with at least one element.
const Value& front() const;

/// \brief Returns a reference to the first element in the `Value`.
/// Requires that this value holds an array or json object, with at least one element.
Value& front();

/// \brief Returns a reference to the last element in the `Value`.
/// Requires that value holds an array or json object, with at least one element.
const Value& back() const;

/// \brief Returns a reference to the last element in the `Value`.
/// Requires that this value holds an array or json object, with at least one element.
Value& back();

// Accessors for the [start, limit) range of bytes within the JSON text from
// which this value was parsed, if any.
void setOffsetStart(ptrdiff_t start);
@@ -925,6 +941,14 @@ class JSON_API ValueIterator : public ValueIteratorBase {

inline void swap(Value& a, Value& b) { a.swap(b); }

inline const Value& Value::front() const { return *begin(); }

inline Value& Value::front() { return *begin(); }

inline const Value& Value::back() const { return *(--end()); }

inline Value& Value::back() { return *(--end()); }

} // namespace Json

#pragma pack(pop)
14 changes: 14 additions & 0 deletions src/test_lib_json/main.cpp
Original file line number Diff line number Diff line change
@@ -310,10 +310,14 @@ JSONTEST_FIXTURE_LOCAL(ValueTest, arrays) {
const Json::Value& constArray = array1_;
JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[index0]);
JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray[0]);
JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray.front());
JSONTEST_ASSERT_EQUAL(Json::Value(1234), constArray.back());

// Access through non-const reference
JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[index0]);
JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_[0]);
JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_.front());
JSONTEST_ASSERT_EQUAL(Json::Value(1234), array1_.back());

array1_[2] = Json::Value(17);
JSONTEST_ASSERT_EQUAL(Json::Value(), array1_[1]);
@@ -356,6 +360,8 @@ JSONTEST_FIXTURE_LOCAL(ValueTest, resizePopulatesAllMissingElements) {
v.resize(n);
JSONTEST_ASSERT_EQUAL(n, v.size());
JSONTEST_ASSERT_EQUAL(n, std::distance(v.begin(), v.end()));
JSONTEST_ASSERT_EQUAL(v.front(), Json::Value{});
JSONTEST_ASSERT_EQUAL(v.back(), Json::Value{});
for (const Json::Value& e : v)
JSONTEST_ASSERT_EQUAL(e, Json::Value{});
}
@@ -406,13 +412,17 @@ JSONTEST_FIXTURE_LOCAL(ValueTest, arrayInsertAtRandomIndex) {
JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[0]); // check append
JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[1]);
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[2]);
JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array.front());
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());

// insert lvalue at the head
JSONTEST_ASSERT(array.insert(0, str1));
JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array[0]);
JSONTEST_ASSERT_EQUAL(Json::Value("index0"), array[1]);
JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[2]);
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[3]);
JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array.front());
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());
// checking address
for (Json::ArrayIndex i = 0; i < 3; i++) {
JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
@@ -425,6 +435,8 @@ JSONTEST_FIXTURE_LOCAL(ValueTest, arrayInsertAtRandomIndex) {
JSONTEST_ASSERT_EQUAL(Json::Value("index4"), array[2]);
JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[3]);
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[4]);
JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array.front());
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array.back());
// checking address
for (Json::ArrayIndex i = 0; i < 4; i++) {
JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);
@@ -438,6 +450,8 @@ JSONTEST_FIXTURE_LOCAL(ValueTest, arrayInsertAtRandomIndex) {
JSONTEST_ASSERT_EQUAL(Json::Value("index1"), array[3]);
JSONTEST_ASSERT_EQUAL(Json::Value("index2"), array[4]);
JSONTEST_ASSERT_EQUAL(Json::Value("index5"), array[5]);
JSONTEST_ASSERT_EQUAL(Json::Value("index3"), array.front());
JSONTEST_ASSERT_EQUAL(Json::Value("index5"), array.back());
// checking address
for (Json::ArrayIndex i = 0; i < 5; i++) {
JSONTEST_ASSERT_EQUAL(vec[i], &array[i]);