Created
November 4, 2023 12:19
-
-
Save menangen/2e65d82f52f261e21006e8f121203617 to your computer and use it in GitHub Desktop.
Modern C++ class based Stack Iterator
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> | |
struct AdditionModule { | |
const char * name = "ADD"; | |
void print() { | |
std::cout << name << "\n"; | |
}; | |
}; | |
struct MinusModule { | |
const char * name = "MINUS"; | |
void print() { | |
std::cout << name << "\n"; | |
}; | |
}; | |
struct Module { | |
enum { EMPTY, ADD, MINUS } tag; | |
union { | |
AdditionModule addition; | |
MinusModule minus; | |
}; | |
Module() { | |
this -> tag = Module::EMPTY; | |
} | |
Module(AdditionModule m) { | |
this -> tag = Module::ADD; | |
this -> addition = m; | |
} | |
Module(MinusModule m) { | |
this -> tag = Module::MINUS; | |
this -> minus = m; | |
} | |
void | |
print() { | |
switch(this -> tag) | |
{ | |
case Module::EMPTY: std::cout << "EMPTY" << "\n"; break; | |
case Module::ADD: this -> addition.print(); break; | |
case Module::MINUS: this -> minus.print(); break; | |
} | |
} | |
}; | |
struct Stack { | |
struct Iter { | |
Iter& operator++ () { --ptr; return *this; } | |
bool operator!= (Iter const& other) const { return ptr != other.ptr; } | |
Module& operator*() { return *ptr; } | |
Module * ptr; | |
}; | |
Iter begin() { return Iter{&modules[ size + 1 ]}; } | |
Iter end() { return Iter{&modules[-1]}; } | |
Stack() { | |
auto m1 = AdditionModule(); | |
auto m2 = MinusModule(); | |
this -> modules[0] = m1; size++; | |
this -> modules[1] = m2; size++; | |
} | |
void | |
print() { | |
for (auto e: modules) | |
e.print(); | |
} | |
private: | |
Module modules[4] = {}; | |
size_t size = 0; | |
}; | |
int main(int argc, const char * argv[]) { | |
std::cout << "Hello, Module!\n\n"; | |
auto S = Stack(); | |
for ( auto m: S ) { | |
m.print(); | |
} | |
return 0; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment