Created
September 1, 2020 04:54
-
-
Save tame-64/4ea886e89d62d60ab5345201d51ada15 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <list> | |
#include <vector> | |
#include "range.h" | |
template <typename T> | |
struct printer; | |
template <> struct printer<bool> { | |
bool value; | |
printer(bool v) : value{ v } { } | |
static friend std::ostream& operator<<(std::ostream& os, const printer& val) { | |
return os << (val.value == true ? "true" : "false"); | |
} | |
}; | |
int main() | |
{ | |
using namespace tame; | |
// increment from 0 to 9 | |
std::cout << "increment from 0 to 9:" << std::endl; | |
for (auto n : range(10)) std::cout << n, std::cout << " "; | |
std::cout << "\n\n"; | |
// increment from 7 to 17 | |
std::cout << "increment from 7 to 17:" << std::endl; | |
for (auto n : range(7, 18)) std::cout << n, std::cout << " "; | |
std::cout << "\n\n"; | |
// increment from 20 to 40, step 2 numbers... 40 is excluded | |
std::cout << "increment from 20 to 40; 40 is excluded:" << std::endl; | |
for (auto n : range(20, 40, 2)) std::cout << n, std::cout << " "; | |
std::cout << "\n\n"; | |
// decrement numbers | |
std::cout << "decrement from 10 to 0; 0 is excluded (notice negatve value for step):" << std::endl; | |
for (auto n : range(10, 0, -1)) std::cout << n, std::cout << " "; | |
std::cout << "\n\n"; | |
std::cout << "range object: range(20, 40, 2)" << std::endl; | |
auto range1 = range(20, 40, 2); | |
std::cout << "range is empty: " << printer<bool>{ range1.empty() } << std::endl; | |
std::cout << "range size: " << range1.size() << std::endl; | |
std::cout << "first element: " << range1.front() << std::endl; | |
std::cout << "last element: " << range1.back() << std::endl; | |
std::cout << "0th element: " << range1.at(0) << std::endl; | |
std::cout << "5th element: " << range1[5] << std::endl; | |
std::cout << "start: " << range1.start() << std::endl; | |
std::cout << "stop: " << range1.stop() << std::endl; | |
std::cout << "step: " << range1.step() << std::endl; | |
std::cout << "invalid index return stop value." << std::endl; | |
std::cout << "range[90]: " << range1[90] << std::endl; | |
std::cout << "\n>> iterator <<" << std::endl; | |
std::cout << "*range.begin(): " << *range1.begin() << std::endl; | |
std::cout << "*range.end(): " << *range1.end() << std::endl; | |
std::cout << "*(range.begin() + 3): " << *(range1.begin() + 3) << std::endl; | |
std::cout << "*(++range.begin()): " << *(++range1.begin()) << std::endl; | |
std::cout << "invalid iterator derefenced to stop value. " << std::endl | |
<< "and its internal index points to end." << std::endl; | |
auto invalid = range1.begin() + 90; | |
std::cout << "auto invalid = range.begin() + 90: " << std::endl; | |
std::cout << "*invalid: " << *invalid << std::endl; | |
std::cout << "*(invalid - 2): " << *(invalid - 2) << std::endl; | |
std::cout << "as stated before, any invalid iterator points to end." << std::endl; | |
std::cout << "*(invalid - 90): " << *(invalid - 90) << std::endl; | |
std::cout << "\n>> reverse iterator <<" << std::endl; | |
std::cout << "*range.rbegin(): " << *range1.rbegin() << std::endl; | |
std::cout << "*range.rend(): " << *range1.rend() << std::endl; | |
std::cout << "*(++range.rbegin()): " << *(++range1.rbegin()) << std::endl; | |
std::cout << "iterating through reverse iterator: " << std::endl; | |
for (auto it = range1.rbegin(); it != range1.rend(); ++it) { | |
std::cout << *it << " "; | |
} | |
std::cout << std::endl; | |
std::cout << "\nworking with STL:" << std::endl; | |
std::cout << "\ninitializing vector with range object: " << std::endl; | |
std::vector<int> vector{ range1.begin(), range1.end() }; | |
std::cout << "vector contain: "; | |
for (auto i : vector) std::cout << i << " "; | |
std::cout << std::endl; | |
std::cout << "\ninitializing list with range object: " << std::endl; | |
std::list<int> list{ range1.begin(), range1.end() }; | |
std::cout << "list contain: "; | |
for (auto i : list) std::cout << i << " "; | |
std::cout << std::endl; | |
std::cout << "\nrange with different type resolved using std::common_type." << std::endl; | |
auto range2 = range(20, 30, 0.5); | |
std::cout << "auto range2 = range(20, 30, 0.5);" << std::endl; | |
for (auto n : range2) std::cout << n, std::cout << " "; | |
std::cout << "\n\n"; | |
std::cout << "or use the range function in strict namespace to constraint into single type." << std::endl; | |
auto range3 = strict::range(20.0, 30.0, 0.5); | |
std::cout << "auto range3 = strict::range(20.0, 30.0, 0.5);" << std::endl; | |
for (auto n : range3) std::cout << n, std::cout << " "; | |
std::cout << "\n\n"; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment