Clean-up: modernize pretty_xml.cpp
[lttng-tools.git] / src / bin / lttng-sessiond / field.hpp
index a774d133a0978d0c59e0ce08f3a2865f675e23b4..5180574a1c0cb721aa175cec0d818e7481cd9ddf 100644 (file)
@@ -9,6 +9,7 @@
 #define LTTNG_FIELD_H
 
 #include <common/format.hpp>
+#include <common/make-unique.hpp>
 
 #include <vendor/optional.hpp>
 
@@ -64,13 +65,22 @@ public:
 
        bool operator==(const type& other) const noexcept;
        bool operator!=(const type& other) const noexcept;
+
        virtual ~type();
+       type(const type&) = delete;
+       type(type&&) = delete;
+       type& operator=(type&&) = delete;
+       type& operator=(const type&) = delete;
+
+       /* Obtain an independent copy of `type`. */
+       virtual type::cuptr copy() const = 0;
+
        virtual void accept(type_visitor& visitor) const = 0;
 
        const unsigned int alignment;
 
 protected:
-       type(unsigned int alignment);
+       explicit type(unsigned int alignment);
 
 private:
        virtual bool _is_equal(const type& rhs) const noexcept = 0;
@@ -127,13 +137,15 @@ public:
        using roles = std::vector<role>;
 
        integer_type(unsigned int alignment,
-                       byte_order byte_order,
-                       unsigned int size,
-                       signedness signedness,
-                       base base,
-                       roles roles = {});
+                    byte_order byte_order,
+                    unsigned int size,
+                    signedness signedness,
+                    base base,
+                    roles roles = {});
+
+       type::cuptr copy() const override;
 
-       virtual void accept(type_visitor& visitor) const override;
+       void accept(type_visitor& visitor) const override;
 
        const enum byte_order byte_order;
        const unsigned int size;
@@ -147,36 +159,45 @@ public:
        const roles roles_;
 
 protected:
-       virtual bool _is_equal(const type& other) const noexcept override;
+       bool _is_equal(const type& other) const noexcept override;
 };
 
 class floating_point_type : public type {
 public:
        floating_point_type(unsigned int alignment,
-                       byte_order byte_order,
-                       unsigned int exponent_digits,
-                       unsigned int mantissa_digits);
+                           byte_order byte_order,
+                           unsigned int exponent_digits,
+                           unsigned int mantissa_digits);
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const enum byte_order byte_order;
        const unsigned int exponent_digits;
        const unsigned int mantissa_digits;
 
 private:
-       virtual bool _is_equal(const type& other) const noexcept override final;
+       bool _is_equal(const type& other) const noexcept final;
 };
 
 class enumeration_type : public integer_type {
+public:
+       ~enumeration_type() override = default;
+       enumeration_type(const enumeration_type&) = delete;
+       enumeration_type(enumeration_type&&) = delete;
+       enumeration_type& operator=(enumeration_type&&) = delete;
+       enumeration_type& operator=(const enumeration_type&) = delete;
+
 protected:
        enumeration_type(unsigned int alignment,
-                       enum byte_order byte_order,
-                       unsigned int size,
-                       enum signedness signedness,
-                       enum base base,
-                       integer_type::roles roles = {});
+                        enum byte_order byte_order,
+                        unsigned int size,
+                        enum signedness signedness,
+                        enum base base,
+                        integer_type::roles roles = {});
 
