1+ /*
2+ * Copyright (c) 2019 - 2022 Geode-solutions
3+ *
4+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5+ * of this software and associated documentation files (the "Software"), to deal
6+ * in the Software without restriction, including without limitation the rights
7+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+ * copies of the Software, and to permit persons to whom the Software is
9+ * furnished to do so, subject to the following conditions:
10+ *
11+ * The above copyright notice and this permission notice shall be included in
12+ * all copies or substantial portions of the Software.
13+ *
14+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20+ * SOFTWARE.
21+ *
22+ */
23+
24+ #pragma once
25+
26+ #include < geode/basic/common.h>
27+ #include < geode/basic/logger.h>
28+ #include < geode/basic/pimpl.h>
29+
30+ #include < geode/basic/identifier.h>
31+ #include < geode/basic/uuid.h>
32+
33+ namespace geode
34+ {
35+ class Identifier ;
36+ struct uuid ;
37+ } // namespace geode
38+
39+ namespace geode
40+ {
41+ class opengeode_basic_api Database
42+ {
43+ OPENGEODE_DISABLE_COPY ( Database );
44+ struct Storage ;
45+
46+ public:
47+ using serializer_function = std::function< void ( PContext& ) >;
48+
49+ class opengeode_basic_api Data
50+ {
51+ public:
52+ Data ( std::shared_ptr< Storage > storage );
53+ ~Data ();
54+ Data ( Data&& other );
55+
56+ template < typename DataType >
57+ const DataType& get ()
58+ {
59+ const auto & typed_data =
60+ dynamic_cast < const DataType& >( data () );
61+ return typed_data;
62+ }
63+
64+ private:
65+ const Identifier& data () const ;
66+
67+ private:
68+ IMPLEMENTATION_MEMBER ( impl_ );
69+ };
70+
71+ public:
72+ Database ( absl::string_view directory );
73+ ~Database ();
74+
75+ index_t nb_data () const ;
76+
77+ template < typename DataType >
78+ const uuid& register_data ( DataType&& data )
79+ {
80+ static_assert ( std::is_base_of< Identifier, DataType >::value,
81+ " [Database::register_data] Data is not a subclass of "
82+ " Identifier" );
83+ return register_unique_data (
84+ absl::make_unique< DataType >( std::move ( data ) ) );
85+ }
86+
87+ template < typename DataType >
88+ const uuid& register_data ( std::unique_ptr< DataType >&& data )
89+ {
90+ static_assert ( std::is_base_of< Identifier, DataType >::value,
91+ " [Database::register_data] Data is not a subclass of "
92+ " Identifier" );
93+ return register_unique_data ( std::move ( data ) );
94+ }
95+
96+ void delete_data ( const uuid& id );
97+
98+ Data get_data ( const uuid& id ) const ;
99+
100+ std::unique_ptr< Identifier > take_data ( const uuid& id );
101+
102+ void register_serializer_functions (
103+ serializer_function serializer, serializer_function deserializer );
104+
105+ private:
106+ const uuid& register_unique_data (
107+ std::unique_ptr< Identifier >&& data );
108+
109+ private:
110+ IMPLEMENTATION_MEMBER ( impl_ );
111+ };
112+ } // namespace geode
0 commit comments