Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /** Copyright (C) 2014 Josh Ventura
- ***
- *** This file is a part of the ENIGMA Development Environment.
- ***
- *** ENIGMA is free software: you can redistribute it and/or modify it under the
- *** terms of the GNU General Public License as published by the Free Software
- *** Foundation, version 3 of the license or any later version.
- ***
- *** This application and its source code is distributed AS-IS, WITHOUT ANY
- *** WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- *** FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- *** details.
- ***
- *** You should have received a copy of the GNU General Public License along
- *** with this code. If not, see <http://www.gnu.org/licenses/>
- **/
- #include <iostream>
- // =====================================================================
- // == Up-front installation ============================================
- // =====================================================================
- namespace enigma {
- struct reference_index {
- int id;
- reference_index(int idx): id(idx) {}
- enum { DNE = -1 };
- };
- template<class T> struct derived_reference_index: reference_index {
- derived_reference_index(): reference_index(-1) {}
- derived_reference_index(int idx): reference_index(idx) {}
- };
- namespace RTTI {
- template<class T> int compiler_ids();
- }
- }
- // =====================================================================
- // == Declaring types ==================================================
- // =====================================================================
- namespace enigma {
- namespace RTTI {
- struct window_t {};
- struct button_t {};
- }
- }
- namespace enigma_user {
- struct window_t:
- enigma::derived_reference_index<enigma::RTTI::window_t> {
- window_t(int id): derived_reference_index(id) {}
- };
- struct button_t:
- enigma::derived_reference_index<enigma::RTTI::button_t> {
- button_t(int id): derived_reference_index(id) {}
- };
- }
- // =====================================================================
- // == Variant Extensions (Approximate) =================================
- // =====================================================================
- struct variant {
- int rtti;
- variant(int x): /* ... */ rtti(-1) { /* ... */ }
- variant(double x): /* ... */ rtti(-1) { /* ... */ }
- // ...
- template<class T> variant(const enigma::derived_reference_index<T>&):
- rtti(enigma::RTTI::compiler_ids<T>()) { /* ... */ }
- };
- // =====================================================================
- // == Compiler Codegen =================================================
- // =====================================================================
- namespace enigma {
- namespace RTTI {
- enum variant_runtime_types {
- VRT_WINDOW,
- VRT_BUTTON
- };
- template<> int compiler_ids<window_t>() { return VRT_WINDOW; }
- template<> int compiler_ids<button_t>() { return VRT_BUTTON; }
- }
- }
- // =====================================================================
- // == Simple Test Code =================================================
- // =====================================================================
- using namespace enigma_user;
- using namespace std;
- int main() {
- window_t wn = 20;
- button_t bt = 50;
- variant a(wn);
- variant b(10);
- variant c(10.5f);
- variant d(bt);
- cout << a.rtti << endl;
- cout << b.rtti << endl;
- cout << c.rtti << endl;
- cout << d.rtti << endl;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement