[libcamera-devel,3/2] libcamera: file: Use Flags<> class for map flags

Message ID 20200724231909.29464-1-laurent.pinchart@ideasonboard.com
State Changes Requested
Delegated to: Laurent Pinchart
Headers show
Series
  • libcamera: Add type-safe enum-based flags
Related show

Commit Message

Laurent Pinchart July 24, 2020, 11:19 p.m. UTC
Use the newly introduced Flags<> class to store a bitfield of
File::MapFlag in a type-safe way.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
---
 include/libcamera/internal/file.h |  9 +++++++--
 src/libcamera/file.cpp            | 11 ++++++++---
 src/libcamera/ipa_module.cpp      |  2 +-
 test/file.cpp                     |  2 +-
 4 files changed, 17 insertions(+), 7 deletions(-)

Patch

diff --git a/include/libcamera/internal/file.h b/include/libcamera/internal/file.h
index 9b6d011f5e9d..d6baacaaa551 100644
--- a/include/libcamera/internal/file.h
+++ b/include/libcamera/internal/file.h
@@ -11,6 +11,7 @@ 
 #include <string>
 #include <sys/types.h>
 
+#include <libcamera/flags.h>
 #include <libcamera/span.h>
 
 namespace libcamera {
@@ -18,11 +19,13 @@  namespace libcamera {
 class File
 {
 public:
-	enum MapFlag {
+	enum class MapFlag {
 		MapNoOption = 0,
 		MapPrivate = (1 << 0),
 	};
 
+	using MapFlags = Flags<MapFlag>;
+
 	enum OpenMode {
 		NotOpen = 0,
 		ReadOnly = (1 << 0),
@@ -56,7 +59,7 @@  public:
 	ssize_t write(const Span<const uint8_t> &data);
 
 	Span<uint8_t> map(off_t offset = 0, ssize_t size = -1,
-			  MapFlag flags = MapNoOption);
+			  MapFlags flags = MapFlag::MapNoOption);
 	bool unmap(uint8_t *addr);
 
 	static bool exists(const std::string &name);
@@ -72,6 +75,8 @@  private:
 	std::map<void *, size_t> maps_;
 };
 
+LIBCAMERA_FLAGS_ENABLE_OPERATORS(File::MapFlag)
+
 } /* namespace libcamera */
 
 #endif /* __LIBCAMERA_INTERNAL_FILE_H__ */
diff --git a/src/libcamera/file.cpp b/src/libcamera/file.cpp
index 04b0cb61a1bf..de944deb8667 100644
--- a/src/libcamera/file.cpp
+++ b/src/libcamera/file.cpp
@@ -52,6 +52,11 @@  LOG_DEFINE_CATEGORY(File);
  * the file constents
  */
 
+/**
+ * \typedef File::MapFlags
+ * \brief An OR combination of File::MapFlag values
+ */
+
 /**
  * \enum File::OpenMode
  * \brief Mode in which a file is opened
@@ -371,7 +376,7 @@  ssize_t File::write(const Span<const uint8_t> &data)
  *
  * \return The mapped memory on success, or an empty span otherwise
  */
-Span<uint8_t> File::map(off_t offset, ssize_t size, enum File::MapFlag flags)
+Span<uint8_t> File::map(off_t offset, ssize_t size, File::MapFlags flags)
 {
 	if (!isOpen()) {
 		error_ = -EBADF;
@@ -388,14 +393,14 @@  Span<uint8_t> File::map(off_t offset, ssize_t size, enum File::MapFlag flags)
 		size -= offset;
 	}
 
-	int mmapFlags = flags & MapPrivate ? MAP_PRIVATE : MAP_SHARED;
+	int mmapFlags = flags & MapFlag::MapPrivate ? MAP_PRIVATE : MAP_SHARED;
 
 	int prot = 0;
 	if (mode_ & ReadOnly)
 		prot |= PROT_READ;
 	if (mode_ & WriteOnly)
 		prot |= PROT_WRITE;
-	if (flags & MapPrivate)
+	if (flags & MapFlag::MapPrivate)
 		prot |= PROT_WRITE;
 
 	void *map = mmap(NULL, size, prot, mmapFlags, fd_, offset);
diff --git a/src/libcamera/ipa_module.cpp b/src/libcamera/ipa_module.cpp
index de512a7f3a0d..c1eaf0bbb792 100644
--- a/src/libcamera/ipa_module.cpp
+++ b/src/libcamera/ipa_module.cpp
@@ -323,7 +323,7 @@  int IPAModule::loadIPAModuleInfo()
 		return 0;
 	}
 
-	data = sign.map(0, -1, File::MapPrivate);
+	data = sign.map(0, -1, File::MapFlag::MapPrivate);
 	signature_.resize(data.size());
 	memcpy(signature_.data(), data.data(), data.size());
 
diff --git a/test/file.cpp b/test/file.cpp
index f458f355ccad..9ea83d5b2cc4 100644
--- a/test/file.cpp
+++ b/test/file.cpp
@@ -313,7 +313,7 @@  protected:
 		file.setFileName(fileName_);
 		file.open(File::ReadWrite);
 
-		data = file.map(0, -1, File::MapPrivate);
+		data = file.map(0, -1, File::MapFlag::MapPrivate);
 		if (data.empty()) {
 			cerr << "Private mapping failed" << endl;
 			return TestFail;