[RFC,v1] treewide: Prefer `std::string_view` over `const std::string&` in parameters
diff mbox series

Message ID 20241215204802.850593-1-pobrn@protonmail.com
State New
Headers show
Series
  • [RFC,v1] treewide: Prefer `std::string_view` over `const std::string&` in parameters
Related show

Commit Message

Barnabás Pőcze Dec. 15, 2024, 8:48 p.m. UTC
A parameter of type `const std::string&` is not the right choice in
almost all cases. It forces the caller to construct an `std::string`
if they don't already have one, and accessing its data requires
an extra indirection. Furthermore, `std::string` is just one
instantiation of `std::basic_string<>`, using e.g. a different
allocator would immediately make it incompatible.

In contrast to that using an `std::string_view` is better if
NUL termination is not needed since no `std::string` construction
is required, and in many cases it can be passed directly in registers.

Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
---
 include/libcamera/base/utils.h                     | 10 +++++-----
 include/libcamera/camera_manager.h                 |  3 ++-
 .../libcamera/internal/camera_sensor_properties.h  |  4 ++--
 include/libcamera/internal/device_enumerator.h     |  3 ++-
 include/libcamera/internal/formats.h               |  3 ++-
 include/libcamera/internal/media_device.h          |  7 ++++---
 include/libcamera/internal/pipeline_handler.h      |  3 ++-
 include/libcamera/internal/v4l2_subdevice.h        |  3 ++-
 include/libcamera/internal/v4l2_videodevice.h      |  3 ++-
 include/libcamera/pixel_format.h                   |  3 ++-
 src/apps/cam/capture_script.cpp                    |  2 +-
 src/apps/cam/capture_script.h                      |  3 ++-
 src/apps/cam/drm.cpp                               |  8 ++++----
 src/apps/cam/drm.h                                 |  9 +++++----
 src/ipa/libipa/camera_sensor_helper.cpp            |  2 +-
 src/ipa/libipa/camera_sensor_helper.h              |  3 ++-
 src/ipa/libipa/module.cpp                          |  2 +-
 src/ipa/libipa/module.h                            |  4 ++--
 src/libcamera/base/utils.cpp                       |  8 ++++----
 src/libcamera/camera_manager.cpp                   |  2 +-
 src/libcamera/device_enumerator.cpp                |  2 +-
 src/libcamera/device_enumerator_udev.cpp           |  2 +-
 src/libcamera/formats.cpp                          |  2 +-
 src/libcamera/media_device.cpp                     | 14 +++++++-------
 src/libcamera/pipeline_handler.cpp                 |  2 +-
 src/libcamera/pixel_format.cpp                     |  2 +-
 src/libcamera/sensor/camera_sensor_properties.cpp  |  4 ++--
 src/libcamera/v4l2_subdevice.cpp                   |  2 +-
 src/libcamera/v4l2_videodevice.cpp                 |  2 +-
 src/py/libcamera/py_camera_manager.h               |  2 +-
 src/py/libcamera/py_main.cpp                       |  2 +-
 31 files changed, 66 insertions(+), 55 deletions(-)

Comments

Laurent Pinchart Dec. 15, 2024, 8:56 p.m. UTC | #1
Hi Barnabás,

Thank you for the patch.

On Sun, Dec 15, 2024 at 08:48:06PM +0000, Barnabás Pőcze wrote:
> A parameter of type `const std::string&` is not the right choice in
> almost all cases. It forces the caller to construct an `std::string`
> if they don't already have one, and accessing its data requires
> an extra indirection. Furthermore, `std::string` is just one
> instantiation of `std::basic_string<>`, using e.g. a different
> allocator would immediately make it incompatible.

I don't think the allocator is an issue in libcamera.

> 
> In contrast to that using an `std::string_view` is better if
> NUL termination is not needed since no `std::string` construction
> is required, and in many cases it can be passed directly in registers.

I had a go at this previously, and had very mixed feelings about the
result. I'll post a WIP series for discussion.

