initial commit

This commit is contained in:
2026-02-16 19:47:03 +03:00
commit 1e06bb4dc7
27 changed files with 1786 additions and 0 deletions

60
src/utils/fvec/fvec.cpp Normal file
View File

@@ -0,0 +1,60 @@
#include "fvec.hpp"
#include <math.h>
#include <algorithm>
#include <hack/math/math.hpp>
#include <hack/logger/logger.hpp>
namespace hr
{
// Конструктор: создает вектор заданного размера, заполненный значением v
fvec_t::fvec_t(std::size_t size, base_t v) : m_data(size, v)
{
}
// Возвращает текущий размер вектора
std::size_t fvec_t::size() const
{
return m_data.size();
}
// Проверяет, пуст ли вектор
bool fvec_t::empty() const
{
return m_data.empty();
}
// Добавляет элемент в конец вектора
void fvec_t::push_back(const base_t& v)
{
m_data.push_back(v);
}
// Изменяет размер вектора, новые элементы заполняются значением el
void fvec_t::resize(std::size_t new_size, base_t el)
{
m_data.resize(new_size, el);
}
// Циклический сдвиг вектора: первая половина меняется местами со второй
// Пример: [1,2,3,4,5,6] -> [4,5,6,1,2,3]
// Для нечетных размеров: [1,2,3,4,5,6,7] -> [5,6,7,1,2,3,4]
// Алгоритм:
// 1. Основной сдвиг: меняем местами первую и вторую половины
// 2. Для нечетных размеров: корректируем средний элемент
void fvec_t::shift()
{
std::size_t half = size() / 2;
std::size_t start = half;
// Для нечетных размеров start будет на 1 больше half
if (2 * half < size()) ++start;
// Основной сдвиг: меняем первую половину со второй
for (size_t i = 0; i < half; ++i) std::swap(m_data[i], m_data[i + start]);
// Корректировка для нечетных размеров: сдвигаем средний элемент
if (half != start)
for (std::size_t i = 0; i < half; ++i)
std::swap(m_data[i + start - 1], m_data[i + start]);
}
}

44
src/utils/fvec/fvec.hpp Normal file
View File

@@ -0,0 +1,44 @@
#pragma once
#include "utils/using.hpp"
namespace hr
{
class fvec_t
{
public:
fvec_t() = default;
fvec_t(std::size_t size, base_t v);
fvec_t(const fvec_t&) = default;
fvec_t& operator=(const fvec_t&) = default;
fvec_t(fvec_t&&) noexcept = default;
fvec_t& operator=(fvec_t&&) noexcept = default;
~fvec_t() = default;
public:
// FOR READING
const base_t& operator[](std::size_t index) const { return m_data[index]; }
const base_t* data() const noexcept { return m_data.data(); }
auto begin() const noexcept { return m_data.begin(); }
auto end() const noexcept { return m_data.end(); }
public:
// FOR CHANGING
base_t* data() noexcept { return m_data.data(); }
std::vector<base_t>& src() noexcept { return m_data; }
base_t& operator[](std::size_t index) { return m_data[index]; }
auto begin() noexcept { return m_data.begin(); }
auto end() noexcept { return m_data.end(); }
public:
std::size_t size() const;
bool empty() const;
void push_back(const base_t& v);
void resize(std::size_t new_size, const base_t el);
void shift();
private:
std::vector<base_t> m_data;
};
}