1 /* 2 * InspIRCd -- Internet Relay Chat Daemon 3 * 4 * Copyright (C) 2019-2020 Sadie Powell <sadie@witchery.services> 5 * 6 * This file is part of InspIRCd. InspIRCd is free software: you can 7 * redistribute it and/or modify it under the terms of the GNU General Public 8 * License as published by the Free Software Foundation, version 2. 9 * 10 * This program is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 12 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 13 * details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 20 #pragma once 21 22 /** Base class for serializable elements. */ 23 class CoreExport Serializable 24 { 25 protected: Serializable()26 Serializable() { } 27 28 public: 29 /** Encapsulates a chunk of serialised data. */ 30 class CoreExport Data 31 { 32 public: 33 /** Maps keys to serialised data. */ 34 typedef insp::flat_map<std::string, Data> ChildMap; 35 36 /** Maps keys to simple values. */ 37 typedef insp::flat_map<std::string, std::string> EntryMap; 38 39 private: 40 /** A mapping of keys to serialised data. */ 41 ChildMap children; 42 43 /** A mapping of keys to values. */ 44 EntryMap entries; 45 46 public: 47 /** Retrieves the child elements. */ GetChildren()48 const ChildMap& GetChildren() const { return children; } GetChildren()49 ChildMap& GetChildren() { return children; } 50 51 /** Retrieves the key/value map. */ GetEntries()52 const EntryMap& GetEntries() const { return entries; } GetEntries()53 EntryMap& GetEntries() { return entries; } 54 55 /** Loads the serialised data with the specified key. 56 * @param key The key by which this serialised data is identified. 57 * @param out The location to store the serialised data for this key. 58 */ 59 Data& Load(const std::string& key, Data& out); 60 61 /** Loads the value with the specified key. 62 * @param key The key by which this data is identified. 63 * @param out The location to store the value for this key. 64 */ 65 Data& Load(const std::string& key, std::string& out); 66 67 /** Loads the value with the specified key. The value will be converted to the specified type. 68 * @param key The key by which this data is identified. 69 * @param out The location to store the value for this key. 70 */ 71 template <typename T> Load(const std::string & key,T & out)72 Data& Load(const std::string& key, T& out) 73 { 74 // Attempt to load as a string. 75 std::string str; 76 Load(key, str); 77 78 std::stringstream ss(str); 79 ss >> out; 80 return *this; 81 } 82 83 /** Stores the serialised data against the specified key. 84 * @param key The key by which this serialised data should be stored against. 85 * @param value The serialised data to store. 86 */ 87 Data& Store(const std::string& key, const Data& value); 88 89 /** Stores the value against the specified key. 90 * @param key The key by which this value should be stored against. 91 * @param value The value to store. 92 */ 93 Data& Store(const std::string& key, const std::string& value); 94 95 /** Stores the value against the specified key. The value will be converted to a string using ConvToStr. 96 * @param key The key by which this value should be stored against. 97 * @param value The value to store. 98 */ 99 template <typename T> Store(const std::string & key,const T & value)100 Data& Store(const std::string& key, const T& value) 101 { 102 return Store(key, ConvToStr(value)); 103 } 104 }; 105 106 /** Deserializes the specified Data instance into this object. 107 * @param data The Data object to deserialize from. 108 * @return True if the deserialisation succeeded; otherwise, false. 109 */ 110 virtual bool Deserialize(Data& data) = 0; 111 112 /** Serializes the this object into the specified Data object. 113 * @param data The Data object to serialize to. 114 * @return True if the serialisation succeeded; otherwise, false. 115 */ 116 virtual bool Serialize(Data& data) = 0; 117 }; 118