1d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// 2d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Copyright 2012 Francisco Jerez 3d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// 4d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Permission is hereby granted, free of charge, to any person obtaining a 5d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// copy of this software and associated documentation files (the "Software"), 6d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// to deal in the Software without restriction, including without limitation 7d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// the rights to use, copy, modify, merge, publish, distribute, sublicense, 85089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org// and/or sell copies of the Software, and to permit persons to whom the 9d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// Software is furnished to do so, subject to the following conditions: 10d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// 11d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// The above copyright notice and this permission notice shall be included in 12d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// all copies or substantial portions of the Software. 13d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// 14d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 1793aedf7d27cb93f93077f9f7f758e830a392bdfcbashi@google.com// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// SOFTWARE. 21d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org// 22d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 23d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include <type_traits> 24d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include <algorithm> 25d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 26d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org#include "core/module.hpp" 27d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 285089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.orgusing namespace clover; 29d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 30d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.orgnamespace { 31d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename T, typename = void> 32d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org struct __serializer; 33d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 34d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org /// Serialize the specified object. 35d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename T> 36d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org void 37d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __proc(compat::ostream &os, const T &x) { 38d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __serializer<T>::proc(os, x); 39d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 40d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 41d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org /// Deserialize the specified object. 42d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename T> 43d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org void 44d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __proc(compat::istream &is, T &x) { 45d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __serializer<T>::proc(is, x); 46d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 47d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 48d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename T> 49d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org T 50d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __proc(compat::istream &is) { 51d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org T x; 52d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __serializer<T>::proc(is, x); 53d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return x; 54d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 55d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 56d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org /// (De)serialize a scalar value. 57d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename T> 58d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org struct __serializer<T, typename std::enable_if< 59d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org std::is_scalar<T>::value>::type> { 60d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org static void 61d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org proc(compat::ostream &os, const T &x) { 62d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org os.write(reinterpret_cast<const char *>(&x), sizeof(x)); 63d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 64d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 65d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org static void 66d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org proc(compat::istream &is, T &x) { 675089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org is.read(reinterpret_cast<char *>(&x), sizeof(x)); 685089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org } 695089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org }; 705089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 715089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org /// (De)serialize a vector. 725089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org template<typename T> 735089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org struct __serializer<compat::vector<T>> { 745089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org static void 755089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org proc(compat::ostream &os, const compat::vector<T> &v) { 765089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org __proc<uint32_t>(os, v.size()); 775089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 785089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org for (size_t i = 0; i < v.size(); i++) 795089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org __proc<T>(os, v[i]); 805089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org } 815089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 825089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org static void 835089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org proc(compat::istream &is, compat::vector<T> &v) { 845089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org v.reserve(__proc<uint32_t>(is)); 855089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 86d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org for (size_t i = 0; i < v.size(); i++) 87d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org new(&v[i]) T(__proc<T>(is)); 88d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 89d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org }; 90d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 91d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org /// (De)serialize a module::section. 92d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<> 93d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org struct __serializer<module::section> { 94d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename S, typename QT> 95a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org static void 96d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org proc(S &s, QT &x) { 97a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org __proc(s, x.type); 98a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org __proc(s, x.size); 99a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org __proc(s, x.data); 100a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org } 101a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org }; 102d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 103a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org /// (De)serialize a module::argument. 104d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<> 105a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org struct __serializer<module::argument> { 106d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org template<typename S, typename QT> 107a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org static void 108d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org proc(S &s, QT &x) { 109a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org __proc(s, x.type); 110d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __proc(s, x.size); 111a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org } 112d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org }; 113a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org 114d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org /// (De)serialize a module::symbol. 115a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org template<> 116d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org struct __serializer<module::symbol> { 117a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org template<typename S, typename QT> 118d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org static void 119a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org proc(S &s, QT &x) { 120d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __proc(s, x.section); 121a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org __proc(s, x.offset); 122d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org __proc(s, x.args); 123a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org } 124d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org }; 125a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org 126d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org /// (De)serialize a module. 127a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org template<> 128d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org struct __serializer<module> { 129a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org template<typename S, typename QT> 130d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org static void 131a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org proc(S &s, QT &x) { 132f12575f6e5a4b053188d4e205ae6ceb95a60fb2cyusukes@chromium.org __proc(s, x.syms); 133f12575f6e5a4b053188d4e205ae6ceb95a60fb2cyusukes@chromium.org __proc(s, x.secs); 134ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org } 135ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org }; 13600b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com}; 13700b790a7ad0d65b066a61760f58e7dbfc055cd2dbashi@google.com 138ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.orgnamespace clover { 139ced7112cb41d09cd344bbe4b20459049d6039491bashi@chromium.org void 140a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org module::serialize(compat::ostream &os) const { 141a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org __proc(os, *this); 1424dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org } 1434dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org 1444dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org module 1454dcad600f99d85201d9db3cb8bee166ec2aaca85bashi@chromium.org module::deserialize(compat::istream &is) { 146a574866c0e4b1539098e64422f59d01c80cea6cfbashi@chromium.org return __proc<module>(is); 147a4099a3bb81adafc5593090c1185ec82933a3d6eyusukes@chromium.org } 148d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 149d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org const module::symbol & 1505089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org module::sym(compat::string name) const { 1515089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org auto it = std::find_if(syms.begin(), syms.end(), [&](const symbol &x) { 1525089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org return compat::string(x.name) == name; 1535089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org }); 1545089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 1555089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org if (it == syms.end()) 1565089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org throw noent_error(); 1575089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 1585089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org return *it; 1595089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org } 1605089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org 1615089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org const module::section & 1625089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org module::sec(typename section::type type) const { 1635089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org auto it = std::find_if(secs.begin(), secs.end(), [&](const section &x) { 1645089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org return x.type == type; 1655089f9c6ecd9b0802f1cf456b69350255a93ae09agl@chromium.org }); 166d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 167d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org if (it == secs.end()) 168d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org throw noent_error(); 169d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org 170d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org return *it; 171d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org } 172d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org} 173d257d186ae2a08042a412824678f98241a1a4f3cyusukes@chromium.org