Skip to content

Instantly share code, notes, and snippets.

@tame-64
Created September 1, 2020 04:54
Show Gist options
  • Save tame-64/4ea886e89d62d60ab5345201d51ada15 to your computer and use it in GitHub Desktop.
Save tame-64/4ea886e89d62d60ab5345201d51ada15 to your computer and use it in GitHub Desktop.
#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