45e855f89d
I can't maintain anymore this amount of features while keeping the library constantly updated and without bugs. Every merge was taking me multiple hours of revisioning the code. I give up. From this commit onwards TDLight will only have small useful customizations that are easy to maintain. Now the people relying on the OptimizeMemory method can restart the session every N hours to free up the memory. The real way to keep a low memory usage must involve a huge refactoring to allow the unloading of the caches into the sqlite database, similar to what's already happening with messages data. Only Levlam has the ability to implement this without needing to merge the upstream everytime.
92 lines
2.1 KiB
C++
92 lines
2.1 KiB
C++
//
|
|
// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2021
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
#pragma once
|
|
|
|
#include "td/telegram/Version.h"
|
|
|
|
#include "td/utils/common.h"
|
|
#include "td/utils/StringBuilder.h"
|
|
|
|
#include <functional>
|
|
#include <type_traits>
|
|
|
|
namespace td {
|
|
|
|
class UserId {
|
|
int64 id = 0;
|
|
|
|
public:
|
|
static constexpr int64 MAX_USER_ID = (1ll << 40) - 1;
|
|
|
|
UserId() = default;
|
|
|
|
explicit UserId(int64 user_id) : id(user_id) {
|
|
}
|
|
template <class T, typename = std::enable_if_t<std::is_convertible<T, int64>::value>>
|
|
UserId(T user_id) = delete;
|
|
|
|
static vector<UserId> get_user_ids(const vector<int64> &input_user_ids) {
|
|
vector<UserId> user_ids;
|
|
user_ids.reserve(input_user_ids.size());
|
|
for (auto &input_user_id : input_user_ids) {
|
|
user_ids.emplace_back(input_user_id);
|
|
}
|
|
return user_ids;
|
|
}
|
|
|
|
static vector<int64> get_input_user_ids(const vector<UserId> &user_ids) {
|
|
vector<int64> input_user_ids;
|
|
input_user_ids.reserve(user_ids.size());
|
|
for (auto &user_id : user_ids) {
|
|
input_user_ids.emplace_back(user_id.get());
|
|
}
|
|
return input_user_ids;
|
|
}
|
|
|
|
bool is_valid() const {
|
|
return 0 < id && id <= MAX_USER_ID;
|
|
}
|
|
|
|
int64 get() const {
|
|
return id;
|
|
}
|
|
|
|
bool operator==(const UserId &other) const {
|
|
return id == other.id;
|
|
}
|
|
|
|
bool operator!=(const UserId &other) const {
|
|
return id != other.id;
|
|
}
|
|
|
|
template <class StorerT>
|
|
void store(StorerT &storer) const {
|
|
storer.store_long(id);
|
|
}
|
|
|
|
template <class ParserT>
|
|
void parse(ParserT &parser) {
|
|
if (parser.version() >= static_cast<int32>(Version::Support64BitIds)) {
|
|
id = parser.fetch_long();
|
|
} else {
|
|
id = parser.fetch_int();
|
|
}
|
|
}
|
|
};
|
|
|
|
struct UserIdHash {
|
|
std::size_t operator()(UserId user_id) const {
|
|
return std::hash<int64>()(user_id.get());
|
|
}
|
|
};
|
|
|
|
inline StringBuilder &operator<<(StringBuilder &string_builder, UserId user_id) {
|
|
return string_builder << "user " << user_id.get();
|
|
}
|
|
|
|
} // namespace td
|