Skip to content

Commit

Permalink
feat: adds front and back methods to Value type (#1458)
Browse files Browse the repository at this point in the history
Value::front and Value::back
  • Loading branch information
jwidauer authored Jun 7, 2023
1 parent 8190e06 commit 3d9bf8e
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 0 deletions.
24 changes: 24 additions & 0 deletions include/json/value.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down Expand Up @@ -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)
Expand Down
14 changes: 14 additions & 0 deletions src/test_lib_json/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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]);
Expand Down Expand Up @@ -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{});
}
Expand Down Expand Up @@ -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]);
Expand All @@ -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]);
Expand All @@ -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]);
Expand Down

0 comments on commit 3d9bf8e

Please sign in to comment.