/* SPDX-License-Identifier: BSD-2-Clause */ /* * Copyright (C) 2019, Raspberry Pi (Trading) Limited * * metadata.hpp - general metadata class */ #pragma once // A simple class for carrying arbitrary metadata, for example about an image. #include #include #include #include #include namespace RPiController { class Metadata { public: template void Set(std::string const &tag, T const &value) { std::lock_guard lock(mutex_); data_[tag] = value; } template int Get(std::string const &tag, T &value) const { std::lock_guard lock(mutex_); auto it = data_.find(tag); if (it == data_.end()) return -1; value = std::any_cast(it->second); return 0; } void Clear() { std::lock_guard lock(mutex_); data_.clear(); } Metadata &operator=(Metadata const &other) { std::lock_guard lock(mutex_); std::lock_guard other_lock(other.mutex_); data_ = other.data_; return *this; } template T *GetLocked(std::string const &tag) { // This allows in-place access to the Metadata contents, // for which you should be holding the lock. auto it = data_.find(tag); if (it == data_.end()) return nullptr; return std::any_cast(&it->second); } template void SetLocked(std::string const &tag, T const &value) { // Use this only if you're holding the lock yourself. data_[tag] = value; } // Note: use of (lowercase) lock and unlock means you can create scoped // locks with the standard lock classes. // e.g. std::lock_guard lock(metadata) void lock() { mutex_.lock(); } void unlock() { mutex_.unlock(); } private: mutable std::mutex mutex_; std::map data_; }; typedef std::shared_ptr MetadataPtr; } // namespace RPiController diff
blob: c3ca11e3e2e050b2f1ce862c4955298c635a60c7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69