//|_ _ _. _ ._ |_ _. _ | //| | (/_ (_| \/ (/_ | | | | (_| (_ |< #pragma once #include #include "fnv.h" extern void setting_save( const char* name, const void* src, U32 size ); extern void setting_load( const char* name, const void* dst, U32 size ); class SETTING_NODE { public: virtual void load() {}; virtual void save() {}; virtual FNV1A get_hash() { return {}; }; }; template class SETTING; class SETTING_HOLDER : SETTING_NODE { public: SETTING_HOLDER() = default; SETTING_HOLDER( SETTING_HOLDER* other ) { other->register_( this ); } void register_( SETTING_NODE* node ) { nodes.push_back( node ); } void save() override { for( auto& it : nodes ) it->save(); } void load() override { for( auto& it : nodes ) it->load(); } template SETTING* find( FNV1A hash ) { for( auto it : nodes ) { if( it->get_hash() == hash ) return (SETTING*)(it); } return 0; } private: VECTOR nodes; }; template < typename t > class SETTING : SETTING_NODE { public: SETTING( SETTING_HOLDER* owner, const char* name, t _default = t{} ) : m_owner( owner ), m_name( name ), v( _default ), m_hash( fnv1a( name ) ) { owner->register_( this ); }; __forceinline SETTING( const SETTING& other ) : v( other.v ) {} __forceinline SETTING( const t& other ) : v( other ) {} void save() override { setting_save( m_name, &v, sizeof( t ) ); } void load() override { setting_load( m_name, &v, sizeof( t ) ); } FNV1A get_hash() override { return m_hash; } operator t&() { return v; } t* operator&() { return &v; } t v; private: SETTING_HOLDER* m_owner; const char* m_name; FNV1A m_hash; };