Don't use std::map and Container to store DC OptionStat.
This commit is contained in:
parent
0761329c61
commit
29a8e8062b
@ -23,7 +23,7 @@
|
||||
namespace td {
|
||||
|
||||
void DcOptionsSet::add_dc_options(DcOptions dc_options) {
|
||||
std::vector<DcOptionId> new_ordered_options;
|
||||
vector<DcOptionId> new_ordered_options;
|
||||
for (auto &option : dc_options.dc_options) {
|
||||
auto *info = register_dc_option(std::move(option));
|
||||
new_ordered_options.push_back(DcOptionId{info->pos});
|
||||
@ -55,8 +55,8 @@ vector<DcOptionsSet::ConnectionInfo> DcOptionsSet::find_all_connections(DcId dc_
|
||||
bool only_http) {
|
||||
LOG(DEBUG) << "Find all " << (allow_media_only ? "media " : "") << "connections in " << dc_id
|
||||
<< ". use_static = " << use_static << ", prefer_ipv6 = " << prefer_ipv6 << ", only_http = " << only_http;
|
||||
std::vector<ConnectionInfo> options;
|
||||
std::vector<ConnectionInfo> static_options;
|
||||
vector<ConnectionInfo> options;
|
||||
vector<ConnectionInfo> static_options;
|
||||
|
||||
if (prefer_ipv6) {
|
||||
use_static = false;
|
||||
@ -188,15 +188,19 @@ DcOptionsSet::DcOptionInfo *DcOptionsSet::register_dc_option(DcOption &&option)
|
||||
|
||||
void DcOptionsSet::init_option_stat(DcOptionInfo *option_info) {
|
||||
const auto &ip_address = option_info->option.get_ip_address();
|
||||
auto it_ok = option_to_stat_id_.emplace(ip_address, 0);
|
||||
if (it_ok.second) {
|
||||
it_ok.first->second = option_stats_.create(make_unique<OptionStat>());
|
||||
for (size_t i = 0; i < option_stats_.size(); i++) {
|
||||
if (option_stats_[i].first == ip_address) {
|
||||
option_info->stat_id = i;
|
||||
return;
|
||||
}
|
||||
}
|
||||
option_info->stat_id = it_ok.first->second;
|
||||
option_stats_.emplace_back(ip_address, make_unique<OptionStat>());
|
||||
option_info->stat_id = option_stats_.size() - 1;
|
||||
}
|
||||
|
||||
DcOptionsSet::OptionStat *DcOptionsSet::get_option_stat(const DcOptionInfo *option_info) {
|
||||
return option_stats_.get(option_info->stat_id)->get();
|
||||
CHECK(option_info->stat_id < option_stats_.size());
|
||||
return option_stats_[option_info->stat_id].second.get();
|
||||
}
|
||||
|
||||
} // namespace td
|
||||
|
@ -10,12 +10,11 @@
|
||||
#include "td/telegram/net/DcOptions.h"
|
||||
|
||||
#include "td/utils/common.h"
|
||||
#include "td/utils/Container.h"
|
||||
#include "td/utils/port/IPAddress.h"
|
||||
#include "td/utils/Status.h"
|
||||
#include "td/utils/Time.h"
|
||||
|
||||
#include <map>
|
||||
#include <utility>
|
||||
|
||||
namespace td {
|
||||
|
||||
@ -79,8 +78,8 @@ class DcOptionsSet {
|
||||
|
||||
struct DcOptionInfo {
|
||||
DcOption option;
|
||||
int64 stat_id = -1;
|
||||
size_t pos;
|
||||
size_t stat_id = static_cast<size_t>(-1);
|
||||
size_t pos = 0;
|
||||
size_t order = 0;
|
||||
|
||||
DcOptionInfo(DcOption &&option, size_t pos) : option(std::move(option)), pos(pos) {
|
||||
@ -88,7 +87,7 @@ class DcOptionsSet {
|
||||
};
|
||||
|
||||
struct DcOptionId {
|
||||
size_t pos;
|
||||
size_t pos = 0;
|
||||
auto as_tie() const {
|
||||
return pos;
|
||||
}
|
||||
@ -100,10 +99,9 @@ class DcOptionsSet {
|
||||
}
|
||||
};
|
||||
|
||||
std::vector<unique_ptr<DcOptionInfo>> options_;
|
||||
std::vector<DcOptionId> ordered_options_;
|
||||
std::map<IPAddress, int64> option_to_stat_id_;
|
||||
Container<unique_ptr<OptionStat>> option_stats_;
|
||||
vector<unique_ptr<DcOptionInfo>> options_;
|
||||
vector<DcOptionId> ordered_options_;
|
||||
vector<std::pair<IPAddress, unique_ptr<OptionStat>>> option_stats_;
|
||||
|
||||
DcOptionInfo *register_dc_option(DcOption &&option);
|
||||
void init_option_stat(DcOptionInfo *option_info);
|
||||
|
Loading…
Reference in New Issue
Block a user