add sort and max

This commit is contained in:
chatlanin 2024-08-20 13:01:31 +03:00
commit 2cc6a75ba6
10 changed files with 201 additions and 0 deletions

2
.gitignore vendored Executable file
View File

@ -0,0 +1,2 @@
build
.cache

2
README.md Executable file
View File

@ -0,0 +1,2 @@
mt - набор разнообразных математических решений на с++
Часть перенесена сюда из hack (https://gitcast.ru/chatlanin/hack)

View File

@ -0,0 +1,33 @@
#include <vector>
#include <forward_list>
#include <iostream>
#include "mt/algorithms/sort.hpp"
#include "mt/algorithms/max.hpp"
auto main(int argc, char *argv[]) -> int
{
{ // sort
std::vector<int> v { 4, 4, 6, 1, 4, 3, 2 };
std::forward_list<int> l { 8, 7, 5, 9, 0, 1, 3, 2, 6, 4 };
mt::algorithms::sort(v);
mt::algorithms::sort(l);
for (auto d : v)
std::cout << d << " ";
std::cout << std::endl;
for (auto d : l)
std::cout << d << " ";
std::cout << std::endl;
}
{
// max
int a = 4, b = 5;
int& c = a;
std::cout << mt::algorithms::max(4, 5) << std::endl;
std::cout << mt::algorithms::max(c, b) << std::endl;
}
}

35
meson.build Executable file
View File

@ -0,0 +1,35 @@
project(
meson.current_source_dir().split('/').get(-1),
'cpp',
version : run_command('git', 'rev-parse', '--short', 'HEAD', check: false).stdout().strip(),
default_options : [
'warning_level=1',
'optimization=3',
'cpp_std=c++20',
])
add_project_arguments (
'-Wpedantic',
'-Wno-shadow',
'-Wno-unused-but-set-variable',
'-Wno-comment',
'-Wno-unused-parameter',
'-Wno-unused-value',
'-Wno-unused-header',
'-Wno-missing-field-initializers',
'-Wno-narrowing',
'-Wno-deprecated-enum-enum-conversion',
'-Wno-volatile',
'-Wno-format-security',
'-Wno-switch',
'-Wno-ignored-attributes',
'-Wno-unused-variable',
language: 'cpp'
)
args = []
inc = []
deps = []
subdir('src')
subdir('tests')

21
run.sh Executable file
View File

@ -0,0 +1,21 @@
#!/bin/zsh
PROJECT_NAME=$(basename $PWD)
run() {
command meson compile -C build
if [[ -z "$1" ]]; then
cd build
./tests/$PROJECT_NAME
cd ..
else
meson test $1 -C build
fi
}
if [ -d "build" ]; then
run
else
command meson setup build
run
fi

24
src/meson.build Executable file
View File

@ -0,0 +1,24 @@
inc += include_directories('.')
headers = [
'mt/algorithms/sort.hpp',
'mt/algorithms/max.hpp',
]
sources = []
lib = library(
meson.project_name(),
include_directories : inc,
sources: [headers, sources],
dependencies : deps,
cpp_args: args
)
hack_dep = declare_dependency(
include_directories: inc,
link_with: lib,
)
deps += hack_dep

16
src/mt/algorithms/max.hpp Executable file
View File

@ -0,0 +1,16 @@
#pragma once
#include <type_traits>
#include <algorithm>
namespace mt::algorithms
{
// std::common_type_t - делает сравнение по правилу тенарного оператора
// и выводит низводящий возвращающий тип. Т.е. если в качестве одного из
// параметров передалась ссылка, то произойдет низведление до типа ссылки
template<typename T, typename U, typename RT = std::common_type_t<T, U>>
inline RT max(T a, U b)
{
return std::max(a, b);
}
}

View File

@ -0,0 +1,28 @@
#pragma once
#include <algorithm>
namespace mt::algorithms
{
// общая сортировка диапозонов, у кого-то есть своя локалная сортировка, а у кого-то
// нет. А тут чтоб не реализовывать, есть общая.
template<typename Range>
void sort_imp(Range& r, long)
{
std::sort(std::begin(r), std::end(r));
}
template<typename Range, typename = decltype(std::declval<Range&>().sort())>
auto sort_imp(Range& r, int) -> void
{
r.sort();
}
template<typename Range>
void sort(Range& r)
{
sort_imp(r, 0);
}
}

33
tests/main.cpp Normal file
View File

@ -0,0 +1,33 @@
#include <vector>
#include <forward_list>
#include <iostream>
#include "mt/algorithms/sort.hpp"
#include "mt/algorithms/max.hpp"
auto main(int argc, char *argv[]) -> int
{
{ // sort
std::vector<int> v { 4, 4, 6, 1, 4, 3, 2 };
std::forward_list<int> l { 8, 7, 5, 9, 0, 1, 3, 2, 6, 4 };
mt::algorithms::sort(v);
mt::algorithms::sort(l);
for (auto d : v)
std::cout << d << " ";
std::cout << std::endl;
for (auto d : l)
std::cout << d << " ";
std::cout << std::endl;
}
{
// max
int a = 4, b = 5;
int& c = a;
std::cout << mt::algorithms::max(4, 5) << std::endl;
std::cout << mt::algorithms::max(c, b) << std::endl;
}
}

7
tests/meson.build Executable file
View File

@ -0,0 +1,7 @@
executable(
meson.project_name(),
'main.cpp',
dependencies : deps,
cpp_args: args,
include_directories : inc
)