frodo
Frodo is a lightweight ring dependency framework (C++11).
Frodo is tiny, header-only, cross-platform.
Frodo is zlib/libpng licensed.
Rings are made of independant systems, subsystems, libraries, singletons, etc.
Inner rings provide functionality to outer rings.
Initialization and deinitialization of rings must follow strict order.
namespace frodo {
struct level {
std::string name;
std::function<bool ()> init;
std::function<bool ()> quit;
};
bool ring ( int lvl, const level &impl );
bool init ();
bool alive ();
bool reboot ( int lvl_target );
bool quit ();
}
#include " frodo.hpp"
#include < iostream>
namespace memory {
bool init () {
std::cout << " [ OK ] mem setup" << std::endl;
return true ;
}
bool quit () {
std::cout << " [ OK ] mem teardown" << std::endl;
return true ;
}
}
namespace logger {
bool init () {
std::cout << " [ OK ] logger setup" << std::endl;
return true ;
}
bool quit () {
std::cout << " [ OK ] logger teardown" << std::endl;
return true ;
}
}
namespace console {
bool init () {
std::cout << " [ OK ] console setup" << std::endl;
return true ;
}
bool quit () {
std::cout << " [ OK ] console teardown" << std::endl;
return true ;
}
}
int main () {
// app-defined levels
// 00 memory and hooks
frodo::ring ( 0 , { " memory" , memory::init, memory::quit } );
// 10 subsystems
frodo::ring ( 13 , { " logger" , logger::init, logger::quit } );
frodo::ring ( 14 , { " console" , console::init, console::quit } );
// 20 devices
// frodo::ring( 20, { "audio", audio::init, audio::quit } );
// frodo::ring( 25, { "data", data::init, data::quit } );
// frodo::ring( 27, { "input", input::init, input::quit } );
// 30 opengl
// frodo::ring( 34, { "ui", ui::init, ui::quit } );
// frodo::ring( 30, { "opengl", gl::init, gl::quit } );
// frodo::ring( 31, { "monitor", monitor::init, monitor::quit } );
// frodo::ring( 35, { "font", font::init, font::quit } );
// 40 game
// frodo::ring( 40, { "model", model::init, model::quit } );
// frodo::ring( 45, { "world", world::init, world::quit } );
// 50 ui
// frodo::ring( 59, { "help", help::init, help::quit } );
if ( frodo::init () ) {
// app starts here
std::string dummy;
std::cout << " Press any key to continue... (try aborting or killing app too)" << std::endl;
std::getline ( std::cin, dummy );
// shutdown
if ( frodo::quit () ) {
return 0 ;
}
}
return -1 ;
}
$frodo ./sample.out
[ OK ] mem setup
[ OK ] logger setup
[ OK ] console setup
Press any key to continue ... (try aborting or killing app too)
^C
[ OK ] console teardown
[ OK ] logger teardown
[ OK ] mem teardown
init({signal...})
reboot(lvl)
v1.0.1 (2016/04/11): No STL allocations; Implement reboot
v1.0.0 (2015/12/07): Header-only, simplified implementation
v0.0.0 (2015/08/03): Initial commit