核心模板架构

This commit is contained in:
2026-08-04 16:24:41 +08:00
parent 68476882a3
commit f1b9cadd47
121 changed files with 4782 additions and 210 deletions
+38 -7
View File
@@ -237,14 +237,14 @@ void Spectrum_Private::update_frequency_point_size(int frequency_point_size, Ran
frequency[i] = cur;
}
}
void Spectrum_Private::set_frequency_data(std::pmr::vector<double>& line_data, const std::pmr::vector<double>* max_data, const std::pmr::vector<double>* min_data, const Spectrum_Render_State* s) {
void Spectrum_Private::set_frequency_data(const std::pmr::vector<double>& line_data, const std::pmr::vector<double>* max_data, const std::pmr::vector<double>* min_data, const Spectrum_Render_State* s) {
if (s->frequency_point_size <= 0)
return;
if (line_data.size() != s->frequency_point_size)
return;
if ((max_data && max_data->size() != s->frequency_point_size) || (min_data && min_data->size() != s->frequency_point_size))
return;
cur_powers.swap(line_data);
cur_powers.assign(line_data.begin(), line_data.end());
if (!has_power_data) {
max_powers.assign(cur_powers.begin(), cur_powers.end());
min_powers.assign(cur_powers.begin(), cur_powers.end());
@@ -449,36 +449,44 @@ void Spectrum::update_samples(std::span<const double> line_data) {
return;
Spectrum_Private* pd = d();
int frequency_point_size{};
Range frequency_range{};
Line_Interpolation_Mode interpolation_mode{};
bool use_max_line{};
bool use_min_line{};
{
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
frequency_point_size = state->frequency_point_size;
frequency_range = state->frequency_range;
interpolation_mode = state->interpolation_mode;
use_max_line = state->max_hold_visible;
use_min_line = state->min_hold_visible;
}
if (line_data.size() != frequency_point_size)
return;
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
input->push(line_data, use_max_line, use_min_line);
input->push(line_data, frequency_range, interpolation_mode, use_max_line, use_min_line);
}
void Spectrum::update_samples(std::pmr::vector<double>&& line_data) {
if (!ok())
return;
Spectrum_Private* pd = d();
int frequency_point_size{};
Range frequency_range{};
Line_Interpolation_Mode interpolation_mode{};
bool use_max_line{};
bool use_min_line{};
{
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
frequency_point_size = state->frequency_point_size;
frequency_range = state->frequency_range;
interpolation_mode = state->interpolation_mode;
use_max_line = state->max_hold_visible;
use_min_line = state->min_hold_visible;
}
if (line_data.size() != frequency_point_size)
return;
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
input->push(std::move(line_data), use_max_line, use_min_line);
input->push(std::move(line_data), frequency_range, interpolation_mode, use_max_line, use_min_line);
}
Update_Ticket Spectrum::submit_data(std::span<const double> line_data) {
auto update_state = make_update_state();
@@ -488,11 +496,15 @@ Update_Ticket Spectrum::submit_data(std::span<const double> line_data) {
}
Spectrum_Private* pd = d();
int frequency_point_size{};
Range frequency_range{};
Line_Interpolation_Mode interpolation_mode{};
bool use_max_line{};
bool use_min_line{};
{
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
frequency_point_size = state->frequency_point_size;
frequency_range = state->frequency_range;
interpolation_mode = state->interpolation_mode;
use_max_line = state->max_hold_visible;
use_min_line = state->min_hold_visible;
}
@@ -502,7 +514,7 @@ Update_Ticket Spectrum::submit_data(std::span<const double> line_data) {
}
{
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
input->push(line_data, use_max_line, use_min_line);
input->push(line_data, frequency_range, interpolation_mode, use_max_line, use_min_line);
input.set_completion(update_state);
}
update_state->complete_until(Update_Stage::Input_Released);
@@ -516,11 +528,15 @@ Update_Ticket Spectrum::submit_data(std::pmr::vector<double>&& line_data) {
}
Spectrum_Private* pd = d();
int frequency_point_size{};
Range frequency_range{};
Line_Interpolation_Mode interpolation_mode{};
bool use_max_line{};
bool use_min_line{};
{
Render_State_Lease<Spectrum_Private, Spectrum_Render_State> state(pd);
frequency_point_size = state->frequency_point_size;
frequency_range = state->frequency_range;
interpolation_mode = state->interpolation_mode;
use_max_line = state->max_hold_visible;
use_min_line = state->min_hold_visible;
}
@@ -530,7 +546,7 @@ Update_Ticket Spectrum::submit_data(std::pmr::vector<double>&& line_data) {
}
{
Render_Input_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
input->push(std::move(line_data), use_max_line, use_min_line);
input->push(std::move(line_data), frequency_range, interpolation_mode, use_max_line, use_min_line);
input.set_completion(update_state);
}
update_state->complete_until(Update_Stage::Input_Released);
@@ -605,6 +621,21 @@ void Spectrum::clear_marker_selection() {
edit->un_select();
}
double Spectrum::power_at(double frequency, bool& ok) {
return d()->get_y(frequency, ok, interpolation_mode());
Spectrum_Private* pd = d();
Render_Input_Read_Lease<Spectrum_Private, Spectrum_Input_Data> input(pd);
if (!input || !input->has_data) {
ok = false;
return -1.0;
}
const auto& powers = input->cur_data;
if (powers.size() < 2 || input->frequency_range.length() == 0.0 || !input->frequency_range.contains(frequency)) {
ok = false;
return -1.0;
}
double index = coordinate_to_source_index(input->frequency_range, powers.size(), frequency);
ok = true;
return interpolate_sample_value(index, powers.size(), input->interpolation_mode, [&powers](int i) {
return powers.at(i);
});
}
} // namespace renderive