-       virtual void accept(type_visitor& visitor) const = 0;
+       void accept(type_visitor& visitor) const override = 0;
 };
 
 namespace details {
@@ -186,7 +207,7 @@ public:
        using range_integer_t = MappingIntegerType;
 
        enumeration_mapping_range(MappingIntegerType in_begin, MappingIntegerType in_end) :
-               begin{in_begin}, end{in_end}
+               begin{ in_begin }, end{ in_end }
        {
        }
 
@@ -205,20 +226,26 @@ class enumeration_mapping {
 public:
        using range_t = enumeration_mapping_range<MappingIntegerType>;
 
-       enumeration_mapping(const enumeration_mapping<MappingIntegerType>& other) = default;
-       enumeration_mapping(const enumeration_mapping<MappingIntegerType>&& other) :
-               name{std::move(other.name)}, range{other.range}
+       enumeration_mapping(std::string in_name, MappingIntegerType value) :
+               name{ std::move(in_name) }, range{ value, value }
        {
        }
 
-       enumeration_mapping(std::string in_name, MappingIntegerType value) : name{std::move(in_name)}, range{value, value}
+       enumeration_mapping(std::string in_name, range_t in_range) :
+               name{ std::move(in_name) }, range{ in_range }
        {
        }
 
-       enumeration_mapping(std::string in_name, range_t in_range) : name{std::move(in_name)}, range{in_range}
+       enumeration_mapping(const enumeration_mapping<MappingIntegerType>& other) = default;
+       enumeration_mapping(enumeration_mapping<MappingIntegerType>&& other) noexcept :
+               name{ std::move(other.name) }, range{ other.range }
        {
        }
 
+       enumeration_mapping& operator=(enumeration_mapping&&) = delete;
+       enumeration_mapping& operator=(const enumeration_mapping&) = delete;
+       ~enumeration_mapping() = default;
+
        const std::string name;
        /*
         * Only one range per mapping is supported for the moment as
@@ -236,43 +263,49 @@ bool operator==(const enumeration_mapping<MappingIntegerType>& lhs,
 }
 } /* namespace details */
 
-template <class MappingIntegerType>
+template <typename MappingIntegerType>
 class typed_enumeration_type : public enumeration_type {
 public:
        using mapping = details::enumeration_mapping<MappingIntegerType>;
        using mappings = std::vector<mapping>;
 
        static_assert(std::is_integral<MappingIntegerType>::value &&
-                                       sizeof(MappingIntegerType) == 8,
-                       "MappingIntegerType must be either int64_t or uint64_t");
+                             sizeof(MappingIntegerType) == 8,
+                     "MappingIntegerType must be either int64_t or uint64_t");
 
        typed_enumeration_type(unsigned int in_alignment,
-                       enum byte_order in_byte_order,
-                       unsigned int in_size,
-                       enum base in_base,
-                       const std::shared_ptr<const mappings>& in_mappings,
-                       integer_type::roles in_roles = {}) :
+                              enum byte_order in_byte_order,
+                              unsigned int in_size,
+                              enum base in_base,
+                              const std::shared_ptr<const mappings>& in_mappings,
+                              integer_type::roles in_roles = {}) :
                enumeration_type(in_alignment,
-                               in_byte_order,
-                               in_size,
-                               std::is_signed<MappingIntegerType>::value ?
-                                               integer_type::signedness::SIGNED :
-                                                     integer_type::signedness::UNSIGNED,
-                               in_base,
-                               std::move(in_roles)),
-               mappings_{std::move(in_mappings)}
+                                in_byte_order,
+                                in_size,
+                                std::is_signed<MappingIntegerType>::value ?
+                                        integer_type::signedness::SIGNED :
+                                        integer_type::signedness::UNSIGNED,
+                                in_base,
+                                std::move(in_roles)),
+               mappings_{ std::move(in_mappings) }
        {
        }
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const override
+       {
+               return lttng::make_unique<typed_enumeration_type<MappingIntegerType>>(
+                       alignment, byte_order, size, base_, mappings_, roles_);
+       }
+
+       void accept(type_visitor& visitor) const final;
 
        const std::shared_ptr<const mappings> mappings_;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final
+       bool _is_equal(const type& base_other) const noexcept final
        {
-               const auto& other = static_cast<const typed_enumeration_type<MappingIntegerType>&>(
-                               base_other);
+               const auto& other =
+                       static_cast<const typed_enumeration_type<MappingIntegerType>&>(base_other);
 
                return integer_type::_is_equal(base_other) && *this->mappings_ == *other.mappings_;
        }
@@ -289,35 +322,39 @@ public:
        const type::cuptr element_type;
 
 protected:
-       virtual bool _is_equal(const type& base_other) const noexcept override;
+       bool _is_equal(const type& base_other) const noexcept override;
 };
 
 class static_length_array_type : public array_type {
 public:
        static_length_array_type(unsigned int alignment,
-                       type::cuptr element_type,
-                       uint64_t in_length);
+                                type::cuptr element_type,
+                                uint64_t in_length);
+
+       type::cuptr copy() const final;
 
