* use an XML schema, but some schema information, perhaps in another file, support C++ specific issues (e.g. does the data go into a list or a vector?)
* support both XML and binary data formats
* support both native-only (useful for IPC) and cross-platform formats
* support for "integrated header files" -- that is, rather than generating a C++ header, it should be possible to use an existing one (allowing you to customize it).
* support for complex data structures, including recursive structures. It should be possible to re-establish pointers, in other words.
To me, that would be the holy grail. It should probably be developed like the thread library, though -- start with core capabilities, then build on it over time.
I've love to take a gander at your code...
- Chuck Messenger
Scott Woods wrote:
Hi, Is anyone interested in a persistence mechanism? Rather than dumping a bunch of doc+code and finding that its just inappropriate, here is some summary stuff.
Technique uses info available in a variant to manage the type-safe transfer of data between an application and some external storage. It can be characterized as a replacement for the windows registry or unix profiles. The technique has following properties;
* generic - load and save operations are templates * portable - library and data are not platform dependent * standard types - bool, integer, float, string, etc * complex types - fixed dimension arrays and variable dimension vectors * user-defined types - records (a set of members of any type)
Simplest usage involves "hand-forming" the variants. This is a bit long-winded (and error-prone) so a "compiler" has been developed. This accepts a "schema" conforming to a grammer and outputs a set of C++ classes (cpp and header). The application can then derive application classes.
Given an application class "alarm_monitor" the schema might look like;
record sensor_signal { // Generated by raising the signal on an alarm sensor time when // Instant of detection string line // Expanded text void detail[] }
record monitor_store { // Persisted image of a monitored sensor integer number // Unique id integer status // Currently sensor_signal log[] // Rolling log of signals integer ring_count // Signal count since last ringing transition }
The application would derive "alarm_monitor" from "monitor_store" and a minimal ctor might look like;
alarm_monitor::alarm_monitor( const alarm_sensor &sensor ) : { try { // Recover the previously saved image of "this"
typed_load_file file( sensor.name );
load( file.begin(), *this ); } catch( typed_memory_not_found & ) { // No previous image. Set the members of "this" // to reasonable defaults and save an image
number = sensor.number; status = monitor_ready; ring_count = 0; log.clear();
typed_save_file file( sensor.name );
save( file.begin(), *this ); } // Resume normal operation }
Hope this is enough info. Code is currently getting a good workout (part of beta in a 24x7, server-type product). Example above is "para-phrased" to keep it short and to remove some confusing coding standards.
Thanks, Scott
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
_______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost