Skip to content

Instantly share code, notes, and snippets.

View picanumber's full-sized avatar

Nikos Athanasiou picanumber

View GitHub Profile
@picanumber
picanumber / sorted_view_cpp17_sorted_element.cpp
Created January 11, 2017 14:22
Implementation of a binding element
template <class T>
struct sorted_element
{
std::remove_reference_t<T>* _data;
std::vector<std::size_t> const* _is;
sorted_element(T& elem, std::vector<std::size_t> const& is)
: _data(&elem), _is(&is)
{
}
@picanumber
picanumber / sorted_view_cpp17_structured_bindings.cpp
Last active January 11, 2017 14:20
Custom destructuring the sorted view
sorted_view sv(first_name, last_name, sport, medals_gold,
medals_silver, medals_bronze, medals_total);
auto [bName1, bName2, bSport, bGoldM, bSilverM, bBronzeM, bTotalM] = sv;
@picanumber
picanumber / sorted_view_cpp17_tad.cpp
Last active January 11, 2017 14:08
Template argument deduction for class templates
sorted_view sv1(first_name, last_name, sport, medals_gold, medals_silver);
sorted_view sv2(medals_bronze, medals_total);
@picanumber
picanumber / sorted_view_multisort_example.cpp
Created January 11, 2017 13:35
Sort based on total medals, then gold, then silver, the bronze
sv.multi_sort<9, 6, 7, 8>([](auto&& a, auto&& b) { return a > b; });
@picanumber
picanumber / sorted_view_multi_sort.cpp
Created January 11, 2017 13:26
Provides sorting with tie breakers
template <std::size_t I, std::size_t... Is, class F>
void multi_sort(F&& bop) const
{
using namespace std;
_is.resize(get<I>(_ts).size());
iota(begin(_is), end(_is), 0);
std::sort(begin(_is), end(_is), [&](size_t lhs, size_t rhs) {
return detail::use_comparator<I, Is...>::apply(
struct S {
int i;
S(int i) : i(i) {}
int size() { return 1; }
S(S const&) = delete;
S(S&&) = default;
};
int main()
{
@picanumber
picanumber / sorted_view_example.cpp
Created January 11, 2017 12:23
Showcase the use of sorted view
// 1. Create the sorted view
auto sv = make_sorted_view(first_name, last_name, country, sport,
years, gender, medals_gold, medals_silver, medals_bronze, medals_total);
sv.sort<0>(std::less<>{}); // 2. Sort by first name
for (size_t i = 0; i < sv.size<0>(); i++) printf("{ %s-%s-%s }\n",
sv.at<0>(i).c_str(), // 3. access the ith sorted element of sequence 0
sv.at<1>(i).c_str(),
sv.at<2>(i).c_str());
@picanumber
picanumber / sorted_view_at.cpp
Created January 11, 2017 12:05
Accesing the elements of a sorted view
template <std::size_t I>
decltype(auto) at(std::size_t pos)
{
return std::get<I>(_ts)[_is[pos]];
}
@picanumber
picanumber / sorted_view_sort.cpp
Created January 11, 2017 11:58
The sort member function of sorted_view
template <std::size_t I, class F>
void sort(F&& bop) const
{
using namespace std;
_is.resize(get<I>(_ts).size());
iota(begin(_is), end(_is), 0);
std::sort(begin(_is), end(_is), [&](size_t lhs, size_t rhs) {
return forward<F>(bop)(get<I>(_ts)[lhs], get<I>(_ts)[rhs]);
@picanumber
picanumber / make_sorted_view.cpp
Created January 11, 2017 11:52
creates a sorted view
template <class... Args>
auto make_sorted_view(Args&&... args)
{
return sorted_view<Args...>(std::forward<Args>(args)...);
}