68 lines
1.5 KiB
C++
Executable File
68 lines
1.5 KiB
C++
Executable File
// License: Modified MIT (NON-AI)
|
|
// See the LICENSE file in the root directory for license information.
|
|
// Copyright 2025 Timothy Prepscius
|
|
|
|
#pragma once
|
|
|
|
#include "Reversed.h"
|
|
#include <utility>
|
|
#include <cstddef>
|
|
|
|
namespace tjp {
|
|
namespace core {
|
|
|
|
template<typename T>
|
|
T reversed (T &&t)
|
|
{
|
|
T c(std::move(t));
|
|
for (auto i=0; i<c.size()/2; ++i)
|
|
std::swap(c[i], c[c.size()-(i+1)]);
|
|
|
|
return c;
|
|
}
|
|
|
|
template<typename T>
|
|
struct Reversed : T
|
|
{
|
|
typedef T Super;
|
|
typedef T Unreversed;
|
|
|
|
template<typename ...U>
|
|
Reversed(U&& ...u) : Super(u...)
|
|
{}
|
|
|
|
typedef typename Super::reverse_iterator iterator;
|
|
typedef typename Super::iterator reverse_iterator;
|
|
typedef typename Super::const_reverse_iterator const_iterator;
|
|
typedef typename Super::const_iterator const_reverse_iterator;
|
|
|
|
auto begin() { return Super::rbegin(); }
|
|
auto begin() const { return Super::rbegin(); }
|
|
auto end() { return Super::rend(); }
|
|
auto end() const { return Super::rend(); }
|
|
|
|
auto rbegin() { return Super::begin(); }
|
|
auto rbegin() const { return Super::begin(); }
|
|
auto rend() { return Super::end(); }
|
|
auto rend() const { return Super::end(); }
|
|
|
|
auto &back() { return Super::front(); }
|
|
auto &back() const { return Super::front(); }
|
|
auto &front() { return Super::back(); }
|
|
auto &front() const { return Super::back(); }
|
|
|
|
auto &operator[](size_t i)
|
|
{
|
|
return Super::operator[](Super::size()-1-i);
|
|
}
|
|
|
|
auto &operator[] (size_t i) const
|
|
{
|
|
return Super::operator[](Super::size()-1-i);
|
|
}
|
|
} ;
|
|
|
|
|
|
} // namespace utilities
|
|
} // namespace
|