-       virtual void accept(type_visitor& visitor) const override final;
+       void accept(type_visitor& visitor) const final;
 
        const uint64_t length;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
 class dynamic_length_array_type : public array_type {
 public:
        dynamic_length_array_type(unsigned int alignment,
-                       type::cuptr element_type,
-                       field_location length_field_location);
+                                 type::cuptr element_type,
+                                 field_location length_field_location);
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const field_location length_field_location;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
 class static_length_blob_type : public type {
@@ -331,25 +368,29 @@ public:
 
        static_length_blob_type(unsigned int alignment, uint64_t in_length_bytes, roles roles = {});
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const uint64_t length_bytes;
        const roles roles_;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
 class dynamic_length_blob_type : public type {
 public:
        dynamic_length_blob_type(unsigned int alignment, field_location length_field_location);
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const field_location length_field_location;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
 class string_type : public type {
@@ -369,38 +410,48 @@ public:
        const encoding encoding_;
 
 protected:
-       virtual bool _is_equal(const type& base_other) const noexcept override;
+       bool _is_equal(const type& base_other) const noexcept override;
 };
 
 class static_length_string_type : public string_type {
 public:
-       static_length_string_type(
-                       unsigned int alignment, enum encoding in_encoding, uint64_t length);
-       virtual void accept(type_visitor& visitor) const override final;
+       static_length_string_type(unsigned int alignment,
+                                 enum encoding in_encoding,
+                                 uint64_t length);
+
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const uint64_t length;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
 class dynamic_length_string_type : public string_type {
 public:
        dynamic_length_string_type(unsigned int alignment,
-                       enum encoding in_encoding,
-                       field_location length_field_location);
-       virtual void accept(type_visitor& visitor) const override final;
+                                  enum encoding in_encoding,
+                                  field_location length_field_location);
+
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const field_location length_field_location;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
 class null_terminated_string_type : public string_type {
 public:
        null_terminated_string_type(unsigned int alignment, enum encoding in_encoding);
-       virtual void accept(type_visitor& visitor) const override final;
+
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 };
 
 class structure_type : public type {
@@ -409,42 +460,58 @@ public:
 
        structure_type(unsigned int alignment, fields in_fields);
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const final;
+
+       void accept(type_visitor& visitor) const final;
 
        const fields fields_;
 
 private:
-       virtual bool _is_equal(const type& base_other) const noexcept override final;
+       bool _is_equal(const type& base_other) const noexcept final;
 };
 
-template <class MappingIntegerType>
+template <typename MappingIntegerType>
 class variant_type : public type {
-       static_assert(std::is_same<MappingIntegerType,
-                                       unsigned_enumeration_type::mapping::range_t::
-                                                       range_integer_t>::value ||
-                                       std::is_same<MappingIntegerType,
-                                                       signed_enumeration_type::mapping::range_t::
-                                                                       range_integer_t>::value,
-                       "Variant mapping integer type must be one of those allowed by typed_enumeration_type");
+       static_assert(
+               std::is_same<MappingIntegerType,
+                            unsigned_enumeration_type::mapping::range_t::range_integer_t>::value ||
+                       std::is_same<
+                               MappingIntegerType,
+                               signed_enumeration_type::mapping::range_t::range_integer_t>::value,
+               "Variant mapping integer type must be one of those allowed by typed_enumeration_type");
 
 public:
-       using choice = std::pair<const details::enumeration_mapping<MappingIntegerType>, type::cuptr>;
+       using choice =
+               std::pair<const details::enumeration_mapping<MappingIntegerType>, type::cuptr>;
        using choices = std::vector<choice>;
 
        variant_type(unsigned int in_alignment,
-                       field_location in_selector_field_location,
-                       choices in_choices) :
+                    field_location in_selector_field_location,
+                    choices in_choices) :
                type(in_alignment),
-               selector_field_location{std::move(in_selector_field_location)},
-               choices_{std::move(in_choices)}
+               selector_field_location{ std::move(in_selector_field_location) },
+               choices_{ std::move(in_choices) }
        {
        }
 
-       virtual void accept(type_visitor& visitor) const override final;
+       type::cuptr copy() const final
+       {
+               choices copy_of_choices;
+
+               copy_of_choices.reserve(choices_.size());
+               for (const auto& current_choice : choices_) {
+                       copy_of_choices.emplace_back(current_choice.first,
+                                                    current_choice.second->copy());
+               }
+
+               return lttng::make_unique<variant_type<MappingIntegerType>>(
+                       alignment, selector_field_location, std::move(copy_of_choices));
+       }
+
+       void accept(type_visitor& visitor) const final;
 
        const field_location selector_field_location;
        const choices choices_;
-;
 
 private:
        static bool _choices_are_equal(const choices& a, const choices& b)
@@ -453,27 +520,32 @@ private:
                        return false;
                }
 
-               return true;
-
-               return std::equal(a.cbegin(), a.cend(), b.cbegin(),
-                               [](const choice& choice_a, const choice& choice_b) {
-                                       return choice_a.first == choice_b.first &&
-                                               *choice_a.second == *choice_b.second;
-                               });
+               return std::equal(a.cbegin(),
+                                 a.cend(),
+                                 b.cbegin(),
+                                 [](const choice& choice_a, const choice& choice_b) {
+                                         return choice_a.first == choice_b.first &&
+                                                 *choice_a.second == *choice_b.second;
+                                 });
        }
 
-       virtual bool _is_equal(const type& base_other) const noexcept override final
+       bool _is_equal(const type& base_other) const noexcept final
        {
                const auto& other = static_cast<decltype(*this)&>(base_other);
 
                return selector_field_location == other.selector_field_location &&
-                               _choices_are_equal(choices_, other.choices_);
+                       _choices_are_equal(choices_, other.choices_);
        }
 };
 
 class field_visitor {
 public:
        virtual ~field_visitor() = default;
+       field_visitor(field_visitor&&) = delete;
+       field_visitor(const field_visitor&) = delete;
+       field_visitor& operator=(const field_visitor&) = delete;
+       field_visitor& operator=(field_visitor&&) = delete;
+
        virtual void visit(const field& field) = 0;
 
 protected:
@@ -483,6 +555,11 @@ protected:
 class type_visitor {
 public:
        virtual ~type_visitor() = default;
+       type_visitor(type_visitor&&) = delete;
+       type_visitor(const type_visitor&) = delete;
+       type_visitor& operator=(const type_visitor&) = delete;
+       type_visitor& operator=(type_visitor&&) = delete;
+
        virtual void visit(const integer_type& type) = 0;
        virtual void visit(const floating_point_type& type) = 0;
        virtual void visit(const signed_enumeration_type& type) = 0;
@@ -495,8 +572,12 @@ public:
        virtual void visit(const static_length_string_type& type) = 0;
        virtual void visit(const dynamic_length_string_type& type) = 0;
        virtual void visit(const structure_type& type) = 0;
-       virtual void visit(const variant_type<signed_enumeration_type::mapping::range_t::range_integer_t>& type) = 0;
-       virtual void visit(const variant_type<unsigned_enumeration_type::mapping::range_t::range_integer_t>& type) = 0;
+       virtual void
+       visit(const variant_type<signed_enumeration_type::mapping::range_t::range_integer_t>&
+                     type) = 0;
+       virtual void
+       visit(const variant_type<unsigned_enumeration_type::mapping::range_t::range_integer_t>&
+                     type) = 0;
 
 protected:
        type_visitor() = default;
@@ -507,17 +588,19 @@ protected:
 } /* namespace lttng */
 
 /*
+ * Field formatters for libfmt.
+ *
  * Due to a bug in g++ < 7.1, this specialization must be enclosed in the fmt namespace,
  * see https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56480.
  */
 namespace fmt {
 template <>
 struct formatter<lttng::sessiond::trace::field_location> : formatter<std::string> {
-       template <typename FormatCtx>
-       typename FormatCtx::iterator format(
-                       const lttng::sessiond::trace::field_location& location, FormatCtx& ctx)
+       template <typename FormatContextType>
+       typename FormatContextType::iterator
+       format(const lttng::sessiond::trace::field_location& location, FormatContextType& ctx)
        {
-               std::string location_str{"["};
+               std::string location_str{ "[" };
 
                switch (location.root_) {
                case lttng::sessiond::trace::field_location::root::PACKET_HEADER:
@@ -540,7 +623,7 @@ struct formatter<lttng::sessiond::trace::field_location> : formatter<std::string
                        break;
                }
 
-               for (const auto &name : location.elements_) {
+               for (const autoname : location.elements_) {
                        location_str += ", \"" + name + "\"";
                }
 
@@ -548,6 +631,50 @@ struct formatter<lttng::sessiond::trace::field_location> : formatter<std::string
                return format_to(ctx.out(), location_str);
        }
 };
+
+namespace details {
+template <typename MappingIntegerType>
+::std::string format_mapping_range(typename lttng::sessiond::trace::typed_enumeration_type<
+                                  MappingIntegerType>::mapping::range_t range)
+{
+       if (range.begin == range.end) {
+               return ::lttng::format("[{}]", range.begin);
+       } else {
+               return ::lttng::format("[{}, {}]", range.begin, range.end);
+       }
+}
+} /* namespace details */
+
+template <>
+struct formatter<typename lttng::sessiond::trace::signed_enumeration_type::mapping::range_t>
+       : formatter<std::string> {
+       template <typename FormatContextType>
+       typename FormatContextType::iterator
+       format(typename lttng::sessiond::trace::signed_enumeration_type::mapping::range_t range,
+              FormatContextType& ctx)
+       {
+               return format_to(ctx.out(),
+                                details::format_mapping_range<
+                                        lttng::sessiond::trace::signed_enumeration_type::mapping::
+                                                range_t::range_integer_t>(range));
+       }
+};
+
+template <>
+struct formatter<typename lttng::sessiond::trace::unsigned_enumeration_type::mapping::range_t>
+       : formatter<std::string> {
+       template <typename FormatContextType>
+       typename FormatContextType::iterator
+       format(typename lttng::sessiond::trace::unsigned_enumeration_type::mapping::range_t range,
+              FormatContextType& ctx)
+       {
+               return format_to(ctx.out(),
+                                details::format_mapping_range<
+                                        lttng::sessiond::trace::unsigned_enumeration_type::
+                                                mapping::range_t::range_integer_t>(range));
+       }
+};
+
 } /* namespace fmt */
 
 #endif /* LTTNG_FIELD_H */
This page took 0.032646 seconds and 4 git commands to generate.