Skip to content

missing tags in simdjson iterators stopping them from being used with C++ standard utility functions #2579

@lano1106

Description

@lano1106

I am reporting this issue. not very critical but also trivial to address I guess.

you cannot use std::advance() with simdjson array iterators.

/*
 * getRandomThumbnail()
 */
std::string_view TrillionTrader::Publer::Video::getRandomThumbnail() const noexcept
{
    std::string_view res;
    int idx{rand()%m_thumbnails_num};

    try {
        simdjson::ondemand::document
                doc{simdjson::ondemand::parser::get_parser().iterate(m_thumbnails_json)};
        simdjson::ondemand::array thumbnails_arr{doc.get_array()};
        auto it{thumbnails_arr.begin()};

        std::advance(it, idx);
        simdjson::ondemand::object thumbNail_obj{*it};

        res = thumbNail_obj["small"];
    }
    catch (simdjson::simdjson_error &e) {
        ERROR1("simdjson_error exception caught: %s", e.what());
    }
    return res;
}

generates

In file included from /usr/include/c++/15.2.1/bits/stl_algobase.h:66,
                 from /usr/include/c++/15.2.1/array:45,
                 from publer_poster.h:11,
                 from publer_poster.cpp:11:
/usr/include/c++/15.2.1/bits/stl_iterator_base_funcs.h: In instantiation of ‘constexpr void std::advance(_InputIterator&, _Distance) [with _InputIterator = simdjson::simdjson_result<simdjson::icelake::ondemand::array_iterator>; _Distance = int]’:
publer_poster.cpp:408:21:   required from here
  408 |         std::advance(it, idx);
      |         ~~~~~~~~~~~~^~~~~~~~~
/usr/include/c++/15.2.1/bits/stl_iterator_base_funcs.h:225:65: error: no type named ‘difference_type’ in ‘struct std::iterator_traits<simdjson::simdjson_result<simdjson::icelake::ondemand::array_iterator> >’
  225 |       typename iterator_traits<_InputIterator>::difference_type __d = __n;
      |                                                                 ^~~
/usr/include/c++/15.2.1/bits/stl_iterator_base_funcs.h:226:56: error: no matching function for call to ‘__iterator_category(simdjson::simdjson_result<simdjson::icelake::ondemand::array_iterator>&)’
  226 |       std::__advance(__i, __d, std::__iterator_category(__i));
      |                                ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
/usr/include/c++/15.2.1/bits/stl_iterator_base_funcs.h:226:56: note: there is 1 candidate
In file included from /usr/include/c++/15.2.1/bits/stl_algobase.h:65:
/usr/include/c++/15.2.1/bits/stl_iterator_base_types.h:241:5: note: candidate 1: ‘template<class _Iter> constexpr typename std::iterator_traits<_Iterator>::iterator_category std::__iterator_category(const _Iter&)’
  241 |     __iterator_category(const _Iter&)
      |     ^~~~~~~~~~~~~~~~~~~
/usr/include/c++/15.2.1/bits/stl_iterator_base_types.h:241:5: note: template argument deduction/substitution failed:
/usr/include/c++/15.2.1/bits/stl_iterator_base_types.h: In substitution of ‘template<class _Iter> constexpr typename std::iterator_traits<_Iterator>::iterator_category std::__iterator_category(const _Iter&) [with _Iter = simdjson::simdjson_result<simdjson::icelake::ondemand::array_iterator>]’:
/usr/include/c++/15.2.1/bits/stl_iterator_base_funcs.h:226:56:   required from ‘constexpr void std::advance(_InputIterator&, _Distance) [with _InputIterator = simdjson::simdjson_result<simdjson::icelake::ondemand::array_iterator>; _Distance = int]’
  226 |       std::__advance(__i, __d, std::__iterator_category(__i));
      |                                ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
publer_poster.cpp:408:21:   required from here
  408 |         std::advance(it, idx);
      |         ~~~~~~~~~~~~^~~~~~~~~
/usr/include/c++/15.2.1/bits/stl_iterator_base_types.h:241:5: error: no type named ‘iterator_category’ in ‘struct std::iterator_traits<simdjson::simdjson_result<simdjson::icelake::ondemand::array_iterator> >’
  241 |     __iterator_category(const _Iter&)
      |     ^~~~~~~~~~~~~~~~~~~
make: *** [Makefile.libtradecore.nosync:96: publer_poster.o] Error 1

forcing the user to revert back to boilerplate C code...

/*
 * getRandomThumbnail()
 */
std::string_view TrillionTrader::Publer::Video::getRandomThumbnail() const noexcept
{
    std::string_view res;
    int idx{rand()%m_thumbnails_num};

    try {
        simdjson::ondemand::document
                doc{simdjson::ondemand::parser::get_parser().iterate(m_thumbnails_json)};
        simdjson::ondemand::array thumbnails_arr{doc.get_array()};
        auto it{thumbnails_arr.begin()};

        while (idx-- > 0)
            ++it;
        simdjson::ondemand::object thumbNail_obj{*it};

        res = thumbNail_obj["small"];
    }
    catch (simdjson::simdjson_error &e) {
        ERROR1("simdjson_error exception caught: %s", e.what());
    }
    return res;
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions