1*9712c20fSFrederick Mayle // Copyright 2010 Google LLC 2*9712c20fSFrederick Mayle // 3*9712c20fSFrederick Mayle // Redistribution and use in source and binary forms, with or without 4*9712c20fSFrederick Mayle // modification, are permitted provided that the following conditions are 5*9712c20fSFrederick Mayle // met: 6*9712c20fSFrederick Mayle // 7*9712c20fSFrederick Mayle // * Redistributions of source code must retain the above copyright 8*9712c20fSFrederick Mayle // notice, this list of conditions and the following disclaimer. 9*9712c20fSFrederick Mayle // * Redistributions in binary form must reproduce the above 10*9712c20fSFrederick Mayle // copyright notice, this list of conditions and the following disclaimer 11*9712c20fSFrederick Mayle // in the documentation and/or other materials provided with the 12*9712c20fSFrederick Mayle // distribution. 13*9712c20fSFrederick Mayle // * Neither the name of Google LLC nor the names of its 14*9712c20fSFrederick Mayle // contributors may be used to endorse or promote products derived from 15*9712c20fSFrederick Mayle // this software without specific prior written permission. 16*9712c20fSFrederick Mayle // 17*9712c20fSFrederick Mayle // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18*9712c20fSFrederick Mayle // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19*9712c20fSFrederick Mayle // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20*9712c20fSFrederick Mayle // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21*9712c20fSFrederick Mayle // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22*9712c20fSFrederick Mayle // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23*9712c20fSFrederick Mayle // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*9712c20fSFrederick Mayle // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*9712c20fSFrederick Mayle // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*9712c20fSFrederick Mayle // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27*9712c20fSFrederick Mayle // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*9712c20fSFrederick Mayle // 29*9712c20fSFrederick Mayle // map_serializers.h: defines templates for serializing std::map and its 30*9712c20fSFrederick Mayle // wrappers: AddressMap, RangeMap, and ContainedRangeMap. 31*9712c20fSFrederick Mayle // 32*9712c20fSFrederick Mayle // Author: Siyang Xie ([email protected]) 33*9712c20fSFrederick Mayle 34*9712c20fSFrederick Mayle 35*9712c20fSFrederick Mayle #ifndef PROCESSOR_MAP_SERIALIZERS_H__ 36*9712c20fSFrederick Mayle #define PROCESSOR_MAP_SERIALIZERS_H__ 37*9712c20fSFrederick Mayle 38*9712c20fSFrederick Mayle #include <map> 39*9712c20fSFrederick Mayle #include <string> 40*9712c20fSFrederick Mayle 41*9712c20fSFrederick Mayle #include "processor/simple_serializer.h" 42*9712c20fSFrederick Mayle 43*9712c20fSFrederick Mayle #include "processor/address_map-inl.h" 44*9712c20fSFrederick Mayle #include "processor/range_map-inl.h" 45*9712c20fSFrederick Mayle #include "processor/contained_range_map-inl.h" 46*9712c20fSFrederick Mayle 47*9712c20fSFrederick Mayle namespace google_breakpad { 48*9712c20fSFrederick Mayle 49*9712c20fSFrederick Mayle // StdMapSerializer allocates memory and serializes an std::map instance into a 50*9712c20fSFrederick Mayle // chunk of memory data. 51*9712c20fSFrederick Mayle template<typename Key, typename Value> 52*9712c20fSFrederick Mayle class StdMapSerializer { 53*9712c20fSFrederick Mayle public: 54*9712c20fSFrederick Mayle // Calculate the memory size of serialized data. 55*9712c20fSFrederick Mayle size_t SizeOf(const std::map<Key, Value>& m) const; 56*9712c20fSFrederick Mayle 57*9712c20fSFrederick Mayle // Writes the serialized data to memory with start address = dest, 58*9712c20fSFrederick Mayle // and returns the "end" of data, i.e., return the address follow the final 59*9712c20fSFrederick Mayle // byte of data. 60*9712c20fSFrederick Mayle // NOTE: caller has to allocate enough memory before invoke Write() method. 61*9712c20fSFrederick Mayle char* Write(const std::map<Key, Value>& m, char* dest) const; 62*9712c20fSFrederick Mayle 63*9712c20fSFrederick Mayle // Serializes a std::map object into a chunk of memory data with format 64*9712c20fSFrederick Mayle // described in "StaticMap.h" comment. 65*9712c20fSFrederick Mayle // Returns a pointer to the serialized data. If size != NULL, *size is set 66*9712c20fSFrederick Mayle // to the size of serialized data, i.e., SizeOf(m). 67*9712c20fSFrederick Mayle // Caller has the ownership of memory allocated as "new char[]". 68*9712c20fSFrederick Mayle char* Serialize(const std::map<Key, Value>& m, unsigned int* size) const; 69*9712c20fSFrederick Mayle 70*9712c20fSFrederick Mayle private: 71*9712c20fSFrederick Mayle SimpleSerializer<Key> key_serializer_; 72*9712c20fSFrederick Mayle SimpleSerializer<Value> value_serializer_; 73*9712c20fSFrederick Mayle }; 74*9712c20fSFrederick Mayle 75*9712c20fSFrederick Mayle // AddressMapSerializer allocates memory and serializes an AddressMap into a 76*9712c20fSFrederick Mayle // chunk of memory data. 77*9712c20fSFrederick Mayle template<typename Addr, typename Entry> 78*9712c20fSFrederick Mayle class AddressMapSerializer { 79*9712c20fSFrederick Mayle public: 80*9712c20fSFrederick Mayle // Calculate the memory size of serialized data. SizeOf(const AddressMap<Addr,Entry> & m)81*9712c20fSFrederick Mayle size_t SizeOf(const AddressMap<Addr, Entry>& m) const { 82*9712c20fSFrederick Mayle return std_map_serializer_.SizeOf(m.map_); 83*9712c20fSFrederick Mayle } 84*9712c20fSFrederick Mayle 85*9712c20fSFrederick Mayle // Write the serialized data to specified memory location. Return the "end" 86*9712c20fSFrederick Mayle // of data, i.e., return the address after the final byte of data. 87*9712c20fSFrederick Mayle // NOTE: caller has to allocate enough memory before invoke Write() method. Write(const AddressMap<Addr,Entry> & m,char * dest)88*9712c20fSFrederick Mayle char* Write(const AddressMap<Addr, Entry>& m, char* dest) const { 89*9712c20fSFrederick Mayle return std_map_serializer_.Write(m.map_, dest); 90*9712c20fSFrederick Mayle } 91*9712c20fSFrederick Mayle 92*9712c20fSFrederick Mayle // Serializes an AddressMap object into a chunk of memory data. 93*9712c20fSFrederick Mayle // Returns a pointer to the serialized data. If size != NULL, *size is set 94*9712c20fSFrederick Mayle // to the size of serialized data, i.e., SizeOf(m). 95*9712c20fSFrederick Mayle // Caller has the ownership of memory allocated as "new char[]". Serialize(const AddressMap<Addr,Entry> & m,unsigned int * size)96*9712c20fSFrederick Mayle char* Serialize(const AddressMap<Addr, Entry>& m, unsigned int* size) const { 97*9712c20fSFrederick Mayle return std_map_serializer_.Serialize(m.map_, size); 98*9712c20fSFrederick Mayle } 99*9712c20fSFrederick Mayle 100*9712c20fSFrederick Mayle private: 101*9712c20fSFrederick Mayle // AddressMapSerializer is a simple wrapper of StdMapSerializer, just as 102*9712c20fSFrederick Mayle // AddressMap is a simple wrapper of std::map. 103*9712c20fSFrederick Mayle StdMapSerializer<Addr, Entry> std_map_serializer_; 104*9712c20fSFrederick Mayle }; 105*9712c20fSFrederick Mayle 106*9712c20fSFrederick Mayle // RangeMapSerializer allocates memory and serializes a RangeMap instance into a 107*9712c20fSFrederick Mayle // chunk of memory data. 108*9712c20fSFrederick Mayle template<typename Address, typename Entry> 109*9712c20fSFrederick Mayle class RangeMapSerializer { 110*9712c20fSFrederick Mayle public: 111*9712c20fSFrederick Mayle // Calculate the memory size of serialized data. 112*9712c20fSFrederick Mayle size_t SizeOf(const RangeMap<Address, Entry>& m) const; 113*9712c20fSFrederick Mayle 114*9712c20fSFrederick Mayle // Write the serialized data to specified memory location. Return the "end" 115*9712c20fSFrederick Mayle // of data, i.e., return the address after the final byte of data. 116*9712c20fSFrederick Mayle // NOTE: caller has to allocate enough memory before invoke Write() method. 117*9712c20fSFrederick Mayle char* Write(const RangeMap<Address, Entry>& m, char* dest) const; 118*9712c20fSFrederick Mayle 119*9712c20fSFrederick Mayle // Serializes a RangeMap object into a chunk of memory data. 120*9712c20fSFrederick Mayle // Returns a pointer to the serialized data. If size != NULL, *size is set 121*9712c20fSFrederick Mayle // to the size of serialized data, i.e., SizeOf(m). 122*9712c20fSFrederick Mayle // Caller has the ownership of memory allocated as "new char[]". 123*9712c20fSFrederick Mayle char* Serialize(const RangeMap<Address, Entry>& m, unsigned int* size) const; 124*9712c20fSFrederick Mayle 125*9712c20fSFrederick Mayle private: 126*9712c20fSFrederick Mayle // Convenient type name for Range. 127*9712c20fSFrederick Mayle typedef typename RangeMap<Address, Entry>::Range Range; 128*9712c20fSFrederick Mayle 129*9712c20fSFrederick Mayle // Serializer for RangeMap's key and Range::base_. 130*9712c20fSFrederick Mayle SimpleSerializer<Address> address_serializer_; 131*9712c20fSFrederick Mayle // Serializer for RangeMap::Range::entry_. 132*9712c20fSFrederick Mayle SimpleSerializer<Entry> entry_serializer_; 133*9712c20fSFrederick Mayle }; 134*9712c20fSFrederick Mayle 135*9712c20fSFrederick Mayle // ContainedRangeMapSerializer allocates memory and serializes a 136*9712c20fSFrederick Mayle // ContainedRangeMap instance into a chunk of memory data. 137*9712c20fSFrederick Mayle template<class AddrType, class EntryType> 138*9712c20fSFrederick Mayle class ContainedRangeMapSerializer { 139*9712c20fSFrederick Mayle public: 140*9712c20fSFrederick Mayle // Calculate the memory size of serialized data. 141*9712c20fSFrederick Mayle size_t SizeOf(const ContainedRangeMap<AddrType, EntryType>* m) const; 142*9712c20fSFrederick Mayle 143*9712c20fSFrederick Mayle // Write the serialized data to specified memory location. Return the "end" 144*9712c20fSFrederick Mayle // of data, i.e., return the address after the final byte of data. 145*9712c20fSFrederick Mayle // NOTE: caller has to allocate enough memory before invoke Write() method. 146*9712c20fSFrederick Mayle char* Write(const ContainedRangeMap<AddrType, EntryType>* m, 147*9712c20fSFrederick Mayle char* dest) const; 148*9712c20fSFrederick Mayle 149*9712c20fSFrederick Mayle // Serializes a ContainedRangeMap object into a chunk of memory data. 150*9712c20fSFrederick Mayle // Returns a pointer to the serialized data. If size != NULL, *size is set 151*9712c20fSFrederick Mayle // to the size of serialized data, i.e., SizeOf(m). 152*9712c20fSFrederick Mayle // Caller has the ownership of memory allocated as "new char[]". 153*9712c20fSFrederick Mayle char* Serialize(const ContainedRangeMap<AddrType, EntryType>* m, 154*9712c20fSFrederick Mayle unsigned int* size) const; 155*9712c20fSFrederick Mayle 156*9712c20fSFrederick Mayle private: 157*9712c20fSFrederick Mayle // Convenient type name for the underlying map type. 158*9712c20fSFrederick Mayle typedef std::map<AddrType, ContainedRangeMap<AddrType, EntryType>*> Map; 159*9712c20fSFrederick Mayle 160*9712c20fSFrederick Mayle // Serializer for addresses and entries stored in ContainedRangeMap. 161*9712c20fSFrederick Mayle SimpleSerializer<AddrType> addr_serializer_; 162*9712c20fSFrederick Mayle SimpleSerializer<EntryType> entry_serializer_; 163*9712c20fSFrederick Mayle }; 164*9712c20fSFrederick Mayle 165*9712c20fSFrederick Mayle } // namespace google_breakpad 166*9712c20fSFrederick Mayle 167*9712c20fSFrederick Mayle #endif // PROCESSOR_MAP_SERIALIZERS_H__ 168