Enable some more clang-tidy checks and fix warnings
This commit is contained in:
parent
e38af1001d
commit
5fe3cada4c
25
.clang-tidy
25
.clang-tidy
@ -1,5 +1,28 @@
|
|||||||
---
|
---
|
||||||
Checks: 'clang-diagnostic-*,clang-analyzer-*,misc-use-after-move,misc-unused-using-decls,misc-unused-alias-decls'
|
# TODO Enable (some of) the explicitly disabled checks. Possibly needs helper types from gsl library or similar to enable full cppcoreguidelines.
|
||||||
|
# TODO Enable more checks (google-*, hicpp-*, llvm-*, modernize-*, mpi-*, performance-*, readability-*)
|
||||||
|
# TODO Maybe just enable * and disable a list instead?
|
||||||
|
Checks: |
|
||||||
|
clang-diagnostic-*,
|
||||||
|
clang-analyzer-*,
|
||||||
|
bugprone-*,
|
||||||
|
cert-*,
|
||||||
|
cppcoreguidelines-*,
|
||||||
|
misc-*,
|
||||||
|
boost-use-to-string,
|
||||||
|
-cert-env33-c,
|
||||||
|
-cert-err58-cpp,
|
||||||
|
-cppcoreguidelines-owning-memory,
|
||||||
|
-cppcoreguidelines-no-malloc,
|
||||||
|
-cppcoreguidelines-pro-type-const-cast,
|
||||||
|
-cppcoreguidelines-pro-bounds-pointer-arithmetic,
|
||||||
|
-cppcoreguidelines-pro-type-reinterpret-cast,
|
||||||
|
-cppcoreguidelines-special-member-functions,
|
||||||
|
-cppcoreguidelines-pro-type-cstyle-cast,
|
||||||
|
-cppcoreguidelines-pro-bounds-array-to-pointer-decay,
|
||||||
|
-cppcoreguidelines-pro-type-vararg,
|
||||||
|
-misc-macro-parentheses,
|
||||||
|
-misc-unused-raii
|
||||||
WarningsAsErrors: ''
|
WarningsAsErrors: ''
|
||||||
HeaderFilterRegex: '/src/|/test/'
|
HeaderFilterRegex: '/src/|/test/'
|
||||||
CheckOptions:
|
CheckOptions:
|
||||||
|
@ -69,7 +69,7 @@ public:
|
|||||||
ASSERT(data.size() <= layout.datasizeBytes(), "Data is too large for node");
|
ASSERT(data.size() <= layout.datasizeBytes(), "Data is too large for node");
|
||||||
cpputils::Data serialized = _serialize(layout, formatVersion, depth, size, std::move(data));
|
cpputils::Data serialized = _serialize(layout, formatVersion, depth, size, std::move(data));
|
||||||
ASSERT(serialized.size() == layout.blocksizeBytes(), "Wrong block size");
|
ASSERT(serialized.size() == layout.blocksizeBytes(), "Wrong block size");
|
||||||
auto block = blockStore->create(std::move(serialized));
|
auto block = blockStore->create(serialized);
|
||||||
return DataNodeView(std::move(block));
|
return DataNodeView(std::move(block));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -14,7 +14,7 @@ namespace parallelaccessdatatreestore {
|
|||||||
class ParallelAccessDataTreeStoreAdapter final: public parallelaccessstore::ParallelAccessBaseStore<datatreestore::DataTree, blockstore::BlockId> {
|
class ParallelAccessDataTreeStoreAdapter final: public parallelaccessstore::ParallelAccessBaseStore<datatreestore::DataTree, blockstore::BlockId> {
|
||||||
public:
|
public:
|
||||||
ParallelAccessDataTreeStoreAdapter(datatreestore::DataTreeStore *baseDataTreeStore)
|
ParallelAccessDataTreeStoreAdapter(datatreestore::DataTreeStore *baseDataTreeStore)
|
||||||
:_baseDataTreeStore(std::move(baseDataTreeStore)) {
|
:_baseDataTreeStore(baseDataTreeStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<cpputils::unique_ref<datatreestore::DataTree>> loadFromBaseStore(const blockstore::BlockId &blockId) override {
|
boost::optional<cpputils::unique_ref<datatreestore::DataTree>> loadFromBaseStore(const blockstore::BlockId &blockId) override {
|
||||||
|
@ -16,7 +16,7 @@ public:
|
|||||||
explicit CacheEntry(Value value): _lastAccess(currentTime()), _value(std::move(value)) {
|
explicit CacheEntry(Value value): _lastAccess(currentTime()), _value(std::move(value)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
CacheEntry(CacheEntry &&) = default;
|
CacheEntry(CacheEntry &&) noexcept = default;
|
||||||
|
|
||||||
double ageSeconds() const {
|
double ageSeconds() const {
|
||||||
return ((double)(currentTime() - _lastAccess).total_nanoseconds()) / ((double)1000000000);
|
return ((double)(currentTime() - _lastAccess).total_nanoseconds()) / ((double)1000000000);
|
||||||
|
@ -8,8 +8,8 @@
|
|||||||
namespace blockstore {
|
namespace blockstore {
|
||||||
namespace integrity {
|
namespace integrity {
|
||||||
|
|
||||||
struct ClientIdAndBlockId {
|
struct ClientIdAndBlockId final {
|
||||||
uint32_t clientId;
|
uint32_t clientId = 0;
|
||||||
BlockId blockId;
|
BlockId blockId;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -215,8 +215,8 @@ void IntegrityBlockStore2::migrateBlockFromBlockstoreWithoutVersionNumbers(block
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
cpputils::Data data = std::move(*data_);
|
cpputils::Data data = std::move(*data_);
|
||||||
cpputils::Data dataWithHeader = _prependHeaderToData(blockId, knownBlockVersions->myClientId(), version, std::move(data));
|
cpputils::Data dataWithHeader = _prependHeaderToData(blockId, knownBlockVersions->myClientId(), version, data);
|
||||||
baseBlockStore->store(blockId, std::move(dataWithHeader));
|
baseBlockStore->store(blockId, dataWithHeader);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ KnownBlockVersions::KnownBlockVersions(const bf::path &stateFilePath, uint32_t m
|
|||||||
_loadStateFile();
|
_loadStateFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
KnownBlockVersions::KnownBlockVersions(KnownBlockVersions &&rhs)
|
KnownBlockVersions::KnownBlockVersions(KnownBlockVersions &&rhs) // NOLINT (intentionally not noexcept)
|
||||||
: _knownVersions(), _lastUpdateClientId(), _stateFilePath(), _myClientId(0), _mutex(), _valid(true) {
|
: _knownVersions(), _lastUpdateClientId(), _stateFilePath(), _myClientId(0), _mutex(), _valid(true) {
|
||||||
unique_lock<mutex> rhsLock(rhs._mutex);
|
unique_lock<mutex> rhsLock(rhs._mutex);
|
||||||
unique_lock<mutex> lock(_mutex);
|
unique_lock<mutex> lock(_mutex);
|
||||||
|
@ -18,7 +18,7 @@ namespace blockstore {
|
|||||||
class KnownBlockVersions final {
|
class KnownBlockVersions final {
|
||||||
public:
|
public:
|
||||||
KnownBlockVersions(const boost::filesystem::path &stateFilePath, uint32_t myClientId);
|
KnownBlockVersions(const boost::filesystem::path &stateFilePath, uint32_t myClientId);
|
||||||
KnownBlockVersions(KnownBlockVersions &&rhs);
|
KnownBlockVersions(KnownBlockVersions &&rhs); // NOLINT (intentionally not noexcept)
|
||||||
~KnownBlockVersions();
|
~KnownBlockVersions();
|
||||||
|
|
||||||
__attribute__((warn_unused_result))
|
__attribute__((warn_unused_result))
|
||||||
|
@ -76,7 +76,7 @@ optional<Data> OnDiskBlockStore2::load(const BlockId &blockId) const {
|
|||||||
if (fileContent == none) {
|
if (fileContent == none) {
|
||||||
return boost::none;
|
return boost::none;
|
||||||
}
|
}
|
||||||
return _checkAndRemoveHeader(std::move(*fileContent));
|
return _checkAndRemoveHeader(*fileContent);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OnDiskBlockStore2::store(const BlockId &blockId, const Data &data) {
|
void OnDiskBlockStore2::store(const BlockId &blockId, const Data &data) {
|
||||||
@ -99,7 +99,7 @@ uint64_t OnDiskBlockStore2::numBlocks() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uint64_t OnDiskBlockStore2::estimateNumFreeBytes() const {
|
uint64_t OnDiskBlockStore2::estimateNumFreeBytes() const {
|
||||||
struct statvfs stat;
|
struct statvfs stat{};
|
||||||
int result = ::statvfs(_rootDir.c_str(), &stat);
|
int result = ::statvfs(_rootDir.c_str(), &stat);
|
||||||
if (0 != result) {
|
if (0 != result) {
|
||||||
throw std::runtime_error("Error calling statvfs()");
|
throw std::runtime_error("Error calling statvfs()");
|
||||||
|
@ -12,7 +12,7 @@ namespace parallelaccess {
|
|||||||
class ParallelAccessBlockStoreAdapter final: public parallelaccessstore::ParallelAccessBaseStore<Block, BlockId> {
|
class ParallelAccessBlockStoreAdapter final: public parallelaccessstore::ParallelAccessBaseStore<Block, BlockId> {
|
||||||
public:
|
public:
|
||||||
explicit ParallelAccessBlockStoreAdapter(BlockStore *baseBlockStore)
|
explicit ParallelAccessBlockStoreAdapter(BlockStore *baseBlockStore)
|
||||||
:_baseBlockStore(std::move(baseBlockStore)) {
|
:_baseBlockStore(baseBlockStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<cpputils::unique_ref<Block>> loadFromBaseStore(const BlockId &blockId) override {
|
boost::optional<cpputils::unique_ref<Block>> loadFromBaseStore(const BlockId &blockId) override {
|
||||||
|
@ -17,8 +17,8 @@ Hash hash(const Data& data, Salt salt) {
|
|||||||
hasher.Final((CryptoPP::byte*)digest.data());
|
hasher.Final((CryptoPP::byte*)digest.data());
|
||||||
|
|
||||||
return Hash{
|
return Hash{
|
||||||
.digest = std::move(digest),
|
.digest = digest,
|
||||||
.salt = std::move(salt)
|
.salt = salt
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,8 +17,8 @@ public:
|
|||||||
explicit Data(size_t size);
|
explicit Data(size_t size);
|
||||||
~Data();
|
~Data();
|
||||||
|
|
||||||
Data(Data &&rhs); // move constructor
|
Data(Data &&rhs) noexcept;
|
||||||
Data &operator=(Data &&rhs); // move assignment
|
Data &operator=(Data &&rhs) noexcept;
|
||||||
|
|
||||||
Data copy() const;
|
Data copy() const;
|
||||||
|
|
||||||
@ -81,14 +81,14 @@ inline Data::Data(size_t size)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Data::Data(Data &&rhs)
|
inline Data::Data(Data &&rhs) noexcept
|
||||||
: _size(rhs._size), _data(rhs._data) {
|
: _size(rhs._size), _data(rhs._data) {
|
||||||
// Make rhs invalid, so the memory doesn't get freed in its destructor.
|
// Make rhs invalid, so the memory doesn't get freed in its destructor.
|
||||||
rhs._data = nullptr;
|
rhs._data = nullptr;
|
||||||
rhs._size = 0;
|
rhs._size = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
inline Data &Data::operator=(Data &&rhs) {
|
inline Data &Data::operator=(Data &&rhs) noexcept {
|
||||||
std::free(_data);
|
std::free(_data);
|
||||||
_data = rhs._data;
|
_data = rhs._data;
|
||||||
_size = rhs._size;
|
_size = rhs._size;
|
||||||
|
@ -34,7 +34,7 @@ public:
|
|||||||
template<size_t size> FixedSizeData<SIZE-size> drop() const;
|
template<size_t size> FixedSizeData<SIZE-size> drop() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
FixedSizeData() {}
|
FixedSizeData(): _data() {}
|
||||||
template<size_t _SIZE> friend class FixedSizeData;
|
template<size_t _SIZE> friend class FixedSizeData;
|
||||||
|
|
||||||
unsigned char _data[BINARY_LENGTH];
|
unsigned char _data[BINARY_LENGTH];
|
||||||
|
@ -17,7 +17,7 @@ namespace cpputils {
|
|||||||
*/
|
*/
|
||||||
class DontEchoStdinToStdoutRAII final {
|
class DontEchoStdinToStdoutRAII final {
|
||||||
public:
|
public:
|
||||||
DontEchoStdinToStdoutRAII() {
|
DontEchoStdinToStdoutRAII(): _old_state() {
|
||||||
tcgetattr(STDIN_FILENO, &_old_state);
|
tcgetattr(STDIN_FILENO, &_old_state);
|
||||||
termios new_state = _old_state;
|
termios new_state = _old_state;
|
||||||
new_state.c_lflag &= ~ECHO;
|
new_state.c_lflag &= ~ECHO;
|
||||||
|
@ -17,7 +17,7 @@ namespace cpputils {
|
|||||||
_pool->lock(_lockName, lockToFreeWhileWaiting);
|
_pool->lock(_lockName, lockToFreeWhileWaiting);
|
||||||
}
|
}
|
||||||
|
|
||||||
MutexPoolLock(MutexPoolLock &&rhs): _pool(rhs._pool), _lockName(rhs._lockName) {
|
MutexPoolLock(MutexPoolLock &&rhs) noexcept: _pool(rhs._pool), _lockName(std::move(rhs._lockName)) {
|
||||||
rhs._pool = nullptr;
|
rhs._pool = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ inline bool operator!=(const unique_ref<T, D> &lhs, const unique_ref<T, D> &rhs)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace std {
|
namespace std { // NOLINT (intentional change of namespace std)
|
||||||
template<class T, class D>
|
template<class T, class D>
|
||||||
inline void swap(cpputils::unique_ref<T, D>& lhs, cpputils::unique_ref<T, D>& rhs) noexcept {
|
inline void swap(cpputils::unique_ref<T, D>& lhs, cpputils::unique_ref<T, D>& rhs) noexcept {
|
||||||
lhs.swap(rhs);
|
lhs.swap(rhs);
|
||||||
|
@ -11,7 +11,7 @@ namespace cpputils {
|
|||||||
namespace time {
|
namespace time {
|
||||||
|
|
||||||
inline timespec now() {
|
inline timespec now() {
|
||||||
struct timespec now;
|
struct timespec now{};
|
||||||
clock_gettime(CLOCK_REALTIME, &now);
|
clock_gettime(CLOCK_REALTIME, &now);
|
||||||
return now;
|
return now;
|
||||||
}
|
}
|
||||||
|
@ -62,7 +62,7 @@ namespace cpputils {
|
|||||||
|
|
||||||
boost::thread ThreadSystem::_startThread(function<bool()> loopIteration) {
|
boost::thread ThreadSystem::_startThread(function<bool()> loopIteration) {
|
||||||
return boost::thread([loopIteration = std::move(loopIteration)] {
|
return boost::thread([loopIteration = std::move(loopIteration)] {
|
||||||
ThreadSystem::_runThread(std::move(loopIteration));
|
ThreadSystem::_runThread(loopIteration);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -136,7 +136,7 @@ const CryConfig::FilesystemID &CryConfig::FilesystemId() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void CryConfig::SetFilesystemId(FilesystemID value) {
|
void CryConfig::SetFilesystemId(FilesystemID value) {
|
||||||
_filesystemId = std::move(value);
|
_filesystemId = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
optional<uint32_t> CryConfig::ExclusiveClientId() const {
|
optional<uint32_t> CryConfig::ExclusiveClientId() const {
|
||||||
|
@ -34,6 +34,6 @@ namespace cryfs {
|
|||||||
// This would need a change in the scrypt interface though, because right now we can't continue past key computations.
|
// This would need a change in the scrypt interface though, because right now we can't continue past key computations.
|
||||||
//TODO I might be able to know the actual key size here (at runtime) and switch the SCrypt deriveKey() interface to getting a dynamic size.
|
//TODO I might be able to know the actual key size here (at runtime) and switch the SCrypt deriveKey() interface to getting a dynamic size.
|
||||||
auto key = kdf->deriveKey<CryConfigEncryptor::MaxTotalKeySize>(password);
|
auto key = kdf->deriveKey<CryConfigEncryptor::MaxTotalKeySize>(password);
|
||||||
return make_unique_ref<CryConfigEncryptor>(std::move(key), kdf->kdfParameters().copy());
|
return make_unique_ref<CryConfigEncryptor>(key, kdf->kdfParameters().copy());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,7 @@ void CryNode::stat(struct ::stat *result) const {
|
|||||||
result->st_size = fsblobstore::DirBlob::DIR_LSTAT_SIZE;
|
result->st_size = fsblobstore::DirBlob::DIR_LSTAT_SIZE;
|
||||||
//TODO If possible without performance loss, then for a directory, st_nlink should return number of dir entries (including "." and "..")
|
//TODO If possible without performance loss, then for a directory, st_nlink should return number of dir entries (including "." and "..")
|
||||||
result->st_nlink = 1;
|
result->st_nlink = 1;
|
||||||
struct timespec now;
|
struct timespec now{};
|
||||||
clock_gettime(CLOCK_REALTIME, &now);
|
clock_gettime(CLOCK_REALTIME, &now);
|
||||||
result->st_atim = now;
|
result->st_atim = now;
|
||||||
result->st_mtim = now;
|
result->st_mtim = now;
|
||||||
|
@ -57,7 +57,7 @@ namespace cryfs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
timespec DirEntry::_deserializeTimeValue(const char **pos) {
|
timespec DirEntry::_deserializeTimeValue(const char **pos) {
|
||||||
timespec value;
|
timespec value{};
|
||||||
value.tv_sec = *(uint64_t*)(*pos);
|
value.tv_sec = *(uint64_t*)(*pos);
|
||||||
*pos += sizeof(uint64_t);
|
*pos += sizeof(uint64_t);
|
||||||
value.tv_nsec = *(uint32_t*)(*pos);
|
value.tv_nsec = *(uint32_t*)(*pos);
|
||||||
|
@ -12,7 +12,7 @@ namespace parallelaccessfsblobstore {
|
|||||||
class ParallelAccessFsBlobStoreAdapter final: public parallelaccessstore::ParallelAccessBaseStore<cachingfsblobstore::FsBlobRef, blockstore::BlockId> {
|
class ParallelAccessFsBlobStoreAdapter final: public parallelaccessstore::ParallelAccessBaseStore<cachingfsblobstore::FsBlobRef, blockstore::BlockId> {
|
||||||
public:
|
public:
|
||||||
explicit ParallelAccessFsBlobStoreAdapter(cachingfsblobstore::CachingFsBlobStore *baseBlobStore)
|
explicit ParallelAccessFsBlobStoreAdapter(cachingfsblobstore::CachingFsBlobStore *baseBlobStore)
|
||||||
:_baseBlobStore(std::move(baseBlobStore)) {
|
:_baseBlobStore(baseBlobStore) {
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::optional<cpputils::unique_ref<cachingfsblobstore::FsBlobRef>> loadFromBaseStore(const blockstore::BlockId &blockId) override {
|
boost::optional<cpputils::unique_ref<cachingfsblobstore::FsBlobRef>> loadFromBaseStore(const blockstore::BlockId &blockId) override {
|
||||||
|
@ -43,7 +43,7 @@ string jsonPathForBasedir(const bf::path &basedir) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BasedirMetadata::BasedirMetadata(ptree data)
|
BasedirMetadata::BasedirMetadata(ptree data)
|
||||||
:_data(std::move(data)) {}
|
:_data(data) {}
|
||||||
|
|
||||||
BasedirMetadata BasedirMetadata::load() {
|
BasedirMetadata BasedirMetadata::load() {
|
||||||
return BasedirMetadata(_load(LocalStateDir::forBasedirMetadata()));
|
return BasedirMetadata(_load(LocalStateDir::forBasedirMetadata()));
|
||||||
|
@ -24,7 +24,7 @@ namespace bf = boost::filesystem;
|
|||||||
namespace cryfs {
|
namespace cryfs {
|
||||||
|
|
||||||
LocalStateMetadata::LocalStateMetadata(uint32_t myClientId, Hash encryptionKeyHash)
|
LocalStateMetadata::LocalStateMetadata(uint32_t myClientId, Hash encryptionKeyHash)
|
||||||
: _myClientId(myClientId), _encryptionKeyHash(std::move(encryptionKeyHash)) {}
|
: _myClientId(myClientId), _encryptionKeyHash(encryptionKeyHash) {}
|
||||||
|
|
||||||
LocalStateMetadata LocalStateMetadata::loadOrGenerate(const bf::path &statePath, const Data& encryptionKey) {
|
LocalStateMetadata LocalStateMetadata::loadOrGenerate(const bf::path &statePath, const Data& encryptionKey) {
|
||||||
auto metadataFile = statePath / "metadata";
|
auto metadataFile = statePath / "metadata";
|
||||||
@ -113,8 +113,8 @@ LocalStateMetadata LocalStateMetadata::_deserialize(istream& stream) {
|
|||||||
string encryptionKeyDigest = pt.get<string>("encryptionKey.hash");
|
string encryptionKeyDigest = pt.get<string>("encryptionKey.hash");
|
||||||
|
|
||||||
return LocalStateMetadata(myClientId, Hash{
|
return LocalStateMetadata(myClientId, Hash{
|
||||||
.digest = cpputils::hash::Digest::FromString(std::move(encryptionKeyDigest)),
|
.digest = cpputils::hash::Digest::FromString(encryptionKeyDigest),
|
||||||
.salt = cpputils::hash::Salt::FromString(std::move(encryptionKeySalt))
|
.salt = cpputils::hash::Salt::FromString(encryptionKeySalt)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -778,7 +778,7 @@ int Fuse::readdir(const bf::path &path, void *buf, fuse_fill_dir_t filler, off_t
|
|||||||
UNUSED(offset);
|
UNUSED(offset);
|
||||||
try {
|
try {
|
||||||
auto entries = _fs->readDir(path);
|
auto entries = _fs->readDir(path);
|
||||||
struct stat stbuf;
|
struct stat stbuf{};
|
||||||
for (const auto &entry : *entries) {
|
for (const auto &entry : *entries) {
|
||||||
//We could pass more file metadata to filler() in its third parameter,
|
//We could pass more file metadata to filler() in its third parameter,
|
||||||
//but it doesn't help performance since fuse ignores everything in stbuf
|
//but it doesn't help performance since fuse ignores everything in stbuf
|
||||||
|
@ -8,14 +8,14 @@
|
|||||||
|
|
||||||
namespace gitversion {
|
namespace gitversion {
|
||||||
struct VersionInfo {
|
struct VersionInfo {
|
||||||
bool isDevVersion;
|
bool isDevVersion = false;
|
||||||
bool isStableVersion;
|
bool isStableVersion = false;
|
||||||
std::string versionTag;
|
std::string versionTag;
|
||||||
std::string gitCommitId;
|
std::string gitCommitId;
|
||||||
std::string majorVersion;
|
std::string majorVersion;
|
||||||
std::string minorVersion;
|
std::string minorVersion;
|
||||||
std::string hotfixVersion;
|
std::string hotfixVersion;
|
||||||
unsigned int commitsSinceTag;
|
unsigned int commitsSinceTag = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class Parser final {
|
class Parser final {
|
||||||
|
@ -63,7 +63,7 @@ private:
|
|||||||
class OpenResource final {
|
class OpenResource final {
|
||||||
public:
|
public:
|
||||||
OpenResource(cpputils::unique_ref<Resource> resource): _resource(std::move(resource)), _refCount(0) {}
|
OpenResource(cpputils::unique_ref<Resource> resource): _resource(std::move(resource)), _refCount(0) {}
|
||||||
OpenResource(OpenResource &&rhs) = default;
|
OpenResource(OpenResource &&rhs) noexcept = default;
|
||||||
|
|
||||||
Resource *getReference() {
|
Resource *getReference() {
|
||||||
++_refCount;
|
++_refCount;
|
||||||
|
Loading…
Reference in New Issue
Block a user