libcamera: yaml_parser: Take string keys in std::string_view
In many cases a static string literal is used as key. Thus
having the argument type be `const std::string&` is suboptimal
since an `std::string` object needs to be constructed before
the call.
C++17 introduced `std::string_view`, using which the call
can be done with less overhead, as the `std::string_view`
is non-owning and may be passed in registers entirely.
So make `YamlObject::{contains,operator[]}` take the string keys
in `std::string_view`s.
Unfortunately, that is not sufficient yet, because `std::map::find()`
takes an reference to `const key_type`, which would be `const std::string&`
in the case of `YamlParser`. However, with a transparent comparator
such as `std::less<>` `std::map::find()` is able to accept any
object as the argument, and it forwards it to the comparator.
So make `YamlParser::dictionary_` use `std::less<>` as the comparator
to enable the use of `std::map::find()` with any type of argument.
Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
Reviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
committed by
Laurent Pinchart
parent
3088e14e81
commit
e879a86979
@@ -12,6 +12,7 @@
|
||||
#include <optional>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <vector>
|
||||
|
||||
#include <libcamera/base/class.h>
|
||||
@@ -206,8 +207,8 @@ public:
|
||||
|
||||
const YamlObject &operator[](std::size_t index) const;
|
||||
|
||||
bool contains(const std::string &key) const;
|
||||
const YamlObject &operator[](const std::string &key) const;
|
||||
bool contains(std::string_view key) const;
|
||||
const YamlObject &operator[](std::string_view key) const;
|
||||
|
||||
private:
|
||||
LIBCAMERA_DISABLE_COPY_AND_MOVE(YamlObject)
|
||||
@@ -232,7 +233,7 @@ private:
|
||||
|
||||
std::string value_;
|
||||
Container list_;
|
||||
std::map<std::string, YamlObject *> dictionary_;
|
||||
std::map<std::string, YamlObject *, std::less<>> dictionary_;
|
||||
};
|
||||
|
||||
class YamlParser final
|
||||
|
||||
@@ -481,16 +481,13 @@ const YamlObject &YamlObject::operator[](std::size_t index) const
|
||||
*
|
||||
* \return True if an element exists, false otherwise
|
||||
*/
|
||||
bool YamlObject::contains(const std::string &key) const
|
||||
bool YamlObject::contains(std::string_view key) const
|
||||
{
|
||||
if (dictionary_.find(std::ref(key)) == dictionary_.end())
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return dictionary_.find(key) != dictionary_.end();
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn YamlObject::operator[](const std::string &key) const
|
||||
* \fn YamlObject::operator[](std::string_view key) const
|
||||
* \brief Retrieve a member by name from the dictionary
|
||||
*
|
||||
* This function retrieve a member of a YamlObject by name. Only YamlObject
|
||||
@@ -500,7 +497,7 @@ bool YamlObject::contains(const std::string &key) const
|
||||
*
|
||||
* \return The YamlObject corresponding to the \a key member
|
||||
*/
|
||||
const YamlObject &YamlObject::operator[](const std::string &key) const
|
||||
const YamlObject &YamlObject::operator[](std::string_view key) const
|
||||
{
|
||||
if (type_ != Type::Dictionary)
|
||||
return empty;
|
||||
|
||||
Reference in New Issue
Block a user