diff --git a/src/sim/serialize.hh b/src/sim/serialize.hh index 3adcc5b1aa..51313a4b30 100644 --- a/src/sim/serialize.hh +++ b/src/sim/serialize.hh @@ -53,9 +53,8 @@ #include #include -#include "base/bitunion.hh" #include "base/logging.hh" -#include "base/str.hh" +#include "sim/serialize_handlers.hh" class IniFile; class SimObject; @@ -318,134 +317,6 @@ class Serializable static std::stack path; }; -/** - * @ingroup api_serialize - * @{ - */ - -// To add support for a new type of field that can be serialized, define -// template specializations of the two classes below, ParseParam and ShowParam, -// as described above each. The way ParseParam is specialized for std::string -// or ShowParam is specialied for bool can be used as examples. - -/* - * A structure which should be specialized to contain a static method with the - * signature: - * - * bool parse(const std::string &s, T &value) - * - * which fills in value using the contents of s, and returns if that was - * successful. - */ -template -struct ParseParam; - -// Specialization for anything to_number can accept. -template -struct ParseParam()), void())> -{ - static bool - parse(const std::string &s, T &value) - { - return to_number(s, value); - } -}; - -template <> -struct ParseParam -{ - static bool - parse(const std::string &s, bool &value) - { - return to_bool(s, value); - } -}; - -template <> -struct ParseParam -{ - static bool - parse(const std::string &s, std::string &value) - { - // String requires no processing to speak of - value = s; - return true; - } -}; - -// Specialization for BitUnion types. -template -struct ParseParam> -{ - static bool - parse(const std::string &s, BitUnionType &value) - { - // Zero initialize storage to avoid leaking an uninitialized value - BitUnionBaseType storage = BitUnionBaseType(); - auto res = to_number(s, storage); - value = storage; - return res; - } -}; - -/* - * A structure which should be specialized to contain a static method with the - * signature: - * - * void show(std::ostream &os, const T &value) - * - * which outputs value to the stream os. - * - * This default implementation falls back to the << operator which should work - * for many types. - */ -template -struct ShowParam -{ - static void show(std::ostream &os, const T &value) { os << value; } -}; - -// Handle characters specially so that we print their value, not the character -// they encode. -template -struct ShowParam::value || - std::is_same::value || - std::is_same::value>> -{ - static void - show(std::ostream &os, const T &value) - { - if (std::is_signed::value) - os << (int)value; - else - os << (unsigned int)value; - } -}; - -template <> -struct ShowParam -{ - static void - show(std::ostream &os, const bool &value) - { - // Display bools as strings - os << (value ? "true" : "false"); - } -}; - -template -struct ShowParam> -{ - static void - show(std::ostream &os, const BitUnionType &value) - { - ShowParam>::show( - os, static_cast &>(value)); - } -}; - -/** @} */ - /** * This function is used for writing parameters to a checkpoint. * @param os The checkpoint to be written to. diff --git a/src/sim/serialize_handlers.hh b/src/sim/serialize_handlers.hh new file mode 100644 index 0000000000..e09712140a --- /dev/null +++ b/src/sim/serialize_handlers.hh @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2015, 2018 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * + * Copyright (c) 2002-2005 The Regents of The University of Michigan + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +/* @file + * Serialization Interface Declarations + */ + +#ifndef __SERIALIZE_HANDLERS_HH__ +#define __SERIALIZE_HANDLERS_HH__ + + +#include +#include +#include + +#include "base/bitunion.hh" +#include "base/str.hh" + +/** + * @ingroup api_serialize + * @{ + */ + +// To add support for a new type of field that can be serialized, define +// template specializations of the two classes below, ParseParam and ShowParam, +// as described above each. The way ParseParam is specialized for std::string +// or ShowParam is specialied for bool can be used as examples. + +/* + * A structure which should be specialized to contain a static method with the + * signature: + * + * bool parse(const std::string &s, T &value) + * + * which fills in value using the contents of s, and returns if that was + * successful. + */ +template +struct ParseParam; + +// Specialization for anything to_number can accept. +template +struct ParseParam()), void())> +{ + static bool + parse(const std::string &s, T &value) + { + return to_number(s, value); + } +}; + +template <> +struct ParseParam +{ + static bool + parse(const std::string &s, bool &value) + { + return to_bool(s, value); + } +}; + +template <> +struct ParseParam +{ + static bool + parse(const std::string &s, std::string &value) + { + // String requires no processing to speak of + value = s; + return true; + } +}; + +// Specialization for BitUnion types. +template +struct ParseParam> +{ + static bool + parse(const std::string &s, BitUnionType &value) + { + // Zero initialize storage to avoid leaking an uninitialized value + BitUnionBaseType storage = BitUnionBaseType(); + auto res = to_number(s, storage); + value = storage; + return res; + } +}; + +/* + * A structure which should be specialized to contain a static method with the + * signature: + * + * void show(std::ostream &os, const T &value) + * + * which outputs value to the stream os. + * + * This default implementation falls back to the << operator which should work + * for many types. + */ +template +struct ShowParam +{ + static void show(std::ostream &os, const T &value) { os << value; } +}; + +// Handle characters specially so that we print their value, not the character +// they encode. +template +struct ShowParam::value || + std::is_same::value || + std::is_same::value>> +{ + static void + show(std::ostream &os, const T &value) + { + if (std::is_signed::value) + os << (int)value; + else + os << (unsigned int)value; + } +}; + +template <> +struct ShowParam +{ + static void + show(std::ostream &os, const bool &value) + { + // Display bools as strings + os << (value ? "true" : "false"); + } +}; + +template +struct ShowParam> +{ + static void + show(std::ostream &os, const BitUnionType &value) + { + ShowParam>::show( + os, static_cast &>(value)); + } +}; + +/** @} */ + +#endif // __SERIALIZE_HANDLERS_HH__