123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #ifndef RTTR_LIBRARY_P_H_
- #define RTTR_LIBRARY_P_H_
- #include "rttr/detail/base/core_prerequisites.h"
- #include "rttr/string_view.h"
- #include "rttr/type.h"
- #include "rttr/property.h"
- #include "rttr/method.h"
- #include "rttr/detail/registration/registration_state_saver.h"
- #if RTTR_PLATFORM == RTTR_PLATFORM_WINDOWS
- #include <windows.h>
- #endif
- #include <atomic>
- namespace rttr
- {
- namespace detail
- {
- class RTTR_LOCAL library_private
- {
- public:
- library_private(string_view file_name, string_view version)
- : m_file_name(file_name),
- m_version(version),
- m_load_count(0),
- m_handle(nullptr)
- {
- }
- ~library_private() = default;
- bool load()
- {
- if (m_handle)
- {
- ++m_load_count;
- return true;
- }
- m_state_saver.save_state_begin();
- auto result = load_native();
- if (result)
- {
- ++m_load_count;
- m_state_saver.save_state_end();
- }
- else
- {
- m_state_saver.reset();
- }
- return result;
- }
- bool unload()
- {
- if (!m_handle)
- return false;
- --m_load_count;
- if (m_load_count.load() == 0)
- {
- auto ret = unload_native();
- if (ret)
- {
- m_error_string.clear();
- m_state_saver.reset();
- m_handle = nullptr;
- }
- }
- return (m_handle == nullptr);
- }
-
- bool is_loaded() const RTTR_NOEXCEPT { return (m_handle != nullptr); }
- string_view get_error_string() const RTTR_NOEXCEPT { return m_error_string; }
- string_view get_file_name() const RTTR_NOEXCEPT { return m_file_name; }
- string_view get_qualified_filename() const RTTR_NOEXCEPT { return m_qualifed_file_name; }
-
- array_range<type> get_types() const RTTR_NOEXCEPT { return m_state_saver.get_types(); }
- array_range<property> get_global_properties() const RTTR_NOEXCEPT { return m_state_saver.get_global_properties(); }
- array_range<method> get_global_methods() const RTTR_NOEXCEPT { return m_state_saver.get_global_methods(); }
- int get_load_count() const RTTR_NOEXCEPT { return m_load_count.load(); }
- void set_load_count(int count) { m_load_count.store(count); }
- private:
- bool load_native();
- bool unload_native();
- private:
- std::string m_file_name;
- std::string m_version;
- std::string m_qualifed_file_name;
- std::string m_error_string;
- registration_state_saver m_state_saver;
- std::atomic_int m_load_count;
- #if RTTR_PLATFORM == RTTR_PLATFORM_WINDOWS
- HMODULE
- #else
- void*
- #endif
- m_handle;
- };
- }
- }
- #endif
|