You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
2.6 KiB
C++
97 lines
2.6 KiB
C++
/*------------------------------------------------------------------------------
|
|
* Copyright (c) 2023 by Bai Bing (seread@163.com)
|
|
* S++ COPYING file for copying and redistribution conditions.
|
|
*
|
|
* Alians IT Studio.
|
|
*----------------------------------------------------------------------------*/
|
|
|
|
#include "ASSlice.h"
|
|
|
|
namespace ais
|
|
{
|
|
|
|
bool Slice::operator==(const Slice &otherSlice) const noexcept
|
|
{
|
|
return start == otherSlice.start && stop == otherSlice.stop && step == otherSlice.step;
|
|
}
|
|
|
|
bool Slice::operator!=(const Slice &otherSlice) const noexcept
|
|
{
|
|
return !(*this == otherSlice);
|
|
}
|
|
|
|
std::string Slice::str() const
|
|
{
|
|
std::string out =
|
|
"[" + std::to_string(start) + ":" + std::to_string(stop) + ":" + std::to_string(step) + "]\n";
|
|
return out;
|
|
}
|
|
|
|
void Slice::print() const
|
|
{
|
|
std::cout << *this;
|
|
}
|
|
|
|
void Slice::make_positive_and_validate(size_t arraySize)
|
|
{
|
|
/// convert the start value
|
|
if (start < 0)
|
|
{
|
|
start += arraySize;
|
|
}
|
|
|
|
if (start > (arraySize - 1))
|
|
{
|
|
throw std::invalid_argument("Invalid start value for array of size " + std::to_string(arraySize) +
|
|
".");
|
|
}
|
|
|
|
/// convert the stop value
|
|
if (stop < 0)
|
|
{
|
|
stop += arraySize;
|
|
}
|
|
if (stop > (arraySize))
|
|
{
|
|
throw std::invalid_argument("Invalid stop value for array of size " + std::to_string(arraySize) +
|
|
".");
|
|
}
|
|
|
|
/// do some error checking
|
|
if (start < stop)
|
|
{
|
|
if (step < 0)
|
|
{
|
|
throw std::invalid_argument("Invalid slice values [" + std::to_string(start) + ", " +
|
|
std::to_string(stop) + ", " + std::to_string(step) + ']');
|
|
}
|
|
}
|
|
|
|
if (stop < start)
|
|
{
|
|
if (step > 0)
|
|
{
|
|
throw std::invalid_argument("Invalid slice values [" + std::to_string(start) + ", " +
|
|
std::to_string(stop) + ", " + std::to_string(step) + ']');
|
|
}
|
|
|
|
/// otherwise flip things around for my own sanity
|
|
std::swap(start, stop);
|
|
step *= -1;
|
|
}
|
|
}
|
|
|
|
size_t Slice::element_number(size_t arraySize)
|
|
{
|
|
make_positive_and_validate(arraySize);
|
|
|
|
size_t num = 0;
|
|
for (size_t i = start; i < stop; i += step)
|
|
{
|
|
++num;
|
|
}
|
|
return num;
|
|
}
|
|
|
|
} // namespace ais
|