> 
> Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
> ---
>  include/libcamera/base/utils.h                     | 10 +++++-----
>  include/libcamera/camera_manager.h                 |  3 ++-
>  .../libcamera/internal/camera_sensor_properties.h  |  4 ++--
>  include/libcamera/internal/device_enumerator.h     |  3 ++-
>  include/libcamera/internal/formats.h               |  3 ++-
>  include/libcamera/internal/media_device.h          |  7 ++++---
>  include/libcamera/internal/pipeline_handler.h      |  3 ++-
>  include/libcamera/internal/v4l2_subdevice.h        |  3 ++-
>  include/libcamera/internal/v4l2_videodevice.h      |  3 ++-
>  include/libcamera/pixel_format.h                   |  3 ++-
>  src/apps/cam/capture_script.cpp                    |  2 +-
>  src/apps/cam/capture_script.h                      |  3 ++-
>  src/apps/cam/drm.cpp                               |  8 ++++----
>  src/apps/cam/drm.h                                 |  9 +++++----
>  src/ipa/libipa/camera_sensor_helper.cpp            |  2 +-
>  src/ipa/libipa/camera_sensor_helper.h              |  3 ++-
>  src/ipa/libipa/module.cpp                          |  2 +-
>  src/ipa/libipa/module.h                            |  4 ++--
>  src/libcamera/base/utils.cpp                       |  8 ++++----
>  src/libcamera/camera_manager.cpp                   |  2 +-
>  src/libcamera/device_enumerator.cpp                |  2 +-
>  src/libcamera/device_enumerator_udev.cpp           |  2 +-
>  src/libcamera/formats.cpp                          |  2 +-
>  src/libcamera/media_device.cpp                     | 14 +++++++-------
>  src/libcamera/pipeline_handler.cpp                 |  2 +-
>  src/libcamera/pixel_format.cpp                     |  2 +-
>  src/libcamera/sensor/camera_sensor_properties.cpp  |  4 ++--
>  src/libcamera/v4l2_subdevice.cpp                   |  2 +-
>  src/libcamera/v4l2_videodevice.cpp                 |  2 +-
>  src/py/libcamera/py_camera_manager.h               |  2 +-
>  src/py/libcamera/py_main.cpp                       |  2 +-
>  31 files changed, 66 insertions(+), 55 deletions(-)
> 
> diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> index 780aeda6a..3b8b3dea9 100644
> --- a/include/libcamera/base/utils.h
> +++ b/include/libcamera/base/utils.h
> @@ -38,7 +38,7 @@ namespace utils {
>  const char *basename(const char *path);
>  
>  char *secure_getenv(const char *name);
> -std::string dirname(const std::string &path);
> +std::string dirname(std::string_view path);
>  
>  template<typename T>
>  std::vector<typename T::key_type> map_keys(const T &map)
> @@ -143,7 +143,7 @@ size_t strlcpy(char *dst, const char *src, size_t size);
>  
>  #ifndef __DOXYGEN__
>  template<typename Container, typename UnaryOp>
> -std::string join(const Container &items, const std::string &sep, UnaryOp op)
> +std::string join(const Container &items, std::string_view sep, UnaryOp op)
>  {
>  	std::ostringstream ss;
>  	bool first = true;
> @@ -162,7 +162,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)
>  }
>  
>  template<typename Container>
> -std::string join(const Container &items, const std::string &sep)
> +std::string join(const Container &items, std::string_view sep)
>  {
>  	std::ostringstream ss;
>  	bool first = true;
> @@ -181,7 +181,7 @@ std::string join(const Container &items, const std::string &sep)
>  }
>  #else
>  template<typename Container, typename UnaryOp>
> -std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr);
> +std::string join(const Container &items, std::string_view sep, UnaryOp op = nullptr);
>  #endif
>  
>  namespace details {
> @@ -240,7 +240,7 @@ private:
>  
>  details::StringSplitter split(const std::string &str, const std::string &delim);
>  
> -std::string toAscii(const std::string &str);
> +std::string toAscii(std::string_view str);
>  
>  std::string libcameraBuildPath();
>  std::string libcameraSourcePath();
> diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
> index b50df7825..27835500f 100644
> --- a/include/libcamera/camera_manager.h
> +++ b/include/libcamera/camera_manager.h
> @@ -9,6 +9,7 @@
>  
>  #include <memory>
>  #include <string>
> +#include <string_view>
>  #include <sys/types.h>
>  #include <vector>
>  
> @@ -31,7 +32,7 @@ public:
>  	void stop();
>  
>  	std::vector<std::shared_ptr<Camera>> cameras() const;
> -	std::shared_ptr<Camera> get(const std::string &id);
> +	std::shared_ptr<Camera> get(std::string_view id);
>  
>  	static const std::string &version() { return version_; }
>  
> diff --git a/include/libcamera/internal/camera_sensor_properties.h b/include/libcamera/internal/camera_sensor_properties.h
> index d7d4dab62..b44093906 100644
> --- a/include/libcamera/internal/camera_sensor_properties.h
> +++ b/include/libcamera/internal/camera_sensor_properties.h
> @@ -9,7 +9,7 @@
>  
>  #include <map>
>  #include <stdint.h>
> -#include <string>
> +#include <string_view>
>  
>  #include <libcamera/control_ids.h>
>  #include <libcamera/geometry.h>
> @@ -24,7 +24,7 @@ struct CameraSensorProperties {
>  		uint8_t hblankDelay;
>  	};
>  
> -	static const CameraSensorProperties *get(const std::string &sensor);
> +	static const CameraSensorProperties *get(std::string_view sensor);
>  
>  	Size unitCellSize;
>  	std::map<controls::draft::TestPatternModeEnum, int32_t> testPatternModes;
> diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h
> index db3532a98..eecc39cfb 100644
> --- a/include/libcamera/internal/device_enumerator.h
> +++ b/include/libcamera/internal/device_enumerator.h
> @@ -9,6 +9,7 @@
>  
>  #include <memory>
>  #include <string>
> +#include <string_view>
>  #include <vector>
>  
>  #include <libcamera/base/signal.h>
> @@ -48,7 +49,7 @@ public:
>  protected:
>  	std::unique_ptr<MediaDevice> createDevice(const std::string &deviceNode);
>  	void addDevice(std::unique_ptr<MediaDevice> media);
> -	void removeDevice(const std::string &deviceNode);
> +	void removeDevice(std::string_view deviceNode);
>  
>  private:
>  	std::vector<std::shared_ptr<MediaDevice>> devices_;
> diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
> index 6a3e9c16a..bd7ac6ed1 100644
> --- a/include/libcamera/internal/formats.h
> +++ b/include/libcamera/internal/formats.h
> @@ -8,6 +8,7 @@
>  #pragma once
>  
>  #include <array>
> +#include <string_view>
>  #include <vector>
>  
>  #include <libcamera/geometry.h>
> @@ -35,7 +36,7 @@ public:
>  
>  	static const PixelFormatInfo &info(const PixelFormat &format);
>  	static const PixelFormatInfo &info(const V4L2PixelFormat &format);
> -	static const PixelFormatInfo &info(const std::string &name);
> +	static const PixelFormatInfo &info(std::string_view name);
>  
>  	unsigned int stride(unsigned int width, unsigned int plane,
>  			    unsigned int align = 1) const;
> diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h
> index e412d3a0b..91610a7aa 100644
> --- a/include/libcamera/internal/media_device.h
> +++ b/include/libcamera/internal/media_device.h
> @@ -9,6 +9,7 @@
>  
>  #include <map>
>  #include <string>
> +#include <string_view>
>  #include <vector>
>  
>  #include <linux/media.h>
> @@ -44,10 +45,10 @@ public:
>  	unsigned int hwRevision() const { return hwRevision_; }
>  
>  	const std::vector<MediaEntity *> &entities() const { return entities_; }
> -	MediaEntity *getEntityByName(const std::string &name) const;
> +	MediaEntity *getEntityByName(std::string_view name) const;
>  
> -	MediaLink *link(const std::string &sourceName, unsigned int sourceIdx,
> -			const std::string &sinkName, unsigned int sinkIdx);
> +	MediaLink *link(std::string_view sourceName, unsigned int sourceIdx,
> +			std::string_view sinkName, unsigned int sinkIdx);
>  	MediaLink *link(const MediaEntity *source, unsigned int sourceIdx,
>  			const MediaEntity *sink, unsigned int sinkIdx);
>  	MediaLink *link(const MediaPad *source, const MediaPad *sink);
> diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
> index fb28a18d0..45eafce9b 100644
> --- a/include/libcamera/internal/pipeline_handler.h
> +++ b/include/libcamera/internal/pipeline_handler.h
> @@ -10,6 +10,7 @@
>  #include <memory>
>  #include <queue>
>  #include <string>
> +#include <string_view>
>  #include <sys/types.h>
>  #include <vector>
>  
> @@ -112,7 +113,7 @@ public:
>  	const std::string &name() const { return name_; }
>  
>  	static std::vector<PipelineHandlerFactoryBase *> &factories();
> -	static const PipelineHandlerFactoryBase *getFactoryByName(const std::string &name);
> +	static const PipelineHandlerFactoryBase *getFactoryByName(std::string_view name);
>  
>  private:
>  	static void registerType(PipelineHandlerFactoryBase *factory);
> diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
> index 194382f84..d17365e14 100644
> --- a/include/libcamera/internal/v4l2_subdevice.h
> +++ b/include/libcamera/internal/v4l2_subdevice.h
> @@ -11,6 +11,7 @@
>  #include <optional>
>  #include <ostream>
>  #include <string>
> +#include <string_view>
>  #include <vector>
>  
>  #include <linux/v4l2-subdev.h>
> @@ -161,7 +162,7 @@ public:
>  	const V4L2SubdeviceCapability &caps() const { return caps_; }
>  
>  	static std::unique_ptr<V4L2Subdevice>
> -	fromEntityName(const MediaDevice *media, const std::string &entity);
> +	fromEntityName(const MediaDevice *media, std::string_view entity);
>  
>  protected:
>  	std::string logPrefix() const override;
> diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
> index f021c2a01..c256e82af 100644
> --- a/include/libcamera/internal/v4l2_videodevice.h
> +++ b/include/libcamera/internal/v4l2_videodevice.h
> @@ -14,6 +14,7 @@
>  #include <ostream>
>  #include <stdint.h>
>  #include <string>
> +#include <string_view>
>  #include <unordered_set>
>  #include <vector>
>  
> @@ -228,7 +229,7 @@ public:
>  	Signal<> dequeueTimeout;
>  
>  	static std::unique_ptr<V4L2VideoDevice>
> -	fromEntityName(const MediaDevice *media, const std::string &entity);
> +	fromEntityName(const MediaDevice *media, std::string_view entity);
>  
>  	V4L2PixelFormat toV4L2PixelFormat(const PixelFormat &pixelFormat) const;
>  
> diff --git a/include/libcamera/pixel_format.h b/include/libcamera/pixel_format.h
> index 1b4d8c7c8..874b2528b 100644
> --- a/include/libcamera/pixel_format.h
> +++ b/include/libcamera/pixel_format.h
> @@ -10,6 +10,7 @@
>  #include <ostream>
>  #include <stdint.h>
>  #include <string>
> +#include <string_view>
>  
>  namespace libcamera {
>  
> @@ -38,7 +39,7 @@ public:
>  
>  	std::string toString() const;
>  
> -	static PixelFormat fromString(const std::string &name);
> +	static PixelFormat fromString(std::string_view name);
>  
>  private:
>  	uint32_t fourcc_;
> diff --git a/src/apps/cam/capture_script.cpp b/src/apps/cam/capture_script.cpp
> index fc1dfa75f..d4760ea78 100644
> --- a/src/apps/cam/capture_script.cpp
> +++ b/src/apps/cam/capture_script.cpp
> @@ -432,7 +432,7 @@ std::vector<std::string> CaptureScript::parseSingleArray()
>  	}
>  }
>  
> -void CaptureScript::unpackFailure(const ControlId *id, const std::string &repr)
> +void CaptureScript::unpackFailure(const ControlId *id, std::string_view repr)
>  {
>  	static const std::map<unsigned int, const char *> typeNames = {
>  		{ ControlTypeNone, "none" },
> diff --git a/src/apps/cam/capture_script.h b/src/apps/cam/capture_script.h
> index 294b92036..fb40371f2 100644
> --- a/src/apps/cam/capture_script.h
> +++ b/src/apps/cam/capture_script.h
> @@ -10,6 +10,7 @@
>  #include <map>
>  #include <memory>
>  #include <string>
> +#include <string_view>
>  
>  #include <libcamera/camera.h>
>  #include <libcamera/controls.h>
> @@ -67,7 +68,7 @@ private:
>  	std::vector<std::string> parseSingleArray();
>  
>  	void unpackFailure(const libcamera::ControlId *id,
> -			   const std::string &repr);
> +			   std::string_view repr);
>  	libcamera::ControlValue unpackControl(const libcamera::ControlId *id);
>  	libcamera::Rectangle unpackRectangle(const std::vector<std::string> &strVec);
>  };
> diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp
> index 47bbb6b05..fd9c59ec4 100644
> --- a/src/apps/cam/drm.cpp
> +++ b/src/apps/cam/drm.cpp
> @@ -57,7 +57,7 @@ Object::~Object()
>  {
>  }
>  
> -const Property *Object::property(const std::string &name) const
> +const Property *Object::property(std::string_view name) const
>  {
>  	for (const PropertyValue &pv : properties_) {
>  		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
> @@ -68,7 +68,7 @@ const Property *Object::property(const std::string &name) const
>  	return nullptr;
>  }
>  
> -const PropertyValue *Object::propertyValue(const std::string &name) const
> +const PropertyValue *Object::propertyValue(std::string_view name) const
>  {
>  	for (const PropertyValue &pv : properties_) {
>  		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
> @@ -320,7 +320,7 @@ AtomicRequest::~AtomicRequest()
>  		drmModeAtomicFree(request_);
>  }
>  
> -int AtomicRequest::addProperty(const Object *object, const std::string &property,
> +int AtomicRequest::addProperty(const Object *object, std::string_view property,
>  			       uint64_t value)
>  {
>  	if (!valid_)
> @@ -335,7 +335,7 @@ int AtomicRequest::addProperty(const Object *object, const std::string &property
>  	return addProperty(object->id(), prop->id(), value);
>  }
>  
> -int AtomicRequest::addProperty(const Object *object, const std::string &property,
> +int AtomicRequest::addProperty(const Object *object, std::string_view property,
>  			       std::unique_ptr<Blob> blob)
>  {
>  	if (!valid_)
> diff --git a/src/apps/cam/drm.h b/src/apps/cam/drm.h
> index 1ba83b6eb..aa1b06400 100644
> --- a/src/apps/cam/drm.h
> +++ b/src/apps/cam/drm.h
> @@ -13,6 +13,7 @@
>  #include <memory>
>  #include <stdint.h>
>  #include <string>
> +#include <string_view>
>  #include <vector>
>  
>  #include <libcamera/base/signal.h>
> @@ -57,8 +58,8 @@ public:
>  	uint32_t id() const { return id_; }
>  	Type type() const { return type_; }
>  
> -	const Property *property(const std::string &name) const;
> -	const PropertyValue *propertyValue(const std::string &name) const;
> +	const Property *property(std::string_view name) const;
> +	const PropertyValue *propertyValue(std::string_view name) const;
>  	const std::vector<PropertyValue> &properties() const { return properties_; }
>  
>  protected:
> @@ -260,9 +261,9 @@ public:
>  	Device *device() const { return dev_; }
>  	bool isValid() const { return valid_; }
>  
> -	int addProperty(const Object *object, const std::string &property,
> +	int addProperty(const Object *object, std::string_view property,
>  			uint64_t value);
> -	int addProperty(const Object *object, const std::string &property,
> +	int addProperty(const Object *object, std::string_view property,
>  			std::unique_ptr<Blob> blob);
>  	int commit(unsigned int flags = 0);
>  
> diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
> index 7c66cd57d..4ed050b14 100644
> --- a/src/ipa/libipa/camera_sensor_helper.cpp
> +++ b/src/ipa/libipa/camera_sensor_helper.cpp
> @@ -240,7 +240,7 @@ CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(const std::string n
>   * corresponding to the named factory or a null pointer if no such factory
>   * exists
>   */
> -std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(const std::string &name)
> +std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(std::string_view name)
>  {
>  	const std::vector<CameraSensorHelperFactoryBase *> &factories =
>  		CameraSensorHelperFactoryBase::factories();
> diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h
> index a9300a64f..eedc80114 100644
> --- a/src/ipa/libipa/camera_sensor_helper.h
> +++ b/src/ipa/libipa/camera_sensor_helper.h
> @@ -11,6 +11,7 @@
>  #include <optional>
>  #include <stdint.h>
>  #include <string>
> +#include <string_view>
>  #include <variant>
>  #include <vector>
>  
> @@ -56,7 +57,7 @@ public:
>  	CameraSensorHelperFactoryBase(const std::string name);
>  	virtual ~CameraSensorHelperFactoryBase() = default;
>  
> -	static std::unique_ptr<CameraSensorHelper> create(const std::string &name);
> +	static std::unique_ptr<CameraSensorHelper> create(std::string_view name);
>  
>  	static std::vector<CameraSensorHelperFactoryBase *> &factories();
>  
> diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp
> index 64ca91419..91fb588e7 100644
> --- a/src/ipa/libipa/module.cpp
> +++ b/src/ipa/libipa/module.cpp
> @@ -107,7 +107,7 @@ namespace ipa {
>   */
>  
>  /**
> - * \fn Module::createAlgorithm(const std::string &name)
> + * \fn Module::createAlgorithm(std::string_view name)
>   * \brief Create an instance of an Algorithm by name
>   * \param[in] name The algorithm name
>   *
> diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h
> index 0fb51916f..62c700a64 100644
> --- a/src/ipa/libipa/module.h
> +++ b/src/ipa/libipa/module.h
> @@ -9,7 +9,7 @@
>  
>  #include <list>
>  #include <memory>
> -#include <string>
> +#include <string_view>
>  #include <vector>
>  
>  #include <libcamera/base/log.h>
> @@ -95,7 +95,7 @@ private:
>  		return 0;
>  	}
>  
> -	static std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)
> +	static std::unique_ptr<Algorithm<Module>> createAlgorithm(std::string_view name)
>  	{
>  		for (const AlgorithmFactoryBase<Module> *factory : factories()) {
>  			if (factory->name() == name)
> diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
> index bcfc1941a..de6e2afd6 100644
> --- a/src/libcamera/base/utils.cpp
> +++ b/src/libcamera/base/utils.cpp
> @@ -80,7 +80,7 @@ char *secure_getenv(const char *name)
>   *
>   * \return A string of the directory component of the path
>   */
> -std::string dirname(const std::string &path)
> +std::string dirname(std::string_view path)
>  {
>  	if (path.empty())
>  		return ".";
> @@ -116,7 +116,7 @@ std::string dirname(const std::string &path)
>  		pos--;
>  	}
>  
> -	return path.substr(0, pos + 1);
> +	return std::string(path.substr(0, pos + 1));
>  }
>  
>  /**
> @@ -278,7 +278,7 @@ std::string details::StringSplitter::iterator::operator*() const
>  
>  /**
>   * \fn template<typename Container, typename UnaryOp> \
> - * std::string utils::join(const Container &items, const std::string &sep, UnaryOp op)
> + * std::string utils::join(const Container &items, std::string_view sep, UnaryOp op)
>   * \brief Join elements of a container in a string with a separator
>   * \param[in] items The container
>   * \param[in] sep The separator to add between elements
> @@ -319,7 +319,7 @@ details::StringSplitter split(const std::string &str, const std::string &delim)
>   *
>   * \return A string equal to \a str stripped out of all non-ASCII characters
>   */
> -std::string toAscii(const std::string &str)
> +std::string toAscii(std::string_view str)
>  {
>  	std::string ret;
>  	for (const char &c : str)
> diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> index 87e6717ec..179fa37ea 100644
> --- a/src/libcamera/camera_manager.cpp
> +++ b/src/libcamera/camera_manager.cpp
> @@ -382,7 +382,7 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
>   *
>   * \return Shared pointer to Camera object or nullptr if camera not found
>   */
> -std::shared_ptr<Camera> CameraManager::get(const std::string &id)
> +std::shared_ptr<Camera> CameraManager::get(std::string_view id)
>  {
>  	Private *const d = _d();
>  
> diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
> index ae17862f6..8744a90f3 100644
> --- a/src/libcamera/device_enumerator.cpp
> +++ b/src/libcamera/device_enumerator.cpp
> @@ -272,7 +272,7 @@ void DeviceEnumerator::addDevice(std::unique_ptr<MediaDevice> media)
>   * enumerator with addDevice(). The media device's MediaDevice::disconnected
>   * signal is emitted.
>   */
> -void DeviceEnumerator::removeDevice(const std::string &deviceNode)
> +void DeviceEnumerator::removeDevice(std::string_view deviceNode)
>  {
>  	std::shared_ptr<MediaDevice> media;
>  
> diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp
> index 4e20a3cc0..c330f30bc 100644
> --- a/src/libcamera/device_enumerator_udev.cpp
> +++ b/src/libcamera/device_enumerator_udev.cpp
> @@ -351,7 +351,7 @@ void DeviceEnumeratorUdev::udevNotify()
>  	} else if (action == "remove") {
>  		const char *subsystem = udev_device_get_subsystem(dev);
>  		if (subsystem && !strcmp(subsystem, "media"))
> -			removeDevice(std::string(deviceNode));
> +			removeDevice(deviceNode);
>  	}
>  
>  	udev_device_unref(dev);
> diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> index bfcdfc089..112dfe66b 100644
> --- a/src/libcamera/formats.cpp
> +++ b/src/libcamera/formats.cpp
> @@ -1037,7 +1037,7 @@ const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
>   * \return The PixelFormatInfo describing the PixelFormat matching the
>   * \a name if known, or an invalid PixelFormatInfo otherwise
>   */
> -const PixelFormatInfo &PixelFormatInfo::info(const std::string &name)
> +const PixelFormatInfo &PixelFormatInfo::info(std::string_view name)
>  {
>  	for (const auto &info : pixelFormatInfo) {
>  		if (info.second.name == name)
> diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> index d71dad74d..131b34446 100644
> --- a/src/libcamera/media_device.cpp
> +++ b/src/libcamera/media_device.cpp
> @@ -331,7 +331,7 @@ done:
>   * \param[in] name The entity name
>   * \return The entity with \a name, or nullptr if no such entity is found
>   */
> -MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
> +MediaEntity *MediaDevice::getEntityByName(std::string_view name) const
>  {
>  	for (MediaEntity *e : entities_)
>  		if (e->name() == name)
> @@ -359,8 +359,8 @@ MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
>   * \return The link that connects the two pads, or nullptr if no such a link
>   * exists
>   */
> -MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceIdx,
> -			     const std::string &sinkName, unsigned int sinkIdx)
> +MediaLink *MediaDevice::link(std::string_view sourceName, unsigned int sourceIdx,
> +			     std::string_view sinkName, unsigned int sinkIdx)
>  {
>  	const MediaEntity *source = getEntityByName(sourceName);
>  	const MediaEntity *sink = getEntityByName(sinkName);
> @@ -382,8 +382,8 @@ MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceI
>   * entity \a source, to the pad at index \a sinkIdx of the sink entity \a
>   * sink, if any.
>   *
> - * \sa link(const std::string &sourceName, unsigned int sourceIdx,
> - *          const std::string &sinkName, unsigned int sinkIdx)
> + * \sa link(std::string_view sourceName, unsigned int sourceIdx,
> + *          std::string_view sinkName, unsigned int sinkIdx)
>   * \sa link(const MediaPad *source, const MediaPad *sink)
>   *
>   * \return The link that connects the two pads, or nullptr if no such a link
> @@ -406,8 +406,8 @@ MediaLink *MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx,
>   * \param[in] source The source pad
>   * \param[in] sink The sink pad
>   *
> - * \sa link(const std::string &sourceName, unsigned int sourceIdx,
> - *          const std::string &sinkName, unsigned int sinkIdx)
> + * \sa link(std::string_view sourceName, unsigned int sourceIdx,
> + *          std::string_view sinkName, unsigned int sinkIdx)
>   * \sa link(const MediaEntity *source, unsigned int sourceIdx,
>   *          const MediaEntity *sink, unsigned int sinkIdx)
>   *
> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> index caa5c20e7..6b395c666 100644
> --- a/src/libcamera/pipeline_handler.cpp
> +++ b/src/libcamera/pipeline_handler.cpp
> @@ -852,7 +852,7 @@ std::vector<PipelineHandlerFactoryBase *> &PipelineHandlerFactoryBase::factories
>   * \param[in] name The pipeline handler name
>   * \return The factory of the pipeline with name \a name, or nullptr if not found
>   */
> -const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(const std::string &name)
> +const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(std::string_view name)
>  {
>  	const std::vector<PipelineHandlerFactoryBase *> &factories =
>  		PipelineHandlerFactoryBase::factories();
> diff --git a/src/libcamera/pixel_format.cpp b/src/libcamera/pixel_format.cpp
> index 314179a81..22f1520fd 100644
> --- a/src/libcamera/pixel_format.cpp
> +++ b/src/libcamera/pixel_format.cpp
> @@ -135,7 +135,7 @@ std::string PixelFormat::toString() const
>   * \return The PixelFormat represented by the \a name if known, or an
>   * invalid pixel format otherwise.
>   */
> -PixelFormat PixelFormat::fromString(const std::string &name)
> +PixelFormat PixelFormat::fromString(std::string_view name)
>  {
>  	return PixelFormatInfo::info(name).format;
>  }
> diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp
> index 2b06c5a1a..4283cacfa 100644
> --- a/src/libcamera/sensor/camera_sensor_properties.cpp
> +++ b/src/libcamera/sensor/camera_sensor_properties.cpp
> @@ -78,9 +78,9 @@ LOG_DEFINE_CATEGORY(CameraSensorProperties)
>   * \return A pointer to the CameraSensorProperties instance associated with a sensor
>   * or nullptr if the sensor is not supported
>   */
> -const CameraSensorProperties *CameraSensorProperties::get(const std::string &sensor)
> +const CameraSensorProperties *CameraSensorProperties::get(std::string_view sensor)
>  {
> -	static const std::map<std::string, const CameraSensorProperties> sensorProps = {
> +	static const std::map<std::string_view, const CameraSensorProperties> sensorProps = {
>  		{ "ar0144", {
>  			.unitCellSize = { 3000, 3000 },
>  			.testPatternModes = {
> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
> index 3a0d075f9..7e85b33be 100644
> --- a/src/libcamera/v4l2_subdevice.cpp
> +++ b/src/libcamera/v4l2_subdevice.cpp
> @@ -1688,7 +1688,7 @@ const std::string &V4L2Subdevice::model()
>   */
>  std::unique_ptr<V4L2Subdevice>
>  V4L2Subdevice::fromEntityName(const MediaDevice *media,
> -			      const std::string &entity)
> +			      std::string_view entity)
>  {
>  	MediaEntity *mediaEntity = media->getEntityByName(entity);
>  	if (!mediaEntity)
> diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> index a5cf67845..834a1bd0d 100644
> --- a/src/libcamera/v4l2_videodevice.cpp
> +++ b/src/libcamera/v4l2_videodevice.cpp
> @@ -2077,7 +2077,7 @@ void V4L2VideoDevice::watchdogExpired()
>   */
>  std::unique_ptr<V4L2VideoDevice>
>  V4L2VideoDevice::fromEntityName(const MediaDevice *media,
> -				const std::string &entity)
> +				std::string_view entity)
>  {
>  	MediaEntity *mediaEntity = media->getEntityByName(entity);
>  	if (!mediaEntity)
> diff --git a/src/py/libcamera/py_camera_manager.h b/src/py/libcamera/py_camera_manager.h
> index 3574db236..af69b915e 100644
> --- a/src/py/libcamera/py_camera_manager.h
> +++ b/src/py/libcamera/py_camera_manager.h
> @@ -20,7 +20,7 @@ public:
>  	~PyCameraManager();
>  
>  	pybind11::list cameras();
> -	std::shared_ptr<Camera> get(const std::string &name) { return cameraManager_->get(name); }
> +	std::shared_ptr<Camera> get(std::string_view name) { return cameraManager_->get(name); }
>  
>  	static const std::string &version() { return CameraManager::version(); }
>  
> diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
> index 441a70ab4..820768c24 100644
> --- a/src/py/libcamera/py_main.cpp
> +++ b/src/py/libcamera/py_main.cpp
> @@ -510,7 +510,7 @@ PYBIND11_MODULE(_libcamera, m)
>  	pyPixelFormat
>  		.def(py::init<>())
>  		.def(py::init<uint32_t, uint64_t>())
> -		.def(py::init<>([](const std::string &str) {
> +		.def(py::init<>([](std::string_view str) {
>  			return PixelFormat::fromString(str);
>  		}))
>  		.def_property_readonly("fourcc", &PixelFormat::fourcc)
Barnabás Pőcze Dec. 15, 2024, 10:46 p.m. UTC | #2
Hi


2024. december 15., vasárnap 21:56 keltezéssel, Laurent Pinchart <laurent.pinchart@ideasonboard.com> írta:

> Hi Barnabás,
> 
> Thank you for the patch.
> 
> On Sun, Dec 15, 2024 at 08:48:06PM +0000, Barnabás Pőcze wrote:
> > A parameter of type `const std::string&` is not the right choice in
> > almost all cases. It forces the caller to construct an `std::string`
> > if they don't already have one, and accessing its data requires
> > an extra indirection. Furthermore, `std::string` is just one
> > instantiation of `std::basic_string<>`, using e.g. a different
> > allocator would immediately make it incompatible.
> 
> I don't think the allocator is an issue in libcamera.

This is a general argument in favor, not specific to libcamera, indeed. Although
users can still use different allocators, in which case they would be affected,
e.g. `CameraManager::get()`.


> 
> >
> > In contrast to that using an `std::string_view` is better if
> > NUL termination is not needed since no `std::string` construction
> > is required, and in many cases it can be passed directly in registers.
> 
> I had a go at this previously, and had very mixed feelings about the
> result. I'll post a WIP series for discussion.

What were the concerns? This change only considers a limited subset of all
`const std::string&` parameters. For example, functions (constructors) where a
copy of the string made are excluded. Mostly the "find-thing-by-name" style
functions are converted here.


Regards,
Barnabás Pőcze


> 
> >
> > Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
> > ---
> >  include/libcamera/base/utils.h                     | 10 +++++-----
> >  include/libcamera/camera_manager.h                 |  3 ++-
> >  .../libcamera/internal/camera_sensor_properties.h  |  4 ++--
> >  include/libcamera/internal/device_enumerator.h     |  3 ++-
> >  include/libcamera/internal/formats.h               |  3 ++-
> >  include/libcamera/internal/media_device.h          |  7 ++++---
> >  include/libcamera/internal/pipeline_handler.h      |  3 ++-
> >  include/libcamera/internal/v4l2_subdevice.h        |  3 ++-
> >  include/libcamera/internal/v4l2_videodevice.h      |  3 ++-
> >  include/libcamera/pixel_format.h                   |  3 ++-
> >  src/apps/cam/capture_script.cpp                    |  2 +-
> >  src/apps/cam/capture_script.h                      |  3 ++-
> >  src/apps/cam/drm.cpp                               |  8 ++++----
> >  src/apps/cam/drm.h                                 |  9 +++++----
> >  src/ipa/libipa/camera_sensor_helper.cpp            |  2 +-
> >  src/ipa/libipa/camera_sensor_helper.h              |  3 ++-
> >  src/ipa/libipa/module.cpp                          |  2 +-
> >  src/ipa/libipa/module.h                            |  4 ++--
> >  src/libcamera/base/utils.cpp                       |  8 ++++----
> >  src/libcamera/camera_manager.cpp                   |  2 +-
> >  src/libcamera/device_enumerator.cpp                |  2 +-
> >  src/libcamera/device_enumerator_udev.cpp           |  2 +-
> >  src/libcamera/formats.cpp                          |  2 +-
> >  src/libcamera/media_device.cpp                     | 14 +++++++-------
> >  src/libcamera/pipeline_handler.cpp                 |  2 +-
> >  src/libcamera/pixel_format.cpp                     |  2 +-
> >  src/libcamera/sensor/camera_sensor_properties.cpp  |  4 ++--
> >  src/libcamera/v4l2_subdevice.cpp                   |  2 +-
> >  src/libcamera/v4l2_videodevice.cpp                 |  2 +-
> >  src/py/libcamera/py_camera_manager.h               |  2 +-
> >  src/py/libcamera/py_main.cpp                       |  2 +-
> >  31 files changed, 66 insertions(+), 55 deletions(-)
> >
> > diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> > index 780aeda6a..3b8b3dea9 100644
> > --- a/include/libcamera/base/utils.h
> > +++ b/include/libcamera/base/utils.h
> > @@ -38,7 +38,7 @@ namespace utils {
> >  const char *basename(const char *path);
> >
> >  char *secure_getenv(const char *name);
> > -std::string dirname(const std::string &path);
> > +std::string dirname(std::string_view path);
> >
> >  template<typename T>
> >  std::vector<typename T::key_type> map_keys(const T &map)
> > @@ -143,7 +143,7 @@ size_t strlcpy(char *dst, const char *src, size_t size);
> >
> >  #ifndef __DOXYGEN__
> >  template<typename Container, typename UnaryOp>
> > -std::string join(const Container &items, const std::string &sep, UnaryOp op)
> > +std::string join(const Container &items, std::string_view sep, UnaryOp op)
> >  {
> >  	std::ostringstream ss;
> >  	bool first = true;
> > @@ -162,7 +162,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)
> >  }
> >
> >  template<typename Container>
> > -std::string join(const Container &items, const std::string &sep)
> > +std::string join(const Container &items, std::string_view sep)
> >  {
> >  	std::ostringstream ss;
> >  	bool first = true;
> > @@ -181,7 +181,7 @@ std::string join(const Container &items, const std::string &sep)
> >  }
> >  #else
> >  template<typename Container, typename UnaryOp>
> > -std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr);
> > +std::string join(const Container &items, std::string_view sep, UnaryOp op = nullptr);
> >  #endif
> >
> >  namespace details {
> > @@ -240,7 +240,7 @@ private:
> >
> >  details::StringSplitter split(const std::string &str, const std::string &delim);
> >
> > -std::string toAscii(const std::string &str);
> > +std::string toAscii(std::string_view str);
> >
> >  std::string libcameraBuildPath();
> >  std::string libcameraSourcePath();
> > diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
> > index b50df7825..27835500f 100644
> > --- a/include/libcamera/camera_manager.h
> > +++ b/include/libcamera/camera_manager.h
> > @@ -9,6 +9,7 @@
> >
> >  #include <memory>
> >  #include <string>
> > +#include <string_view>
> >  #include <sys/types.h>
> >  #include <vector>
> >
> > @@ -31,7 +32,7 @@ public:
> >  	void stop();
> >
> >  	std::vector<std::shared_ptr<Camera>> cameras() const;
> > -	std::shared_ptr<Camera> get(const std::string &id);
> > +	std::shared_ptr<Camera> get(std::string_view id);
> >
> >  	static const std::string &version() { return version_; }
> >
> > diff --git a/include/libcamera/internal/camera_sensor_properties.h b/include/libcamera/internal/camera_sensor_properties.h
> > index d7d4dab62..b44093906 100644
> > --- a/include/libcamera/internal/camera_sensor_properties.h
> > +++ b/include/libcamera/internal/camera_sensor_properties.h
> > @@ -9,7 +9,7 @@
> >
> >  #include <map>
> >  #include <stdint.h>
> > -#include <string>
> > +#include <string_view>
> >
> >  #include <libcamera/control_ids.h>
> >  #include <libcamera/geometry.h>
> > @@ -24,7 +24,7 @@ struct CameraSensorProperties {
> >  		uint8_t hblankDelay;
> >  	};
> >
> > -	static const CameraSensorProperties *get(const std::string &sensor);
> > +	static const CameraSensorProperties *get(std::string_view sensor);
> >
> >  	Size unitCellSize;
> >  	std::map<controls::draft::TestPatternModeEnum, int32_t> testPatternModes;
> > diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h
> > index db3532a98..eecc39cfb 100644
> > --- a/include/libcamera/internal/device_enumerator.h
> > +++ b/include/libcamera/internal/device_enumerator.h
> > @@ -9,6 +9,7 @@
> >
> >  #include <memory>
> >  #include <string>
> > +#include <string_view>
> >  #include <vector>
> >
> >  #include <libcamera/base/signal.h>
> > @@ -48,7 +49,7 @@ public:
> >  protected:
> >  	std::unique_ptr<MediaDevice> createDevice(const std::string &deviceNode);
> >  	void addDevice(std::unique_ptr<MediaDevice> media);
> > -	void removeDevice(const std::string &deviceNode);
> > +	void removeDevice(std::string_view deviceNode);
> >
> >  private:
> >  	std::vector<std::shared_ptr<MediaDevice>> devices_;
> > diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
> > index 6a3e9c16a..bd7ac6ed1 100644
> > --- a/include/libcamera/internal/formats.h
> > +++ b/include/libcamera/internal/formats.h
> > @@ -8,6 +8,7 @@
> >  #pragma once
> >
> >  #include <array>
> > +#include <string_view>
> >  #include <vector>
> >
> >  #include <libcamera/geometry.h>
> > @@ -35,7 +36,7 @@ public:
> >
> >  	static const PixelFormatInfo &info(const PixelFormat &format);
> >  	static const PixelFormatInfo &info(const V4L2PixelFormat &format);
> > -	static const PixelFormatInfo &info(const std::string &name);
> > +	static const PixelFormatInfo &info(std::string_view name);
> >
> >  	unsigned int stride(unsigned int width, unsigned int plane,
> >  			    unsigned int align = 1) const;
> > diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h
> > index e412d3a0b..91610a7aa 100644
> > --- a/include/libcamera/internal/media_device.h
> > +++ b/include/libcamera/internal/media_device.h
> > @@ -9,6 +9,7 @@
> >
> >  #include <map>
> >  #include <string>
> > +#include <string_view>
> >  #include <vector>
> >
> >  #include <linux/media.h>
> > @@ -44,10 +45,10 @@ public:
> >  	unsigned int hwRevision() const { return hwRevision_; }
> >
> >  	const std::vector<MediaEntity *> &entities() const { return entities_; }
> > -	MediaEntity *getEntityByName(const std::string &name) const;
> > +	MediaEntity *getEntityByName(std::string_view name) const;
> >
> > -	MediaLink *link(const std::string &sourceName, unsigned int sourceIdx,
> > -			const std::string &sinkName, unsigned int sinkIdx);
> > +	MediaLink *link(std::string_view sourceName, unsigned int sourceIdx,
> > +			std::string_view sinkName, unsigned int sinkIdx);
> >  	MediaLink *link(const MediaEntity *source, unsigned int sourceIdx,
> >  			const MediaEntity *sink, unsigned int sinkIdx);
> >  	MediaLink *link(const MediaPad *source, const MediaPad *sink);
> > diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
> > index fb28a18d0..45eafce9b 100644
> > --- a/include/libcamera/internal/pipeline_handler.h
> > +++ b/include/libcamera/internal/pipeline_handler.h
> > @@ -10,6 +10,7 @@
> >  #include <memory>
> >  #include <queue>
> >  #include <string>
> > +#include <string_view>
> >  #include <sys/types.h>
> >  #include <vector>
> >
> > @@ -112,7 +113,7 @@ public:
> >  	const std::string &name() const { return name_; }
> >
> >  	static std::vector<PipelineHandlerFactoryBase *> &factories();
> > -	static const PipelineHandlerFactoryBase *getFactoryByName(const std::string &name);
> > +	static const PipelineHandlerFactoryBase *getFactoryByName(std::string_view name);
> >
> >  private:
> >  	static void registerType(PipelineHandlerFactoryBase *factory);
> > diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
> > index 194382f84..d17365e14 100644
> > --- a/include/libcamera/internal/v4l2_subdevice.h
> > +++ b/include/libcamera/internal/v4l2_subdevice.h
> > @@ -11,6 +11,7 @@
> >  #include <optional>
> >  #include <ostream>
> >  #include <string>
> > +#include <string_view>
> >  #include <vector>
> >
> >  #include <linux/v4l2-subdev.h>
> > @@ -161,7 +162,7 @@ public:
> >  	const V4L2SubdeviceCapability &caps() const { return caps_; }
> >
> >  	static std::unique_ptr<V4L2Subdevice>
> > -	fromEntityName(const MediaDevice *media, const std::string &entity);
> > +	fromEntityName(const MediaDevice *media, std::string_view entity);
> >
> >  protected:
> >  	std::string logPrefix() const override;
> > diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
> > index f021c2a01..c256e82af 100644
> > --- a/include/libcamera/internal/v4l2_videodevice.h
> > +++ b/include/libcamera/internal/v4l2_videodevice.h
> > @@ -14,6 +14,7 @@
> >  #include <ostream>
> >  #include <stdint.h>
> >  #include <string>
> > +#include <string_view>
> >  #include <unordered_set>
> >  #include <vector>
> >
> > @@ -228,7 +229,7 @@ public:
> >  	Signal<> dequeueTimeout;
> >
> >  	static std::unique_ptr<V4L2VideoDevice>
> > -	fromEntityName(const MediaDevice *media, const std::string &entity);
> > +	fromEntityName(const MediaDevice *media, std::string_view entity);
> >
> >  	V4L2PixelFormat toV4L2PixelFormat(const PixelFormat &pixelFormat) const;
> >
> > diff --git a/include/libcamera/pixel_format.h b/include/libcamera/pixel_format.h
> > index 1b4d8c7c8..874b2528b 100644
> > --- a/include/libcamera/pixel_format.h
> > +++ b/include/libcamera/pixel_format.h
> > @@ -10,6 +10,7 @@
> >  #include <ostream>
> >  #include <stdint.h>
> >  #include <string>
> > +#include <string_view>
> >
> >  namespace libcamera {
> >
> > @@ -38,7 +39,7 @@ public:
> >
> >  	std::string toString() const;
> >
> > -	static PixelFormat fromString(const std::string &name);
> > +	static PixelFormat fromString(std::string_view name);
> >
> >  private:
> >  	uint32_t fourcc_;
> > diff --git a/src/apps/cam/capture_script.cpp b/src/apps/cam/capture_script.cpp
> > index fc1dfa75f..d4760ea78 100644
> > --- a/src/apps/cam/capture_script.cpp
> > +++ b/src/apps/cam/capture_script.cpp
> > @@ -432,7 +432,7 @@ std::vector<std::string> CaptureScript::parseSingleArray()
> >  	}
> >  }
> >
> > -void CaptureScript::unpackFailure(const ControlId *id, const std::string &repr)
> > +void CaptureScript::unpackFailure(const ControlId *id, std::string_view repr)
> >  {
> >  	static const std::map<unsigned int, const char *> typeNames = {
> >  		{ ControlTypeNone, "none" },
> > diff --git a/src/apps/cam/capture_script.h b/src/apps/cam/capture_script.h
> > index 294b92036..fb40371f2 100644
> > --- a/src/apps/cam/capture_script.h
> > +++ b/src/apps/cam/capture_script.h
> > @@ -10,6 +10,7 @@
> >  #include <map>
> >  #include <memory>
> >  #include <string>
> > +#include <string_view>
> >
> >  #include <libcamera/camera.h>
> >  #include <libcamera/controls.h>
> > @@ -67,7 +68,7 @@ private:
> >  	std::vector<std::string> parseSingleArray();
> >
> >  	void unpackFailure(const libcamera::ControlId *id,
> > -			   const std::string &repr);
> > +			   std::string_view repr);
> >  	libcamera::ControlValue unpackControl(const libcamera::ControlId *id);
> >  	libcamera::Rectangle unpackRectangle(const std::vector<std::string> &strVec);
> >  };
> > diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp
> > index 47bbb6b05..fd9c59ec4 100644
> > --- a/src/apps/cam/drm.cpp
> > +++ b/src/apps/cam/drm.cpp
> > @@ -57,7 +57,7 @@ Object::~Object()
> >  {
> >  }
> >
> > -const Property *Object::property(const std::string &name) const
> > +const Property *Object::property(std::string_view name) const
> >  {
> >  	for (const PropertyValue &pv : properties_) {
> >  		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
> > @@ -68,7 +68,7 @@ const Property *Object::property(const std::string &name) const
> >  	return nullptr;
> >  }
> >
> > -const PropertyValue *Object::propertyValue(const std::string &name) const
> > +const PropertyValue *Object::propertyValue(std::string_view name) const
> >  {
> >  	for (const PropertyValue &pv : properties_) {
> >  		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
> > @@ -320,7 +320,7 @@ AtomicRequest::~AtomicRequest()
> >  		drmModeAtomicFree(request_);
> >  }
> >
> > -int AtomicRequest::addProperty(const Object *object, const std::string &property,
> > +int AtomicRequest::addProperty(const Object *object, std::string_view property,
> >  			       uint64_t value)
> >  {
> >  	if (!valid_)
> > @@ -335,7 +335,7 @@ int AtomicRequest::addProperty(const Object *object, const std::string &property
> >  	return addProperty(object->id(), prop->id(), value);
> >  }
> >
> > -int AtomicRequest::addProperty(const Object *object, const std::string &property,
> > +int AtomicRequest::addProperty(const Object *object, std::string_view property,
> >  			       std::unique_ptr<Blob> blob)
> >  {
> >  	if (!valid_)
> > diff --git a/src/apps/cam/drm.h b/src/apps/cam/drm.h
> > index 1ba83b6eb..aa1b06400 100644
> > --- a/src/apps/cam/drm.h
> > +++ b/src/apps/cam/drm.h
> > @@ -13,6 +13,7 @@
> >  #include <memory>
> >  #include <stdint.h>
> >  #include <string>
> > +#include <string_view>
> >  #include <vector>
> >
> >  #include <libcamera/base/signal.h>
> > @@ -57,8 +58,8 @@ public:
> >  	uint32_t id() const { return id_; }
> >  	Type type() const { return type_; }
> >
> > -	const Property *property(const std::string &name) const;
> > -	const PropertyValue *propertyValue(const std::string &name) const;
> > +	const Property *property(std::string_view name) const;
> > +	const PropertyValue *propertyValue(std::string_view name) const;
> >  	const std::vector<PropertyValue> &properties() const { return properties_; }
> >
> >  protected:
> > @@ -260,9 +261,9 @@ public:
> >  	Device *device() const { return dev_; }
> >  	bool isValid() const { return valid_; }
> >
> > -	int addProperty(const Object *object, const std::string &property,
> > +	int addProperty(const Object *object, std::string_view property,
> >  			uint64_t value);
> > -	int addProperty(const Object *object, const std::string &property,
> > +	int addProperty(const Object *object, std::string_view property,
> >  			std::unique_ptr<Blob> blob);
> >  	int commit(unsigned int flags = 0);
> >
> > diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
> > index 7c66cd57d..4ed050b14 100644
> > --- a/src/ipa/libipa/camera_sensor_helper.cpp
> > +++ b/src/ipa/libipa/camera_sensor_helper.cpp
> > @@ -240,7 +240,7 @@ CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(const std::string n
> >   * corresponding to the named factory or a null pointer if no such factory
> >   * exists
> >   */
> > -std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(const std::string &name)
> > +std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(std::string_view name)
> >  {
> >  	const std::vector<CameraSensorHelperFactoryBase *> &factories =
> >  		CameraSensorHelperFactoryBase::factories();
> > diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h
> > index a9300a64f..eedc80114 100644
> > --- a/src/ipa/libipa/camera_sensor_helper.h
> > +++ b/src/ipa/libipa/camera_sensor_helper.h
> > @@ -11,6 +11,7 @@
> >  #include <optional>
> >  #include <stdint.h>
> >  #include <string>
> > +#include <string_view>
> >  #include <variant>
> >  #include <vector>
> >
> > @@ -56,7 +57,7 @@ public:
> >  	CameraSensorHelperFactoryBase(const std::string name);
> >  	virtual ~CameraSensorHelperFactoryBase() = default;
> >
> > -	static std::unique_ptr<CameraSensorHelper> create(const std::string &name);
> > +	static std::unique_ptr<CameraSensorHelper> create(std::string_view name);
> >
> >  	static std::vector<CameraSensorHelperFactoryBase *> &factories();
> >
> > diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp
> > index 64ca91419..91fb588e7 100644
> > --- a/src/ipa/libipa/module.cpp
> > +++ b/src/ipa/libipa/module.cpp
> > @@ -107,7 +107,7 @@ namespace ipa {
> >   */
> >
> >  /**
> > - * \fn Module::createAlgorithm(const std::string &name)
> > + * \fn Module::createAlgorithm(std::string_view name)
> >   * \brief Create an instance of an Algorithm by name
> >   * \param[in] name The algorithm name
> >   *
> > diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h
> > index 0fb51916f..62c700a64 100644
> > --- a/src/ipa/libipa/module.h
> > +++ b/src/ipa/libipa/module.h
> > @@ -9,7 +9,7 @@
> >
> >  #include <list>
> >  #include <memory>
> > -#include <string>
> > +#include <string_view>
> >  #include <vector>
> >
> >  #include <libcamera/base/log.h>
> > @@ -95,7 +95,7 @@ private:
> >  		return 0;
> >  	}
> >
> > -	static std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)
> > +	static std::unique_ptr<Algorithm<Module>> createAlgorithm(std::string_view name)
> >  	{
> >  		for (const AlgorithmFactoryBase<Module> *factory : factories()) {
> >  			if (factory->name() == name)
> > diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
> > index bcfc1941a..de6e2afd6 100644
> > --- a/src/libcamera/base/utils.cpp
> > +++ b/src/libcamera/base/utils.cpp
> > @@ -80,7 +80,7 @@ char *secure_getenv(const char *name)
> >   *
> >   * \return A string of the directory component of the path
> >   */
> > -std::string dirname(const std::string &path)
> > +std::string dirname(std::string_view path)
> >  {
> >  	if (path.empty())
> >  		return ".";
> > @@ -116,7 +116,7 @@ std::string dirname(const std::string &path)
> >  		pos--;
> >  	}
> >
> > -	return path.substr(0, pos + 1);
> > +	return std::string(path.substr(0, pos + 1));
> >  }
> >
> >  /**
> > @@ -278,7 +278,7 @@ std::string details::StringSplitter::iterator::operator*() const
> >
> >  /**
> >   * \fn template<typename Container, typename UnaryOp> \
> > - * std::string utils::join(const Container &items, const std::string &sep, UnaryOp op)
> > + * std::string utils::join(const Container &items, std::string_view sep, UnaryOp op)
> >   * \brief Join elements of a container in a string with a separator
> >   * \param[in] items The container
> >   * \param[in] sep The separator to add between elements
> > @@ -319,7 +319,7 @@ details::StringSplitter split(const std::string &str, const std::string &delim)
> >   *
> >   * \return A string equal to \a str stripped out of all non-ASCII characters
> >   */
> > -std::string toAscii(const std::string &str)
> > +std::string toAscii(std::string_view str)
> >  {
> >  	std::string ret;
> >  	for (const char &c : str)
> > diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> > index 87e6717ec..179fa37ea 100644
> > --- a/src/libcamera/camera_manager.cpp
> > +++ b/src/libcamera/camera_manager.cpp
> > @@ -382,7 +382,7 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
> >   *
> >   * \return Shared pointer to Camera object or nullptr if camera not found
> >   */
> > -std::shared_ptr<Camera> CameraManager::get(const std::string &id)
> > +std::shared_ptr<Camera> CameraManager::get(std::string_view id)
> >  {
> >  	Private *const d = _d();
> >
> > diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
> > index ae17862f6..8744a90f3 100644
> > --- a/src/libcamera/device_enumerator.cpp
> > +++ b/src/libcamera/device_enumerator.cpp
> > @@ -272,7 +272,7 @@ void DeviceEnumerator::addDevice(std::unique_ptr<MediaDevice> media)
> >   * enumerator with addDevice(). The media device's MediaDevice::disconnected
> >   * signal is emitted.
> >   */
> > -void DeviceEnumerator::removeDevice(const std::string &deviceNode)
> > +void DeviceEnumerator::removeDevice(std::string_view deviceNode)
> >  {
> >  	std::shared_ptr<MediaDevice> media;
> >
> > diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp
> > index 4e20a3cc0..c330f30bc 100644
> > --- a/src/libcamera/device_enumerator_udev.cpp
> > +++ b/src/libcamera/device_enumerator_udev.cpp
> > @@ -351,7 +351,7 @@ void DeviceEnumeratorUdev::udevNotify()
> >  	} else if (action == "remove") {
> >  		const char *subsystem = udev_device_get_subsystem(dev);
> >  		if (subsystem && !strcmp(subsystem, "media"))
> > -			removeDevice(std::string(deviceNode));
> > +			removeDevice(deviceNode);
> >  	}
> >
> >  	udev_device_unref(dev);
> > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> > index bfcdfc089..112dfe66b 100644
> > --- a/src/libcamera/formats.cpp
> > +++ b/src/libcamera/formats.cpp
> > @@ -1037,7 +1037,7 @@ const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
> >   * \return The PixelFormatInfo describing the PixelFormat matching the
> >   * \a name if known, or an invalid PixelFormatInfo otherwise
> >   */
> > -const PixelFormatInfo &PixelFormatInfo::info(const std::string &name)
> > +const PixelFormatInfo &PixelFormatInfo::info(std::string_view name)
> >  {
> >  	for (const auto &info : pixelFormatInfo) {
> >  		if (info.second.name == name)
> > diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> > index d71dad74d..131b34446 100644
> > --- a/src/libcamera/media_device.cpp
> > +++ b/src/libcamera/media_device.cpp
> > @@ -331,7 +331,7 @@ done:
> >   * \param[in] name The entity name
> >   * \return The entity with \a name, or nullptr if no such entity is found
> >   */
> > -MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
> > +MediaEntity *MediaDevice::getEntityByName(std::string_view name) const
> >  {
> >  	for (MediaEntity *e : entities_)
> >  		if (e->name() == name)
> > @@ -359,8 +359,8 @@ MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
> >   * \return The link that connects the two pads, or nullptr if no such a link
> >   * exists
> >   */
> > -MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceIdx,
> > -			     const std::string &sinkName, unsigned int sinkIdx)
> > +MediaLink *MediaDevice::link(std::string_view sourceName, unsigned int sourceIdx,
> > +			     std::string_view sinkName, unsigned int sinkIdx)
> >  {
> >  	const MediaEntity *source = getEntityByName(sourceName);
> >  	const MediaEntity *sink = getEntityByName(sinkName);
> > @@ -382,8 +382,8 @@ MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceI
> >   * entity \a source, to the pad at index \a sinkIdx of the sink entity \a
> >   * sink, if any.
> >   *
> > - * \sa link(const std::string &sourceName, unsigned int sourceIdx,
> > - *          const std::string &sinkName, unsigned int sinkIdx)
> > + * \sa link(std::string_view sourceName, unsigned int sourceIdx,
> > + *          std::string_view sinkName, unsigned int sinkIdx)
> >   * \sa link(const MediaPad *source, const MediaPad *sink)
> >   *
> >   * \return The link that connects the two pads, or nullptr if no such a link
> > @@ -406,8 +406,8 @@ MediaLink *MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx,
> >   * \param[in] source The source pad
> >   * \param[in] sink The sink pad
> >   *
> > - * \sa link(const std::string &sourceName, unsigned int sourceIdx,
> > - *          const std::string &sinkName, unsigned int sinkIdx)
> > + * \sa link(std::string_view sourceName, unsigned int sourceIdx,
> > + *          std::string_view sinkName, unsigned int sinkIdx)
> >   * \sa link(const MediaEntity *source, unsigned int sourceIdx,
> >   *          const MediaEntity *sink, unsigned int sinkIdx)
> >   *
> > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> > index caa5c20e7..6b395c666 100644
> > --- a/src/libcamera/pipeline_handler.cpp
> > +++ b/src/libcamera/pipeline_handler.cpp
> > @@ -852,7 +852,7 @@ std::vector<PipelineHandlerFactoryBase *> &PipelineHandlerFactoryBase::factories
> >   * \param[in] name The pipeline handler name
> >   * \return The factory of the pipeline with name \a name, or nullptr if not found
> >   */
> > -const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(const std::string &name)
> > +const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(std::string_view name)
> >  {
> >  	const std::vector<PipelineHandlerFactoryBase *> &factories =
> >  		PipelineHandlerFactoryBase::factories();
> > diff --git a/src/libcamera/pixel_format.cpp b/src/libcamera/pixel_format.cpp
> > index 314179a81..22f1520fd 100644
> > --- a/src/libcamera/pixel_format.cpp
> > +++ b/src/libcamera/pixel_format.cpp
> > @@ -135,7 +135,7 @@ std::string PixelFormat::toString() const
> >   * \return The PixelFormat represented by the \a name if known, or an
> >   * invalid pixel format otherwise.
> >   */
> > -PixelFormat PixelFormat::fromString(const std::string &name)
> > +PixelFormat PixelFormat::fromString(std::string_view name)
> >  {
> >  	return PixelFormatInfo::info(name).format;
> >  }
> > diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp
> > index 2b06c5a1a..4283cacfa 100644
> > --- a/src/libcamera/sensor/camera_sensor_properties.cpp
> > +++ b/src/libcamera/sensor/camera_sensor_properties.cpp
> > @@ -78,9 +78,9 @@ LOG_DEFINE_CATEGORY(CameraSensorProperties)
> >   * \return A pointer to the CameraSensorProperties instance associated with a sensor
> >   * or nullptr if the sensor is not supported
> >   */
> > -const CameraSensorProperties *CameraSensorProperties::get(const std::string &sensor)
> > +const CameraSensorProperties *CameraSensorProperties::get(std::string_view sensor)
> >  {
> > -	static const std::map<std::string, const CameraSensorProperties> sensorProps = {
> > +	static const std::map<std::string_view, const CameraSensorProperties> sensorProps = {
> >  		{ "ar0144", {
> >  			.unitCellSize = { 3000, 3000 },
> >  			.testPatternModes = {
> > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
> > index 3a0d075f9..7e85b33be 100644
> > --- a/src/libcamera/v4l2_subdevice.cpp
> > +++ b/src/libcamera/v4l2_subdevice.cpp
> > @@ -1688,7 +1688,7 @@ const std::string &V4L2Subdevice::model()
> >   */
> >  std::unique_ptr<V4L2Subdevice>
> >  V4L2Subdevice::fromEntityName(const MediaDevice *media,
> > -			      const std::string &entity)
> > +			      std::string_view entity)
> >  {
> >  	MediaEntity *mediaEntity = media->getEntityByName(entity);
> >  	if (!mediaEntity)
> > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> > index a5cf67845..834a1bd0d 100644
> > --- a/src/libcamera/v4l2_videodevice.cpp
> > +++ b/src/libcamera/v4l2_videodevice.cpp
> > @@ -2077,7 +2077,7 @@ void V4L2VideoDevice::watchdogExpired()
> >   */
> >  std::unique_ptr<V4L2VideoDevice>
> >  V4L2VideoDevice::fromEntityName(const MediaDevice *media,
> > -				const std::string &entity)
> > +				std::string_view entity)
> >  {
> >  	MediaEntity *mediaEntity = media->getEntityByName(entity);
> >  	if (!mediaEntity)
> > diff --git a/src/py/libcamera/py_camera_manager.h b/src/py/libcamera/py_camera_manager.h
> > index 3574db236..af69b915e 100644
> > --- a/src/py/libcamera/py_camera_manager.h
> > +++ b/src/py/libcamera/py_camera_manager.h
> > @@ -20,7 +20,7 @@ public:
> >  	~PyCameraManager();
> >
> >  	pybind11::list cameras();
> > -	std::shared_ptr<Camera> get(const std::string &name) { return cameraManager_->get(name); }
> > +	std::shared_ptr<Camera> get(std::string_view name) { return cameraManager_->get(name); }
> >
> >  	static const std::string &version() { return CameraManager::version(); }
> >
> > diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
> > index 441a70ab4..820768c24 100644
> > --- a/src/py/libcamera/py_main.cpp
> > +++ b/src/py/libcamera/py_main.cpp
> > @@ -510,7 +510,7 @@ PYBIND11_MODULE(_libcamera, m)
> >  	pyPixelFormat
> >  		.def(py::init<>())
> >  		.def(py::init<uint32_t, uint64_t>())
> > -		.def(py::init<>([](const std::string &str) {
> > +		.def(py::init<>([](std::string_view str) {
> >  			return PixelFormat::fromString(str);
> >  		}))
> >  		.def_property_readonly("fourcc", &PixelFormat::fourcc)
> 
> --
> Regards,
> 
> Laurent Pinchart
>
Laurent Pinchart Dec. 15, 2024, 11:14 p.m. UTC | #3
On Sun, Dec 15, 2024 at 10:46:35PM +0000, Barnabás Pőcze wrote:
> 2024. december 15., vasárnap 21:56 keltezéssel, Laurent Pinchart írta:
> > On Sun, Dec 15, 2024 at 08:48:06PM +0000, Barnabás Pőcze wrote:
> > > A parameter of type `const std::string&` is not the right choice in
> > > almost all cases. It forces the caller to construct an `std::string`
> > > if they don't already have one, and accessing its data requires
> > > an extra indirection. Furthermore, `std::string` is just one
> > > instantiation of `std::basic_string<>`, using e.g. a different
> > > allocator would immediately make it incompatible.
> > 
> > I don't think the allocator is an issue in libcamera.
> 
> This is a general argument in favor, not specific to libcamera, indeed. Although
> users can still use different allocators, in which case they would be affected,
> e.g. `CameraManager::get()`.
> 
> > > In contrast to that using an `std::string_view` is better if
> > > NUL termination is not needed since no `std::string` construction
> > > is required, and in many cases it can be passed directly in registers.
> > 
> > I had a go at this previously, and had very mixed feelings about the
> > result. I'll post a WIP series for discussion.
> 
> What were the concerns?

See "[RFC PATCH 0/8] libcamera: Use std::string_view" :-) Let's discuss
it there, as there's a patch in the series that attempts to document
std::string_view usage. I would like to agree on clear rules before we
make tree-wide changes.

> This change only considers a limited subset of all
> `const std::string&` parameters. For example, functions (constructors) where a
> copy of the string made are excluded. Mostly the "find-thing-by-name" style
> functions are converted here.
> 
> > > Signed-off-by: Barnabás Pőcze <pobrn@protonmail.com>
> > > ---
> > >  include/libcamera/base/utils.h                     | 10 +++++-----
> > >  include/libcamera/camera_manager.h                 |  3 ++-
> > >  .../libcamera/internal/camera_sensor_properties.h  |  4 ++--
> > >  include/libcamera/internal/device_enumerator.h     |  3 ++-
> > >  include/libcamera/internal/formats.h               |  3 ++-
> > >  include/libcamera/internal/media_device.h          |  7 ++++---
> > >  include/libcamera/internal/pipeline_handler.h      |  3 ++-
> > >  include/libcamera/internal/v4l2_subdevice.h        |  3 ++-
> > >  include/libcamera/internal/v4l2_videodevice.h      |  3 ++-
> > >  include/libcamera/pixel_format.h                   |  3 ++-
> > >  src/apps/cam/capture_script.cpp                    |  2 +-
> > >  src/apps/cam/capture_script.h                      |  3 ++-
> > >  src/apps/cam/drm.cpp                               |  8 ++++----
> > >  src/apps/cam/drm.h                                 |  9 +++++----
> > >  src/ipa/libipa/camera_sensor_helper.cpp            |  2 +-
> > >  src/ipa/libipa/camera_sensor_helper.h              |  3 ++-
> > >  src/ipa/libipa/module.cpp                          |  2 +-
> > >  src/ipa/libipa/module.h                            |  4 ++--
> > >  src/libcamera/base/utils.cpp                       |  8 ++++----
> > >  src/libcamera/camera_manager.cpp                   |  2 +-
> > >  src/libcamera/device_enumerator.cpp                |  2 +-
> > >  src/libcamera/device_enumerator_udev.cpp           |  2 +-
> > >  src/libcamera/formats.cpp                          |  2 +-
> > >  src/libcamera/media_device.cpp                     | 14 +++++++-------
> > >  src/libcamera/pipeline_handler.cpp                 |  2 +-
> > >  src/libcamera/pixel_format.cpp                     |  2 +-
> > >  src/libcamera/sensor/camera_sensor_properties.cpp  |  4 ++--
> > >  src/libcamera/v4l2_subdevice.cpp                   |  2 +-
> > >  src/libcamera/v4l2_videodevice.cpp                 |  2 +-
> > >  src/py/libcamera/py_camera_manager.h               |  2 +-
> > >  src/py/libcamera/py_main.cpp                       |  2 +-
> > >  31 files changed, 66 insertions(+), 55 deletions(-)
> > >
> > > diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
> > > index 780aeda6a..3b8b3dea9 100644
> > > --- a/include/libcamera/base/utils.h
> > > +++ b/include/libcamera/base/utils.h
> > > @@ -38,7 +38,7 @@ namespace utils {
> > >  const char *basename(const char *path);
> > >
> > >  char *secure_getenv(const char *name);
> > > -std::string dirname(const std::string &path);
> > > +std::string dirname(std::string_view path);
> > >
> > >  template<typename T>
> > >  std::vector<typename T::key_type> map_keys(const T &map)
> > > @@ -143,7 +143,7 @@ size_t strlcpy(char *dst, const char *src, size_t size);
> > >
> > >  #ifndef __DOXYGEN__
> > >  template<typename Container, typename UnaryOp>
> > > -std::string join(const Container &items, const std::string &sep, UnaryOp op)
> > > +std::string join(const Container &items, std::string_view sep, UnaryOp op)
> > >  {
> > >  	std::ostringstream ss;
> > >  	bool first = true;
> > > @@ -162,7 +162,7 @@ std::string join(const Container &items, const std::string &sep, UnaryOp op)
> > >  }
> > >
> > >  template<typename Container>
> > > -std::string join(const Container &items, const std::string &sep)
> > > +std::string join(const Container &items, std::string_view sep)
> > >  {
> > >  	std::ostringstream ss;
> > >  	bool first = true;
> > > @@ -181,7 +181,7 @@ std::string join(const Container &items, const std::string &sep)
> > >  }
> > >  #else
> > >  template<typename Container, typename UnaryOp>
> > > -std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr);
> > > +std::string join(const Container &items, std::string_view sep, UnaryOp op = nullptr);
> > >  #endif
> > >
> > >  namespace details {
> > > @@ -240,7 +240,7 @@ private:
> > >
> > >  details::StringSplitter split(const std::string &str, const std::string &delim);
> > >
> > > -std::string toAscii(const std::string &str);
> > > +std::string toAscii(std::string_view str);
> > >
> > >  std::string libcameraBuildPath();
> > >  std::string libcameraSourcePath();
> > > diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
> > > index b50df7825..27835500f 100644
> > > --- a/include/libcamera/camera_manager.h
> > > +++ b/include/libcamera/camera_manager.h
> > > @@ -9,6 +9,7 @@
> > >
> > >  #include <memory>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <sys/types.h>
> > >  #include <vector>
> > >
> > > @@ -31,7 +32,7 @@ public:
> > >  	void stop();
> > >
> > >  	std::vector<std::shared_ptr<Camera>> cameras() const;
> > > -	std::shared_ptr<Camera> get(const std::string &id);
> > > +	std::shared_ptr<Camera> get(std::string_view id);
> > >
> > >  	static const std::string &version() { return version_; }
> > >
> > > diff --git a/include/libcamera/internal/camera_sensor_properties.h b/include/libcamera/internal/camera_sensor_properties.h
> > > index d7d4dab62..b44093906 100644
> > > --- a/include/libcamera/internal/camera_sensor_properties.h
> > > +++ b/include/libcamera/internal/camera_sensor_properties.h
> > > @@ -9,7 +9,7 @@
> > >
> > >  #include <map>
> > >  #include <stdint.h>
> > > -#include <string>
> > > +#include <string_view>
> > >
> > >  #include <libcamera/control_ids.h>
> > >  #include <libcamera/geometry.h>
> > > @@ -24,7 +24,7 @@ struct CameraSensorProperties {
> > >  		uint8_t hblankDelay;
> > >  	};
> > >
> > > -	static const CameraSensorProperties *get(const std::string &sensor);
> > > +	static const CameraSensorProperties *get(std::string_view sensor);
> > >
> > >  	Size unitCellSize;
> > >  	std::map<controls::draft::TestPatternModeEnum, int32_t> testPatternModes;
> > > diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h
> > > index db3532a98..eecc39cfb 100644
> > > --- a/include/libcamera/internal/device_enumerator.h
> > > +++ b/include/libcamera/internal/device_enumerator.h
> > > @@ -9,6 +9,7 @@
> > >
> > >  #include <memory>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <vector>
> > >
> > >  #include <libcamera/base/signal.h>
> > > @@ -48,7 +49,7 @@ public:
> > >  protected:
> > >  	std::unique_ptr<MediaDevice> createDevice(const std::string &deviceNode);
> > >  	void addDevice(std::unique_ptr<MediaDevice> media);
> > > -	void removeDevice(const std::string &deviceNode);
> > > +	void removeDevice(std::string_view deviceNode);
> > >
> > >  private:
> > >  	std::vector<std::shared_ptr<MediaDevice>> devices_;
> > > diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
> > > index 6a3e9c16a..bd7ac6ed1 100644
> > > --- a/include/libcamera/internal/formats.h
> > > +++ b/include/libcamera/internal/formats.h
> > > @@ -8,6 +8,7 @@
> > >  #pragma once
> > >
> > >  #include <array>
> > > +#include <string_view>
> > >  #include <vector>
> > >
> > >  #include <libcamera/geometry.h>
> > > @@ -35,7 +36,7 @@ public:
> > >
> > >  	static const PixelFormatInfo &info(const PixelFormat &format);
> > >  	static const PixelFormatInfo &info(const V4L2PixelFormat &format);
> > > -	static const PixelFormatInfo &info(const std::string &name);
> > > +	static const PixelFormatInfo &info(std::string_view name);
> > >
> > >  	unsigned int stride(unsigned int width, unsigned int plane,
> > >  			    unsigned int align = 1) const;
> > > diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h
> > > index e412d3a0b..91610a7aa 100644
> > > --- a/include/libcamera/internal/media_device.h
> > > +++ b/include/libcamera/internal/media_device.h
> > > @@ -9,6 +9,7 @@
> > >
> > >  #include <map>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <vector>
> > >
> > >  #include <linux/media.h>
> > > @@ -44,10 +45,10 @@ public:
> > >  	unsigned int hwRevision() const { return hwRevision_; }
> > >
> > >  	const std::vector<MediaEntity *> &entities() const { return entities_; }
> > > -	MediaEntity *getEntityByName(const std::string &name) const;
> > > +	MediaEntity *getEntityByName(std::string_view name) const;
> > >
> > > -	MediaLink *link(const std::string &sourceName, unsigned int sourceIdx,
> > > -			const std::string &sinkName, unsigned int sinkIdx);
> > > +	MediaLink *link(std::string_view sourceName, unsigned int sourceIdx,
> > > +			std::string_view sinkName, unsigned int sinkIdx);
> > >  	MediaLink *link(const MediaEntity *source, unsigned int sourceIdx,
> > >  			const MediaEntity *sink, unsigned int sinkIdx);
> > >  	MediaLink *link(const MediaPad *source, const MediaPad *sink);
> > > diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
> > > index fb28a18d0..45eafce9b 100644
> > > --- a/include/libcamera/internal/pipeline_handler.h
> > > +++ b/include/libcamera/internal/pipeline_handler.h
> > > @@ -10,6 +10,7 @@
> > >  #include <memory>
> > >  #include <queue>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <sys/types.h>
> > >  #include <vector>
> > >
> > > @@ -112,7 +113,7 @@ public:
> > >  	const std::string &name() const { return name_; }
> > >
> > >  	static std::vector<PipelineHandlerFactoryBase *> &factories();
> > > -	static const PipelineHandlerFactoryBase *getFactoryByName(const std::string &name);
> > > +	static const PipelineHandlerFactoryBase *getFactoryByName(std::string_view name);
> > >
> > >  private:
> > >  	static void registerType(PipelineHandlerFactoryBase *factory);
> > > diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
> > > index 194382f84..d17365e14 100644
> > > --- a/include/libcamera/internal/v4l2_subdevice.h
> > > +++ b/include/libcamera/internal/v4l2_subdevice.h
> > > @@ -11,6 +11,7 @@
> > >  #include <optional>
> > >  #include <ostream>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <vector>
> > >
> > >  #include <linux/v4l2-subdev.h>
> > > @@ -161,7 +162,7 @@ public:
> > >  	const V4L2SubdeviceCapability &caps() const { return caps_; }
> > >
> > >  	static std::unique_ptr<V4L2Subdevice>
> > > -	fromEntityName(const MediaDevice *media, const std::string &entity);
> > > +	fromEntityName(const MediaDevice *media, std::string_view entity);
> > >
> > >  protected:
> > >  	std::string logPrefix() const override;
> > > diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
> > > index f021c2a01..c256e82af 100644
> > > --- a/include/libcamera/internal/v4l2_videodevice.h
> > > +++ b/include/libcamera/internal/v4l2_videodevice.h
> > > @@ -14,6 +14,7 @@
> > >  #include <ostream>
> > >  #include <stdint.h>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <unordered_set>
> > >  #include <vector>
> > >
> > > @@ -228,7 +229,7 @@ public:
> > >  	Signal<> dequeueTimeout;
> > >
> > >  	static std::unique_ptr<V4L2VideoDevice>
> > > -	fromEntityName(const MediaDevice *media, const std::string &entity);
> > > +	fromEntityName(const MediaDevice *media, std::string_view entity);
> > >
> > >  	V4L2PixelFormat toV4L2PixelFormat(const PixelFormat &pixelFormat) const;
> > >
> > > diff --git a/include/libcamera/pixel_format.h b/include/libcamera/pixel_format.h
> > > index 1b4d8c7c8..874b2528b 100644
> > > --- a/include/libcamera/pixel_format.h
> > > +++ b/include/libcamera/pixel_format.h
> > > @@ -10,6 +10,7 @@
> > >  #include <ostream>
> > >  #include <stdint.h>
> > >  #include <string>
> > > +#include <string_view>
> > >
> > >  namespace libcamera {
> > >
> > > @@ -38,7 +39,7 @@ public:
> > >
> > >  	std::string toString() const;
> > >
> > > -	static PixelFormat fromString(const std::string &name);
> > > +	static PixelFormat fromString(std::string_view name);
> > >
> > >  private:
> > >  	uint32_t fourcc_;
> > > diff --git a/src/apps/cam/capture_script.cpp b/src/apps/cam/capture_script.cpp
> > > index fc1dfa75f..d4760ea78 100644
> > > --- a/src/apps/cam/capture_script.cpp
> > > +++ b/src/apps/cam/capture_script.cpp
> > > @@ -432,7 +432,7 @@ std::vector<std::string> CaptureScript::parseSingleArray()
> > >  	}
> > >  }
> > >
> > > -void CaptureScript::unpackFailure(const ControlId *id, const std::string &repr)
> > > +void CaptureScript::unpackFailure(const ControlId *id, std::string_view repr)
> > >  {
> > >  	static const std::map<unsigned int, const char *> typeNames = {
> > >  		{ ControlTypeNone, "none" },
> > > diff --git a/src/apps/cam/capture_script.h b/src/apps/cam/capture_script.h
> > > index 294b92036..fb40371f2 100644
> > > --- a/src/apps/cam/capture_script.h
> > > +++ b/src/apps/cam/capture_script.h
> > > @@ -10,6 +10,7 @@
> > >  #include <map>
> > >  #include <memory>
> > >  #include <string>
> > > +#include <string_view>
> > >
> > >  #include <libcamera/camera.h>
> > >  #include <libcamera/controls.h>
> > > @@ -67,7 +68,7 @@ private:
> > >  	std::vector<std::string> parseSingleArray();
> > >
> > >  	void unpackFailure(const libcamera::ControlId *id,
> > > -			   const std::string &repr);
> > > +			   std::string_view repr);
> > >  	libcamera::ControlValue unpackControl(const libcamera::ControlId *id);
> > >  	libcamera::Rectangle unpackRectangle(const std::vector<std::string> &strVec);
> > >  };
> > > diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp
> > > index 47bbb6b05..fd9c59ec4 100644
> > > --- a/src/apps/cam/drm.cpp
> > > +++ b/src/apps/cam/drm.cpp
> > > @@ -57,7 +57,7 @@ Object::~Object()
> > >  {
> > >  }
> > >
> > > -const Property *Object::property(const std::string &name) const
> > > +const Property *Object::property(std::string_view name) const
> > >  {
> > >  	for (const PropertyValue &pv : properties_) {
> > >  		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
> > > @@ -68,7 +68,7 @@ const Property *Object::property(const std::string &name) const
> > >  	return nullptr;
> > >  }
> > >
> > > -const PropertyValue *Object::propertyValue(const std::string &name) const
> > > +const PropertyValue *Object::propertyValue(std::string_view name) const
> > >  {
> > >  	for (const PropertyValue &pv : properties_) {
> > >  		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
> > > @@ -320,7 +320,7 @@ AtomicRequest::~AtomicRequest()
> > >  		drmModeAtomicFree(request_);
> > >  }
> > >
> > > -int AtomicRequest::addProperty(const Object *object, const std::string &property,
> > > +int AtomicRequest::addProperty(const Object *object, std::string_view property,
> > >  			       uint64_t value)
> > >  {
> > >  	if (!valid_)
> > > @@ -335,7 +335,7 @@ int AtomicRequest::addProperty(const Object *object, const std::string &property
> > >  	return addProperty(object->id(), prop->id(), value);
> > >  }
> > >
> > > -int AtomicRequest::addProperty(const Object *object, const std::string &property,
> > > +int AtomicRequest::addProperty(const Object *object, std::string_view property,
> > >  			       std::unique_ptr<Blob> blob)
> > >  {
> > >  	if (!valid_)
> > > diff --git a/src/apps/cam/drm.h b/src/apps/cam/drm.h
> > > index 1ba83b6eb..aa1b06400 100644
> > > --- a/src/apps/cam/drm.h
> > > +++ b/src/apps/cam/drm.h
> > > @@ -13,6 +13,7 @@
> > >  #include <memory>
> > >  #include <stdint.h>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <vector>
> > >
> > >  #include <libcamera/base/signal.h>
> > > @@ -57,8 +58,8 @@ public:
> > >  	uint32_t id() const { return id_; }
> > >  	Type type() const { return type_; }
> > >
> > > -	const Property *property(const std::string &name) const;
> > > -	const PropertyValue *propertyValue(const std::string &name) const;
> > > +	const Property *property(std::string_view name) const;
> > > +	const PropertyValue *propertyValue(std::string_view name) const;
> > >  	const std::vector<PropertyValue> &properties() const { return properties_; }
> > >
> > >  protected:
> > > @@ -260,9 +261,9 @@ public:
> > >  	Device *device() const { return dev_; }
> > >  	bool isValid() const { return valid_; }
> > >
> > > -	int addProperty(const Object *object, const std::string &property,
> > > +	int addProperty(const Object *object, std::string_view property,
> > >  			uint64_t value);
> > > -	int addProperty(const Object *object, const std::string &property,
> > > +	int addProperty(const Object *object, std::string_view property,
> > >  			std::unique_ptr<Blob> blob);
> > >  	int commit(unsigned int flags = 0);
> > >
> > > diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
> > > index 7c66cd57d..4ed050b14 100644
> > > --- a/src/ipa/libipa/camera_sensor_helper.cpp
> > > +++ b/src/ipa/libipa/camera_sensor_helper.cpp
> > > @@ -240,7 +240,7 @@ CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(const std::string n
> > >   * corresponding to the named factory or a null pointer if no such factory
> > >   * exists
> > >   */
> > > -std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(const std::string &name)
> > > +std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(std::string_view name)
> > >  {
> > >  	const std::vector<CameraSensorHelperFactoryBase *> &factories =
> > >  		CameraSensorHelperFactoryBase::factories();
> > > diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h
> > > index a9300a64f..eedc80114 100644
> > > --- a/src/ipa/libipa/camera_sensor_helper.h
> > > +++ b/src/ipa/libipa/camera_sensor_helper.h
> > > @@ -11,6 +11,7 @@
> > >  #include <optional>
> > >  #include <stdint.h>
> > >  #include <string>
> > > +#include <string_view>
> > >  #include <variant>
> > >  #include <vector>
> > >
> > > @@ -56,7 +57,7 @@ public:
> > >  	CameraSensorHelperFactoryBase(const std::string name);
> > >  	virtual ~CameraSensorHelperFactoryBase() = default;
> > >
> > > -	static std::unique_ptr<CameraSensorHelper> create(const std::string &name);
> > > +	static std::unique_ptr<CameraSensorHelper> create(std::string_view name);
> > >
> > >  	static std::vector<CameraSensorHelperFactoryBase *> &factories();
> > >
> > > diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp
> > > index 64ca91419..91fb588e7 100644
> > > --- a/src/ipa/libipa/module.cpp
> > > +++ b/src/ipa/libipa/module.cpp
> > > @@ -107,7 +107,7 @@ namespace ipa {
> > >   */
> > >
> > >  /**
> > > - * \fn Module::createAlgorithm(const std::string &name)
> > > + * \fn Module::createAlgorithm(std::string_view name)
> > >   * \brief Create an instance of an Algorithm by name
> > >   * \param[in] name The algorithm name
> > >   *
> > > diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h
> > > index 0fb51916f..62c700a64 100644
> > > --- a/src/ipa/libipa/module.h
> > > +++ b/src/ipa/libipa/module.h
> > > @@ -9,7 +9,7 @@
> > >
> > >  #include <list>
> > >  #include <memory>
> > > -#include <string>
> > > +#include <string_view>
> > >  #include <vector>
> > >
> > >  #include <libcamera/base/log.h>
> > > @@ -95,7 +95,7 @@ private:
> > >  		return 0;
> > >  	}
> > >
> > > -	static std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)
> > > +	static std::unique_ptr<Algorithm<Module>> createAlgorithm(std::string_view name)
> > >  	{
> > >  		for (const AlgorithmFactoryBase<Module> *factory : factories()) {
> > >  			if (factory->name() == name)
> > > diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
> > > index bcfc1941a..de6e2afd6 100644
> > > --- a/src/libcamera/base/utils.cpp
> > > +++ b/src/libcamera/base/utils.cpp
> > > @@ -80,7 +80,7 @@ char *secure_getenv(const char *name)
> > >   *
> > >   * \return A string of the directory component of the path
> > >   */
> > > -std::string dirname(const std::string &path)
> > > +std::string dirname(std::string_view path)
> > >  {
> > >  	if (path.empty())
> > >  		return ".";
> > > @@ -116,7 +116,7 @@ std::string dirname(const std::string &path)
> > >  		pos--;
> > >  	}
> > >
> > > -	return path.substr(0, pos + 1);
> > > +	return std::string(path.substr(0, pos + 1));
> > >  }
> > >
> > >  /**
> > > @@ -278,7 +278,7 @@ std::string details::StringSplitter::iterator::operator*() const
> > >
> > >  /**
> > >   * \fn template<typename Container, typename UnaryOp> \
> > > - * std::string utils::join(const Container &items, const std::string &sep, UnaryOp op)
> > > + * std::string utils::join(const Container &items, std::string_view sep, UnaryOp op)
> > >   * \brief Join elements of a container in a string with a separator
> > >   * \param[in] items The container
> > >   * \param[in] sep The separator to add between elements
> > > @@ -319,7 +319,7 @@ details::StringSplitter split(const std::string &str, const std::string &delim)
> > >   *
> > >   * \return A string equal to \a str stripped out of all non-ASCII characters
> > >   */
> > > -std::string toAscii(const std::string &str)
> > > +std::string toAscii(std::string_view str)
> > >  {
> > >  	std::string ret;
> > >  	for (const char &c : str)
> > > diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
> > > index 87e6717ec..179fa37ea 100644
> > > --- a/src/libcamera/camera_manager.cpp
> > > +++ b/src/libcamera/camera_manager.cpp
> > > @@ -382,7 +382,7 @@ std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
> > >   *
> > >   * \return Shared pointer to Camera object or nullptr if camera not found
> > >   */
> > > -std::shared_ptr<Camera> CameraManager::get(const std::string &id)
> > > +std::shared_ptr<Camera> CameraManager::get(std::string_view id)
> > >  {
> > >  	Private *const d = _d();
> > >
> > > diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
> > > index ae17862f6..8744a90f3 100644
> > > --- a/src/libcamera/device_enumerator.cpp
> > > +++ b/src/libcamera/device_enumerator.cpp
> > > @@ -272,7 +272,7 @@ void DeviceEnumerator::addDevice(std::unique_ptr<MediaDevice> media)
> > >   * enumerator with addDevice(). The media device's MediaDevice::disconnected
> > >   * signal is emitted.
> > >   */
> > > -void DeviceEnumerator::removeDevice(const std::string &deviceNode)
> > > +void DeviceEnumerator::removeDevice(std::string_view deviceNode)
> > >  {
> > >  	std::shared_ptr<MediaDevice> media;
> > >
> > > diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp
> > > index 4e20a3cc0..c330f30bc 100644
> > > --- a/src/libcamera/device_enumerator_udev.cpp
> > > +++ b/src/libcamera/device_enumerator_udev.cpp
> > > @@ -351,7 +351,7 @@ void DeviceEnumeratorUdev::udevNotify()
> > >  	} else if (action == "remove") {
> > >  		const char *subsystem = udev_device_get_subsystem(dev);
> > >  		if (subsystem && !strcmp(subsystem, "media"))
> > > -			removeDevice(std::string(deviceNode));
> > > +			removeDevice(deviceNode);
> > >  	}
> > >
> > >  	udev_device_unref(dev);
> > > diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
> > > index bfcdfc089..112dfe66b 100644
> > > --- a/src/libcamera/formats.cpp
> > > +++ b/src/libcamera/formats.cpp
> > > @@ -1037,7 +1037,7 @@ const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
> > >   * \return The PixelFormatInfo describing the PixelFormat matching the
> > >   * \a name if known, or an invalid PixelFormatInfo otherwise
> > >   */
> > > -const PixelFormatInfo &PixelFormatInfo::info(const std::string &name)
> > > +const PixelFormatInfo &PixelFormatInfo::info(std::string_view name)
> > >  {
> > >  	for (const auto &info : pixelFormatInfo) {
> > >  		if (info.second.name == name)
> > > diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
> > > index d71dad74d..131b34446 100644
> > > --- a/src/libcamera/media_device.cpp
> > > +++ b/src/libcamera/media_device.cpp
> > > @@ -331,7 +331,7 @@ done:
> > >   * \param[in] name The entity name
> > >   * \return The entity with \a name, or nullptr if no such entity is found
> > >   */
> > > -MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
> > > +MediaEntity *MediaDevice::getEntityByName(std::string_view name) const
> > >  {
> > >  	for (MediaEntity *e : entities_)
> > >  		if (e->name() == name)
> > > @@ -359,8 +359,8 @@ MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
> > >   * \return The link that connects the two pads, or nullptr if no such a link
> > >   * exists
> > >   */
> > > -MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceIdx,
> > > -			     const std::string &sinkName, unsigned int sinkIdx)
> > > +MediaLink *MediaDevice::link(std::string_view sourceName, unsigned int sourceIdx,
> > > +			     std::string_view sinkName, unsigned int sinkIdx)
> > >  {
> > >  	const MediaEntity *source = getEntityByName(sourceName);
> > >  	const MediaEntity *sink = getEntityByName(sinkName);
> > > @@ -382,8 +382,8 @@ MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceI
> > >   * entity \a source, to the pad at index \a sinkIdx of the sink entity \a
> > >   * sink, if any.
> > >   *
> > > - * \sa link(const std::string &sourceName, unsigned int sourceIdx,
> > > - *          const std::string &sinkName, unsigned int sinkIdx)
> > > + * \sa link(std::string_view sourceName, unsigned int sourceIdx,
> > > + *          std::string_view sinkName, unsigned int sinkIdx)
> > >   * \sa link(const MediaPad *source, const MediaPad *sink)
> > >   *
> > >   * \return The link that connects the two pads, or nullptr if no such a link
> > > @@ -406,8 +406,8 @@ MediaLink *MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx,
> > >   * \param[in] source The source pad
> > >   * \param[in] sink The sink pad
> > >   *
> > > - * \sa link(const std::string &sourceName, unsigned int sourceIdx,
> > > - *          const std::string &sinkName, unsigned int sinkIdx)
> > > + * \sa link(std::string_view sourceName, unsigned int sourceIdx,
> > > + *          std::string_view sinkName, unsigned int sinkIdx)
> > >   * \sa link(const MediaEntity *source, unsigned int sourceIdx,
> > >   *          const MediaEntity *sink, unsigned int sinkIdx)
> > >   *
> > > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
> > > index caa5c20e7..6b395c666 100644
> > > --- a/src/libcamera/pipeline_handler.cpp
> > > +++ b/src/libcamera/pipeline_handler.cpp
> > > @@ -852,7 +852,7 @@ std::vector<PipelineHandlerFactoryBase *> &PipelineHandlerFactoryBase::factories
> > >   * \param[in] name The pipeline handler name
> > >   * \return The factory of the pipeline with name \a name, or nullptr if not found
> > >   */
> > > -const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(const std::string &name)
> > > +const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(std::string_view name)
> > >  {
> > >  	const std::vector<PipelineHandlerFactoryBase *> &factories =
> > >  		PipelineHandlerFactoryBase::factories();
> > > diff --git a/src/libcamera/pixel_format.cpp b/src/libcamera/pixel_format.cpp
> > > index 314179a81..22f1520fd 100644
> > > --- a/src/libcamera/pixel_format.cpp
> > > +++ b/src/libcamera/pixel_format.cpp
> > > @@ -135,7 +135,7 @@ std::string PixelFormat::toString() const
> > >   * \return The PixelFormat represented by the \a name if known, or an
> > >   * invalid pixel format otherwise.
> > >   */
> > > -PixelFormat PixelFormat::fromString(const std::string &name)
> > > +PixelFormat PixelFormat::fromString(std::string_view name)
> > >  {
> > >  	return PixelFormatInfo::info(name).format;
> > >  }
> > > diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp
> > > index 2b06c5a1a..4283cacfa 100644
> > > --- a/src/libcamera/sensor/camera_sensor_properties.cpp
> > > +++ b/src/libcamera/sensor/camera_sensor_properties.cpp
> > > @@ -78,9 +78,9 @@ LOG_DEFINE_CATEGORY(CameraSensorProperties)
> > >   * \return A pointer to the CameraSensorProperties instance associated with a sensor
> > >   * or nullptr if the sensor is not supported
> > >   */
> > > -const CameraSensorProperties *CameraSensorProperties::get(const std::string &sensor)
> > > +const CameraSensorProperties *CameraSensorProperties::get(std::string_view sensor)
> > >  {
> > > -	static const std::map<std::string, const CameraSensorProperties> sensorProps = {
> > > +	static const std::map<std::string_view, const CameraSensorProperties> sensorProps = {
> > >  		{ "ar0144", {
> > >  			.unitCellSize = { 3000, 3000 },
> > >  			.testPatternModes = {
> > > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
> > > index 3a0d075f9..7e85b33be 100644
> > > --- a/src/libcamera/v4l2_subdevice.cpp
> > > +++ b/src/libcamera/v4l2_subdevice.cpp
> > > @@ -1688,7 +1688,7 @@ const std::string &V4L2Subdevice::model()
> > >   */
> > >  std::unique_ptr<V4L2Subdevice>
> > >  V4L2Subdevice::fromEntityName(const MediaDevice *media,
> > > -			      const std::string &entity)
> > > +			      std::string_view entity)
> > >  {
> > >  	MediaEntity *mediaEntity = media->getEntityByName(entity);
> > >  	if (!mediaEntity)
> > > diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
> > > index a5cf67845..834a1bd0d 100644
> > > --- a/src/libcamera/v4l2_videodevice.cpp
> > > +++ b/src/libcamera/v4l2_videodevice.cpp
> > > @@ -2077,7 +2077,7 @@ void V4L2VideoDevice::watchdogExpired()
> > >   */
> > >  std::unique_ptr<V4L2VideoDevice>
> > >  V4L2VideoDevice::fromEntityName(const MediaDevice *media,
> > > -				const std::string &entity)
> > > +				std::string_view entity)
> > >  {
> > >  	MediaEntity *mediaEntity = media->getEntityByName(entity);
> > >  	if (!mediaEntity)
> > > diff --git a/src/py/libcamera/py_camera_manager.h b/src/py/libcamera/py_camera_manager.h
> > > index 3574db236..af69b915e 100644
> > > --- a/src/py/libcamera/py_camera_manager.h
> > > +++ b/src/py/libcamera/py_camera_manager.h
> > > @@ -20,7 +20,7 @@ public:
> > >  	~PyCameraManager();
> > >
> > >  	pybind11::list cameras();
> > > -	std::shared_ptr<Camera> get(const std::string &name) { return cameraManager_->get(name); }
> > > +	std::shared_ptr<Camera> get(std::string_view name) { return cameraManager_->get(name); }
> > >
> > >  	static const std::string &version() { return CameraManager::version(); }
> > >
> > > diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
> > > index 441a70ab4..820768c24 100644
> > > --- a/src/py/libcamera/py_main.cpp
> > > +++ b/src/py/libcamera/py_main.cpp
> > > @@ -510,7 +510,7 @@ PYBIND11_MODULE(_libcamera, m)
> > >  	pyPixelFormat
> > >  		.def(py::init<>())
> > >  		.def(py::init<uint32_t, uint64_t>())
> > > -		.def(py::init<>([](const std::string &str) {
> > > +		.def(py::init<>([](std::string_view str) {
> > >  			return PixelFormat::fromString(str);
> > >  		}))
> > >  		.def_property_readonly("fourcc", &PixelFormat::fourcc)

Patch
diff mbox series

diff --git a/include/libcamera/base/utils.h b/include/libcamera/base/utils.h
index 780aeda6a..3b8b3dea9 100644
--- a/include/libcamera/base/utils.h
+++ b/include/libcamera/base/utils.h
@@ -38,7 +38,7 @@  namespace utils {
 const char *basename(const char *path);
 
 char *secure_getenv(const char *name);
-std::string dirname(const std::string &path);
+std::string dirname(std::string_view path);
 
 template<typename T>
 std::vector<typename T::key_type> map_keys(const T &map)
@@ -143,7 +143,7 @@  size_t strlcpy(char *dst, const char *src, size_t size);
 
 #ifndef __DOXYGEN__
 template<typename Container, typename UnaryOp>
-std::string join(const Container &items, const std::string &sep, UnaryOp op)
+std::string join(const Container &items, std::string_view sep, UnaryOp op)
 {
 	std::ostringstream ss;
 	bool first = true;
@@ -162,7 +162,7 @@  std::string join(const Container &items, const std::string &sep, UnaryOp op)
 }
 
 template<typename Container>
-std::string join(const Container &items, const std::string &sep)
+std::string join(const Container &items, std::string_view sep)
 {
 	std::ostringstream ss;
 	bool first = true;
@@ -181,7 +181,7 @@  std::string join(const Container &items, const std::string &sep)
 }
 #else
 template<typename Container, typename UnaryOp>
-std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr);
+std::string join(const Container &items, std::string_view sep, UnaryOp op = nullptr);
 #endif
 
 namespace details {
@@ -240,7 +240,7 @@  private:
 
 details::StringSplitter split(const std::string &str, const std::string &delim);
 
-std::string toAscii(const std::string &str);
+std::string toAscii(std::string_view str);
 
 std::string libcameraBuildPath();
 std::string libcameraSourcePath();
diff --git a/include/libcamera/camera_manager.h b/include/libcamera/camera_manager.h
index b50df7825..27835500f 100644
--- a/include/libcamera/camera_manager.h
+++ b/include/libcamera/camera_manager.h
@@ -9,6 +9,7 @@ 
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <sys/types.h>
 #include <vector>
 
@@ -31,7 +32,7 @@  public:
 	void stop();
 
 	std::vector<std::shared_ptr<Camera>> cameras() const;
-	std::shared_ptr<Camera> get(const std::string &id);
+	std::shared_ptr<Camera> get(std::string_view id);
 
 	static const std::string &version() { return version_; }
 
diff --git a/include/libcamera/internal/camera_sensor_properties.h b/include/libcamera/internal/camera_sensor_properties.h
index d7d4dab62..b44093906 100644
--- a/include/libcamera/internal/camera_sensor_properties.h
+++ b/include/libcamera/internal/camera_sensor_properties.h
@@ -9,7 +9,7 @@ 
 
 #include <map>
 #include <stdint.h>
-#include <string>
+#include <string_view>
 
 #include <libcamera/control_ids.h>
 #include <libcamera/geometry.h>
@@ -24,7 +24,7 @@  struct CameraSensorProperties {
 		uint8_t hblankDelay;
 	};
 
-	static const CameraSensorProperties *get(const std::string &sensor);
+	static const CameraSensorProperties *get(std::string_view sensor);
 
 	Size unitCellSize;
 	std::map<controls::draft::TestPatternModeEnum, int32_t> testPatternModes;
diff --git a/include/libcamera/internal/device_enumerator.h b/include/libcamera/internal/device_enumerator.h
index db3532a98..eecc39cfb 100644
--- a/include/libcamera/internal/device_enumerator.h
+++ b/include/libcamera/internal/device_enumerator.h
@@ -9,6 +9,7 @@ 
 
 #include <memory>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include <libcamera/base/signal.h>
@@ -48,7 +49,7 @@  public:
 protected:
 	std::unique_ptr<MediaDevice> createDevice(const std::string &deviceNode);
 	void addDevice(std::unique_ptr<MediaDevice> media);
-	void removeDevice(const std::string &deviceNode);
+	void removeDevice(std::string_view deviceNode);
 
 private:
 	std::vector<std::shared_ptr<MediaDevice>> devices_;
diff --git a/include/libcamera/internal/formats.h b/include/libcamera/internal/formats.h
index 6a3e9c16a..bd7ac6ed1 100644
--- a/include/libcamera/internal/formats.h
+++ b/include/libcamera/internal/formats.h
@@ -8,6 +8,7 @@ 
 #pragma once
 
 #include <array>
+#include <string_view>
 #include <vector>
 
 #include <libcamera/geometry.h>
@@ -35,7 +36,7 @@  public:
 
 	static const PixelFormatInfo &info(const PixelFormat &format);
 	static const PixelFormatInfo &info(const V4L2PixelFormat &format);
-	static const PixelFormatInfo &info(const std::string &name);
+	static const PixelFormatInfo &info(std::string_view name);
 
 	unsigned int stride(unsigned int width, unsigned int plane,
 			    unsigned int align = 1) const;
diff --git a/include/libcamera/internal/media_device.h b/include/libcamera/internal/media_device.h
index e412d3a0b..91610a7aa 100644
--- a/include/libcamera/internal/media_device.h
+++ b/include/libcamera/internal/media_device.h
@@ -9,6 +9,7 @@ 
 
 #include <map>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include <linux/media.h>
@@ -44,10 +45,10 @@  public:
 	unsigned int hwRevision() const { return hwRevision_; }
 
 	const std::vector<MediaEntity *> &entities() const { return entities_; }
-	MediaEntity *getEntityByName(const std::string &name) const;
+	MediaEntity *getEntityByName(std::string_view name) const;
 
-	MediaLink *link(const std::string &sourceName, unsigned int sourceIdx,
-			const std::string &sinkName, unsigned int sinkIdx);
+	MediaLink *link(std::string_view sourceName, unsigned int sourceIdx,
+			std::string_view sinkName, unsigned int sinkIdx);
 	MediaLink *link(const MediaEntity *source, unsigned int sourceIdx,
 			const MediaEntity *sink, unsigned int sinkIdx);
 	MediaLink *link(const MediaPad *source, const MediaPad *sink);
diff --git a/include/libcamera/internal/pipeline_handler.h b/include/libcamera/internal/pipeline_handler.h
index fb28a18d0..45eafce9b 100644
--- a/include/libcamera/internal/pipeline_handler.h
+++ b/include/libcamera/internal/pipeline_handler.h
@@ -10,6 +10,7 @@ 
 #include <memory>
 #include <queue>
 #include <string>
+#include <string_view>
 #include <sys/types.h>
 #include <vector>
 
@@ -112,7 +113,7 @@  public:
 	const std::string &name() const { return name_; }
 
 	static std::vector<PipelineHandlerFactoryBase *> &factories();
-	static const PipelineHandlerFactoryBase *getFactoryByName(const std::string &name);
+	static const PipelineHandlerFactoryBase *getFactoryByName(std::string_view name);
 
 private:
 	static void registerType(PipelineHandlerFactoryBase *factory);
diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h
index 194382f84..d17365e14 100644
--- a/include/libcamera/internal/v4l2_subdevice.h
+++ b/include/libcamera/internal/v4l2_subdevice.h
@@ -11,6 +11,7 @@ 
 #include <optional>
 #include <ostream>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include <linux/v4l2-subdev.h>
@@ -161,7 +162,7 @@  public:
 	const V4L2SubdeviceCapability &caps() const { return caps_; }
 
 	static std::unique_ptr<V4L2Subdevice>
-	fromEntityName(const MediaDevice *media, const std::string &entity);
+	fromEntityName(const MediaDevice *media, std::string_view entity);
 
 protected:
 	std::string logPrefix() const override;
diff --git a/include/libcamera/internal/v4l2_videodevice.h b/include/libcamera/internal/v4l2_videodevice.h
index f021c2a01..c256e82af 100644
--- a/include/libcamera/internal/v4l2_videodevice.h
+++ b/include/libcamera/internal/v4l2_videodevice.h
@@ -14,6 +14,7 @@ 
 #include <ostream>
 #include <stdint.h>
 #include <string>
+#include <string_view>
 #include <unordered_set>
 #include <vector>
 
@@ -228,7 +229,7 @@  public:
 	Signal<> dequeueTimeout;
 
 	static std::unique_ptr<V4L2VideoDevice>
-	fromEntityName(const MediaDevice *media, const std::string &entity);
+	fromEntityName(const MediaDevice *media, std::string_view entity);
 
 	V4L2PixelFormat toV4L2PixelFormat(const PixelFormat &pixelFormat) const;
 
diff --git a/include/libcamera/pixel_format.h b/include/libcamera/pixel_format.h
index 1b4d8c7c8..874b2528b 100644
--- a/include/libcamera/pixel_format.h
+++ b/include/libcamera/pixel_format.h
@@ -10,6 +10,7 @@ 
 #include <ostream>
 #include <stdint.h>
 #include <string>
+#include <string_view>
 
 namespace libcamera {
 
@@ -38,7 +39,7 @@  public:
 
 	std::string toString() const;
 
-	static PixelFormat fromString(const std::string &name);
+	static PixelFormat fromString(std::string_view name);
 
 private:
 	uint32_t fourcc_;
diff --git a/src/apps/cam/capture_script.cpp b/src/apps/cam/capture_script.cpp
index fc1dfa75f..d4760ea78 100644
--- a/src/apps/cam/capture_script.cpp
+++ b/src/apps/cam/capture_script.cpp
@@ -432,7 +432,7 @@  std::vector<std::string> CaptureScript::parseSingleArray()
 	}
 }
 
-void CaptureScript::unpackFailure(const ControlId *id, const std::string &repr)
+void CaptureScript::unpackFailure(const ControlId *id, std::string_view repr)
 {
 	static const std::map<unsigned int, const char *> typeNames = {
 		{ ControlTypeNone, "none" },
diff --git a/src/apps/cam/capture_script.h b/src/apps/cam/capture_script.h
index 294b92036..fb40371f2 100644
--- a/src/apps/cam/capture_script.h
+++ b/src/apps/cam/capture_script.h
@@ -10,6 +10,7 @@ 
 #include <map>
 #include <memory>
 #include <string>
+#include <string_view>
 
 #include <libcamera/camera.h>
 #include <libcamera/controls.h>
@@ -67,7 +68,7 @@  private:
 	std::vector<std::string> parseSingleArray();
 
 	void unpackFailure(const libcamera::ControlId *id,
-			   const std::string &repr);
+			   std::string_view repr);
 	libcamera::ControlValue unpackControl(const libcamera::ControlId *id);
 	libcamera::Rectangle unpackRectangle(const std::vector<std::string> &strVec);
 };
diff --git a/src/apps/cam/drm.cpp b/src/apps/cam/drm.cpp
index 47bbb6b05..fd9c59ec4 100644
--- a/src/apps/cam/drm.cpp
+++ b/src/apps/cam/drm.cpp
@@ -57,7 +57,7 @@  Object::~Object()
 {
 }
 
-const Property *Object::property(const std::string &name) const
+const Property *Object::property(std::string_view name) const
 {
 	for (const PropertyValue &pv : properties_) {
 		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
@@ -68,7 +68,7 @@  const Property *Object::property(const std::string &name) const
 	return nullptr;
 }
 
-const PropertyValue *Object::propertyValue(const std::string &name) const
+const PropertyValue *Object::propertyValue(std::string_view name) const
 {
 	for (const PropertyValue &pv : properties_) {
 		const Property *property = static_cast<const Property *>(dev_->object(pv.id()));
@@ -320,7 +320,7 @@  AtomicRequest::~AtomicRequest()
 		drmModeAtomicFree(request_);
 }
 
-int AtomicRequest::addProperty(const Object *object, const std::string &property,
+int AtomicRequest::addProperty(const Object *object, std::string_view property,
 			       uint64_t value)
 {
 	if (!valid_)
@@ -335,7 +335,7 @@  int AtomicRequest::addProperty(const Object *object, const std::string &property
 	return addProperty(object->id(), prop->id(), value);
 }
 
-int AtomicRequest::addProperty(const Object *object, const std::string &property,
+int AtomicRequest::addProperty(const Object *object, std::string_view property,
 			       std::unique_ptr<Blob> blob)
 {
 	if (!valid_)
diff --git a/src/apps/cam/drm.h b/src/apps/cam/drm.h
index 1ba83b6eb..aa1b06400 100644
--- a/src/apps/cam/drm.h
+++ b/src/apps/cam/drm.h
@@ -13,6 +13,7 @@ 
 #include <memory>
 #include <stdint.h>
 #include <string>
+#include <string_view>
 #include <vector>
 
 #include <libcamera/base/signal.h>
@@ -57,8 +58,8 @@  public:
 	uint32_t id() const { return id_; }
 	Type type() const { return type_; }
 
-	const Property *property(const std::string &name) const;
-	const PropertyValue *propertyValue(const std::string &name) const;
+	const Property *property(std::string_view name) const;
+	const PropertyValue *propertyValue(std::string_view name) const;
 	const std::vector<PropertyValue> &properties() const { return properties_; }
 
 protected:
@@ -260,9 +261,9 @@  public:
 	Device *device() const { return dev_; }
 	bool isValid() const { return valid_; }
 
-	int addProperty(const Object *object, const std::string &property,
+	int addProperty(const Object *object, std::string_view property,
 			uint64_t value);
-	int addProperty(const Object *object, const std::string &property,
+	int addProperty(const Object *object, std::string_view property,
 			std::unique_ptr<Blob> blob);
 	int commit(unsigned int flags = 0);
 
diff --git a/src/ipa/libipa/camera_sensor_helper.cpp b/src/ipa/libipa/camera_sensor_helper.cpp
index 7c66cd57d..4ed050b14 100644
--- a/src/ipa/libipa/camera_sensor_helper.cpp
+++ b/src/ipa/libipa/camera_sensor_helper.cpp
@@ -240,7 +240,7 @@  CameraSensorHelperFactoryBase::CameraSensorHelperFactoryBase(const std::string n
  * corresponding to the named factory or a null pointer if no such factory
  * exists
  */
-std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(const std::string &name)
+std::unique_ptr<CameraSensorHelper> CameraSensorHelperFactoryBase::create(std::string_view name)
 {
 	const std::vector<CameraSensorHelperFactoryBase *> &factories =
 		CameraSensorHelperFactoryBase::factories();
diff --git a/src/ipa/libipa/camera_sensor_helper.h b/src/ipa/libipa/camera_sensor_helper.h
index a9300a64f..eedc80114 100644
--- a/src/ipa/libipa/camera_sensor_helper.h
+++ b/src/ipa/libipa/camera_sensor_helper.h
@@ -11,6 +11,7 @@ 
 #include <optional>
 #include <stdint.h>
 #include <string>
+#include <string_view>
 #include <variant>
 #include <vector>
 
@@ -56,7 +57,7 @@  public:
 	CameraSensorHelperFactoryBase(const std::string name);
 	virtual ~CameraSensorHelperFactoryBase() = default;
 
-	static std::unique_ptr<CameraSensorHelper> create(const std::string &name);
+	static std::unique_ptr<CameraSensorHelper> create(std::string_view name);
 
 	static std::vector<CameraSensorHelperFactoryBase *> &factories();
 
diff --git a/src/ipa/libipa/module.cpp b/src/ipa/libipa/module.cpp
index 64ca91419..91fb588e7 100644
--- a/src/ipa/libipa/module.cpp
+++ b/src/ipa/libipa/module.cpp
@@ -107,7 +107,7 @@  namespace ipa {
  */
 
 /**
- * \fn Module::createAlgorithm(const std::string &name)
+ * \fn Module::createAlgorithm(std::string_view name)
  * \brief Create an instance of an Algorithm by name
  * \param[in] name The algorithm name
  *
diff --git a/src/ipa/libipa/module.h b/src/ipa/libipa/module.h
index 0fb51916f..62c700a64 100644
--- a/src/ipa/libipa/module.h
+++ b/src/ipa/libipa/module.h
@@ -9,7 +9,7 @@ 
 
 #include <list>
 #include <memory>
-#include <string>
+#include <string_view>
 #include <vector>
 
 #include <libcamera/base/log.h>
@@ -95,7 +95,7 @@  private:
 		return 0;
 	}
 
-	static std::unique_ptr<Algorithm<Module>> createAlgorithm(const std::string &name)
+	static std::unique_ptr<Algorithm<Module>> createAlgorithm(std::string_view name)
 	{
 		for (const AlgorithmFactoryBase<Module> *factory : factories()) {
 			if (factory->name() == name)
diff --git a/src/libcamera/base/utils.cpp b/src/libcamera/base/utils.cpp
index bcfc1941a..de6e2afd6 100644
--- a/src/libcamera/base/utils.cpp
+++ b/src/libcamera/base/utils.cpp
@@ -80,7 +80,7 @@  char *secure_getenv(const char *name)
  *
  * \return A string of the directory component of the path
  */
-std::string dirname(const std::string &path)
+std::string dirname(std::string_view path)
 {
 	if (path.empty())
 		return ".";
@@ -116,7 +116,7 @@  std::string dirname(const std::string &path)
 		pos--;
 	}
 
-	return path.substr(0, pos + 1);
+	return std::string(path.substr(0, pos + 1));
 }
 
 /**
@@ -278,7 +278,7 @@  std::string details::StringSplitter::iterator::operator*() const
 
 /**
  * \fn template<typename Container, typename UnaryOp> \
- * std::string utils::join(const Container &items, const std::string &sep, UnaryOp op)
+ * std::string utils::join(const Container &items, std::string_view sep, UnaryOp op)
  * \brief Join elements of a container in a string with a separator
  * \param[in] items The container
  * \param[in] sep The separator to add between elements
@@ -319,7 +319,7 @@  details::StringSplitter split(const std::string &str, const std::string &delim)
  *
  * \return A string equal to \a str stripped out of all non-ASCII characters
  */
-std::string toAscii(const std::string &str)
+std::string toAscii(std::string_view str)
 {
 	std::string ret;
 	for (const char &c : str)
diff --git a/src/libcamera/camera_manager.cpp b/src/libcamera/camera_manager.cpp
index 87e6717ec..179fa37ea 100644
--- a/src/libcamera/camera_manager.cpp
+++ b/src/libcamera/camera_manager.cpp
@@ -382,7 +382,7 @@  std::vector<std::shared_ptr<Camera>> CameraManager::cameras() const
  *
  * \return Shared pointer to Camera object or nullptr if camera not found
  */
-std::shared_ptr<Camera> CameraManager::get(const std::string &id)
+std::shared_ptr<Camera> CameraManager::get(std::string_view id)
 {
 	Private *const d = _d();
 
diff --git a/src/libcamera/device_enumerator.cpp b/src/libcamera/device_enumerator.cpp
index ae17862f6..8744a90f3 100644
--- a/src/libcamera/device_enumerator.cpp
+++ b/src/libcamera/device_enumerator.cpp
@@ -272,7 +272,7 @@  void DeviceEnumerator::addDevice(std::unique_ptr<MediaDevice> media)
  * enumerator with addDevice(). The media device's MediaDevice::disconnected
  * signal is emitted.
  */
-void DeviceEnumerator::removeDevice(const std::string &deviceNode)
+void DeviceEnumerator::removeDevice(std::string_view deviceNode)
 {
 	std::shared_ptr<MediaDevice> media;
 
diff --git a/src/libcamera/device_enumerator_udev.cpp b/src/libcamera/device_enumerator_udev.cpp
index 4e20a3cc0..c330f30bc 100644
--- a/src/libcamera/device_enumerator_udev.cpp
+++ b/src/libcamera/device_enumerator_udev.cpp
@@ -351,7 +351,7 @@  void DeviceEnumeratorUdev::udevNotify()
 	} else if (action == "remove") {
 		const char *subsystem = udev_device_get_subsystem(dev);
 		if (subsystem && !strcmp(subsystem, "media"))
-			removeDevice(std::string(deviceNode));
+			removeDevice(deviceNode);
 	}
 
 	udev_device_unref(dev);
diff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp
index bfcdfc089..112dfe66b 100644
--- a/src/libcamera/formats.cpp
+++ b/src/libcamera/formats.cpp
@@ -1037,7 +1037,7 @@  const PixelFormatInfo &PixelFormatInfo::info(const V4L2PixelFormat &format)
  * \return The PixelFormatInfo describing the PixelFormat matching the
  * \a name if known, or an invalid PixelFormatInfo otherwise
  */
-const PixelFormatInfo &PixelFormatInfo::info(const std::string &name)
+const PixelFormatInfo &PixelFormatInfo::info(std::string_view name)
 {
 	for (const auto &info : pixelFormatInfo) {
 		if (info.second.name == name)
diff --git a/src/libcamera/media_device.cpp b/src/libcamera/media_device.cpp
index d71dad74d..131b34446 100644
--- a/src/libcamera/media_device.cpp
+++ b/src/libcamera/media_device.cpp
@@ -331,7 +331,7 @@  done:
  * \param[in] name The entity name
  * \return The entity with \a name, or nullptr if no such entity is found
  */
-MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
+MediaEntity *MediaDevice::getEntityByName(std::string_view name) const
 {
 	for (MediaEntity *e : entities_)
 		if (e->name() == name)
@@ -359,8 +359,8 @@  MediaEntity *MediaDevice::getEntityByName(const std::string &name) const
  * \return The link that connects the two pads, or nullptr if no such a link
  * exists
  */
-MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceIdx,
-			     const std::string &sinkName, unsigned int sinkIdx)
+MediaLink *MediaDevice::link(std::string_view sourceName, unsigned int sourceIdx,
+			     std::string_view sinkName, unsigned int sinkIdx)
 {
 	const MediaEntity *source = getEntityByName(sourceName);
 	const MediaEntity *sink = getEntityByName(sinkName);
@@ -382,8 +382,8 @@  MediaLink *MediaDevice::link(const std::string &sourceName, unsigned int sourceI
  * entity \a source, to the pad at index \a sinkIdx of the sink entity \a
  * sink, if any.
  *
- * \sa link(const std::string &sourceName, unsigned int sourceIdx,
- *          const std::string &sinkName, unsigned int sinkIdx)
+ * \sa link(std::string_view sourceName, unsigned int sourceIdx,
+ *          std::string_view sinkName, unsigned int sinkIdx)
  * \sa link(const MediaPad *source, const MediaPad *sink)
  *
  * \return The link that connects the two pads, or nullptr if no such a link
@@ -406,8 +406,8 @@  MediaLink *MediaDevice::link(const MediaEntity *source, unsigned int sourceIdx,
  * \param[in] source The source pad
  * \param[in] sink The sink pad
  *
- * \sa link(const std::string &sourceName, unsigned int sourceIdx,
- *          const std::string &sinkName, unsigned int sinkIdx)
+ * \sa link(std::string_view sourceName, unsigned int sourceIdx,
+ *          std::string_view sinkName, unsigned int sinkIdx)
  * \sa link(const MediaEntity *source, unsigned int sourceIdx,
  *          const MediaEntity *sink, unsigned int sinkIdx)
  *
diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp
index caa5c20e7..6b395c666 100644
--- a/src/libcamera/pipeline_handler.cpp
+++ b/src/libcamera/pipeline_handler.cpp
@@ -852,7 +852,7 @@  std::vector<PipelineHandlerFactoryBase *> &PipelineHandlerFactoryBase::factories
  * \param[in] name The pipeline handler name
  * \return The factory of the pipeline with name \a name, or nullptr if not found
  */
-const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(const std::string &name)
+const PipelineHandlerFactoryBase *PipelineHandlerFactoryBase::getFactoryByName(std::string_view name)
 {
 	const std::vector<PipelineHandlerFactoryBase *> &factories =
 		PipelineHandlerFactoryBase::factories();
diff --git a/src/libcamera/pixel_format.cpp b/src/libcamera/pixel_format.cpp
index 314179a81..22f1520fd 100644
--- a/src/libcamera/pixel_format.cpp
+++ b/src/libcamera/pixel_format.cpp
@@ -135,7 +135,7 @@  std::string PixelFormat::toString() const
  * \return The PixelFormat represented by the \a name if known, or an
  * invalid pixel format otherwise.
  */
-PixelFormat PixelFormat::fromString(const std::string &name)
+PixelFormat PixelFormat::fromString(std::string_view name)
 {
 	return PixelFormatInfo::info(name).format;
 }
diff --git a/src/libcamera/sensor/camera_sensor_properties.cpp b/src/libcamera/sensor/camera_sensor_properties.cpp
index 2b06c5a1a..4283cacfa 100644
--- a/src/libcamera/sensor/camera_sensor_properties.cpp
+++ b/src/libcamera/sensor/camera_sensor_properties.cpp
@@ -78,9 +78,9 @@  LOG_DEFINE_CATEGORY(CameraSensorProperties)
  * \return A pointer to the CameraSensorProperties instance associated with a sensor
  * or nullptr if the sensor is not supported
  */
-const CameraSensorProperties *CameraSensorProperties::get(const std::string &sensor)
+const CameraSensorProperties *CameraSensorProperties::get(std::string_view sensor)
 {
-	static const std::map<std::string, const CameraSensorProperties> sensorProps = {
+	static const std::map<std::string_view, const CameraSensorProperties> sensorProps = {
 		{ "ar0144", {
 			.unitCellSize = { 3000, 3000 },
 			.testPatternModes = {
diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp
index 3a0d075f9..7e85b33be 100644
--- a/src/libcamera/v4l2_subdevice.cpp
+++ b/src/libcamera/v4l2_subdevice.cpp
@@ -1688,7 +1688,7 @@  const std::string &V4L2Subdevice::model()
  */
 std::unique_ptr<V4L2Subdevice>
 V4L2Subdevice::fromEntityName(const MediaDevice *media,
-			      const std::string &entity)
+			      std::string_view entity)
 {
 	MediaEntity *mediaEntity = media->getEntityByName(entity);
 	if (!mediaEntity)
diff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp
index a5cf67845..834a1bd0d 100644
--- a/src/libcamera/v4l2_videodevice.cpp
+++ b/src/libcamera/v4l2_videodevice.cpp
@@ -2077,7 +2077,7 @@  void V4L2VideoDevice::watchdogExpired()
  */
 std::unique_ptr<V4L2VideoDevice>
 V4L2VideoDevice::fromEntityName(const MediaDevice *media,
-				const std::string &entity)
+				std::string_view entity)
 {
 	MediaEntity *mediaEntity = media->getEntityByName(entity);
 	if (!mediaEntity)
diff --git a/src/py/libcamera/py_camera_manager.h b/src/py/libcamera/py_camera_manager.h
index 3574db236..af69b915e 100644
--- a/src/py/libcamera/py_camera_manager.h
+++ b/src/py/libcamera/py_camera_manager.h
@@ -20,7 +20,7 @@  public:
 	~PyCameraManager();
 
 	pybind11::list cameras();
-	std::shared_ptr<Camera> get(const std::string &name) { return cameraManager_->get(name); }
+	std::shared_ptr<Camera> get(std::string_view name) { return cameraManager_->get(name); }
 
 	static const std::string &version() { return CameraManager::version(); }
 
diff --git a/src/py/libcamera/py_main.cpp b/src/py/libcamera/py_main.cpp
index 441a70ab4..820768c24 100644
--- a/src/py/libcamera/py_main.cpp
+++ b/src/py/libcamera/py_main.cpp
@@ -510,7 +510,7 @@  PYBIND11_MODULE(_libcamera, m)
 	pyPixelFormat
 		.def(py::init<>())
 		.def(py::init<uint32_t, uint64_t>())
-		.def(py::init<>([](const std::string &str) {
+		.def(py::init<>([](std::string_view str) {
 			return PixelFormat::fromString(str);
 		}))
 		.def_property_readonly("fourcc", &PixelFormat::fourcc)