Skip to content

Commit 89c1394

Browse files
authored
Implement a to_weak_pointer utility (#1625)
Signed-off-by: Juan Cruz Viotti <jv@jviotti.com>
1 parent f89b527 commit 89c1394

File tree

3 files changed

+51
-3
lines changed

3 files changed

+51
-3
lines changed

src/core/jsonpointer/include/sourcemeta/core/jsonpointer.h

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,13 +326,33 @@ auto to_pointer(const std::basic_string<JSON::Char, JSON::CharTraits,
326326
/// const sourcemeta::core::WeakPointer pointer{std::cref(foo)};
327327
/// const sourcemeta::core::Pointer result{
328328
/// sourcemeta::core::to_pointer(pointer)}:
329-
/// assert(pointer.size() == 1);
330-
/// assert(pointer.at(0).is_property());
331-
/// assert(pointer.at(0).to_property() == "foo");
329+
/// assert(result.size() == 1);
330+
/// assert(result.at(0).is_property());
331+
/// assert(result.at(0).to_property() == "foo");
332332
/// ```
333333
SOURCEMETA_CORE_JSONPOINTER_EXPORT
334334
auto to_pointer(const WeakPointer &pointer) -> Pointer;
335335

336+
/// @ingroup jsonpointer
337+
/// Convert a JSON Pointer into a JSON WeakPointer. For example:
338+
///
339+
/// ```cpp
340+
/// #include <sourcemeta/core/jsonpointer.h>
341+
/// #include <cassert>
342+
///
343+
/// const sourcemeta::core::Pointer pointer{"foo", "bar", "baz"};
344+
/// const auto result{sourcemeta::core::to_weak_pointer(pointer)};
345+
/// assert(result.size() == 3);
346+
/// assert(result.at(0).is_property());
347+
/// assert(result.at(0).to_property() == "foo");
348+
/// assert(result.at(1).is_property());
349+
/// assert(result.at(1).to_property() == "bar");
350+
/// assert(result.at(2).is_property());
351+
/// assert(result.at(2).to_property() == "baz");
352+
/// ```
353+
SOURCEMETA_CORE_JSONPOINTER_EXPORT
354+
auto to_weak_pointer(const Pointer &pointer) -> WeakPointer;
355+
336356
/// @ingroup jsonpointer
337357
///
338358
/// Stringify the input JSON Pointer into a given C++ standard output stream.

src/core/jsonpointer/jsonpointer.cc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,19 @@ auto to_pointer(const WeakPointer &pointer) -> Pointer {
270270
return result;
271271
}
272272

273+
auto to_weak_pointer(const Pointer &pointer) -> WeakPointer {
274+
WeakPointer result;
275+
for (const auto &token : pointer) {
276+
if (token.is_property()) {
277+
result.push_back(token.to_property());
278+
} else {
279+
result.push_back(token.to_index());
280+
}
281+
}
282+
283+
return result;
284+
}
285+
273286
auto stringify(const Pointer &pointer,
274287
std::basic_ostream<JSON::Char, JSON::CharTraits> &stream)
275288
-> void {

test/jsonpointer/jsonpointer_weakpointer_test.cc

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,3 +316,18 @@ TEST(JSONWeakPointer_pointer, to_pointer) {
316316
EXPECT_TRUE(pointer.at(1).is_index());
317317
EXPECT_EQ(pointer.at(1).to_index(), 0);
318318
}
319+
320+
TEST(JSONWeakPointer_pointer, to_weak_pointer) {
321+
const sourcemeta::core::Pointer pointer{"foo", 1, "baz"};
322+
const auto result{sourcemeta::core::to_weak_pointer(pointer)};
323+
EXPECT_EQ(result.size(), 3);
324+
325+
EXPECT_TRUE(result.at(0).is_property());
326+
EXPECT_EQ(result.at(0).to_property(), "foo");
327+
328+
EXPECT_TRUE(result.at(1).is_index());
329+
EXPECT_EQ(result.at(1).to_index(), 1);
330+
331+
EXPECT_TRUE(result.at(2).is_property());
332+
EXPECT_EQ(result.at(2).to_property(), "baz");
333+
}

0 commit comments

Comments
 (0)