Update pdl-compiler to 0.1.3 am: d43572c91e

Original change: https://android-review.googlesource.com/c/platform/external/rust/crates/pdl-compiler/+/2645503

Change-Id: I913a85587b1f1e719ff1b86763ad3941321f84cc
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
diff --git a/.cargo_vcs_info.json b/.cargo_vcs_info.json
index 686a0a1..24636e7 100644
--- a/.cargo_vcs_info.json
+++ b/.cargo_vcs_info.json
@@ -1,6 +1,6 @@
 {
   "git": {
-    "sha1": "c2c504a038cfe412ad8a3f8c0a1b747126eeedda"
+    "sha1": "6b05a0616ef2a982068e0d5fbe28d2058d49d8e0"
   },
   "path_in_vcs": ""
 }
\ No newline at end of file
diff --git a/Android.bp b/Android.bp
index f8f8ee2..60940fe 100644
--- a/Android.bp
+++ b/Android.bp
@@ -7,7 +7,7 @@
     name: "generate_canonical_tests",
     crate_name: "generate_canonical_tests",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.2",
+    cargo_pkg_version: "0.1.3",
     srcs: ["src/bin/generate-canonical-tests.rs"],
     edition: "2021",
     features: [
@@ -37,7 +37,7 @@
     name: "libpdl_compiler",
     crate_name: "pdl_compiler",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.2",
+    cargo_pkg_version: "0.1.3",
     srcs: ["src/lib.rs"],
     edition: "2021",
     features: [
@@ -66,7 +66,7 @@
     name: "pdlc",
     crate_name: "pdlc",
     cargo_env_compat: true,
-    cargo_pkg_version: "0.1.2",
+    cargo_pkg_version: "0.1.3",
     srcs: ["src/main.rs"],
     edition: "2021",
     features: [
diff --git a/Cargo.toml b/Cargo.toml
index 6bbb7d4..57d75db 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,13 +12,16 @@
 [package]
 edition = "2021"
 name = "pdl-compiler"
-version = "0.1.2"
+version = "0.1.3"
 authors = [
     "Henri Chataing <henrichataing@google.com>",
     "David de Jesus Duarte <licorne@google.com>",
     "Martin Geisler <mgeisler@google.com>",
 ]
-exclude = [".github/*"]
+exclude = [
+    ".github/*",
+    "editors/*",
+]
 default-run = "pdlc"
 description = "Parser and serializer generator for protocol binary packets"
 readme = "README.md"
diff --git a/Cargo.toml.orig b/Cargo.toml.orig
index 878053d..c9fa183 100644
--- a/Cargo.toml.orig
+++ b/Cargo.toml.orig
@@ -1,6 +1,6 @@
 [package]
 name = "pdl-compiler"
-version = "0.1.2"
+version = "0.1.3"
 edition = "2021"
 description = "Parser and serializer generator for protocol binary packets"
 repository = "https://github.com/google/pdl/"
@@ -12,7 +12,7 @@
     "David de Jesus Duarte <licorne@google.com>",
     "Martin Geisler <mgeisler@google.com>"
 ]
-exclude = [".github/*"]
+exclude = [".github/*", "editors/*"]
 categories = ["parsing"]
 default-run = "pdlc"
 
diff --git a/METADATA b/METADATA
index 5d18826..b35258e 100644
--- a/METADATA
+++ b/METADATA
@@ -11,13 +11,13 @@
   }
   url {
     type: ARCHIVE
-    value: "https://static.crates.io/crates/pdl-compiler/pdl-compiler-0.1.2.crate"
+    value: "https://static.crates.io/crates/pdl-compiler/pdl-compiler-0.1.3.crate"
   }
-  version: "0.1.2"
+  version: "0.1.3"
   license_type: NOTICE
   last_upgrade_date {
     year: 2023
     month: 6
-    day: 20
+    day: 27
   }
 }
diff --git a/scripts/Android.bp b/scripts/Android.bp
index a11b007..bb0932c 100644
--- a/scripts/Android.bp
+++ b/scripts/Android.bp
@@ -34,3 +34,10 @@
     ],
 }
 
+// C++ packet runtime.
+cc_library_headers {
+    name: "pdl_cxx_packet_runtime",
+    export_include_dirs: ["."],
+    host_supported: true,
+    vendor_available: true,
+}
diff --git a/scripts/generate_cxx_backend.py b/scripts/generate_cxx_backend.py
index 0c8b9e3..13ea23d 100755
--- a/scripts/generate_cxx_backend.py
+++ b/scripts/generate_cxx_backend.py
@@ -1003,7 +1003,7 @@
             accessors.append(
                 dedent("""\
                 std::vector<uint8_t> GetPayload() const {
-                    ASSERT(valid_);
+                    _ASSERT_VALID(valid_);
                     return payload_.bytes();
                 }
 
@@ -1015,7 +1015,7 @@
             accessors.append(
                 dedent("""\
                 {array_type} Get{accessor_name}() const {{
-                    ASSERT(valid_);
+                    _ASSERT_VALID(valid_);
                     {accessor}
                 }}
 
@@ -1028,7 +1028,7 @@
             accessors.append(
                 dedent("""\
                 {field_type} Get{accessor_name}() const {{
-                    ASSERT(valid_);
+                    _ASSERT_VALID(valid_);
                     return {member_name}_;
                 }}
 
@@ -1039,7 +1039,7 @@
             accessors.append(
                 dedent("""\
                 {field_type}{field_qualifier} Get{accessor_name}() const {{
-                    ASSERT(valid_);
+                    _ASSERT_VALID(valid_);
                     return {member_name}_;
                 }}
 
@@ -1542,10 +1542,14 @@
         {include_header}
         {using_namespace}
 
-        #ifndef ASSERT
+        #ifndef _ASSERT_VALID
+        #ifdef ASSERT
+        #define _ASSERT_VALID ASSERT
+        #else
         #include <cassert>
-        #define ASSERT assert
-        #endif  // !ASSERT
+        #define _ASSERT_VALID assert
+        #endif  // ASSERT
+        #endif  // !_ASSERT_VALID
 
         {open_namespace}
         """).format(input_name=input.name,
diff --git a/scripts/generate_cxx_backend_tests.py b/scripts/generate_cxx_backend_tests.py
index 123b08c..880988e 100755
--- a/scripts/generate_cxx_backend_tests.py
+++ b/scripts/generate_cxx_backend_tests.py
@@ -269,7 +269,7 @@
                 }};
                 {intermediate_declarations}
                 {child_packet_id}Builder packet = {built_packet};
-                ASSERT_EQ(packet.pdl::packet::Builder::Serialize(), expected_output);
+                ASSERT_EQ(packet.SerializeToBytes(), expected_output);
             }}
             """).format(serializer_test_suite=serializer_test_suite,
                         packet_id=packet.id,
diff --git a/scripts/generate_python_backend.py b/scripts/generate_python_backend.py
index 3a1a82b..475154d 100755
--- a/scripts/generate_python_backend.py
+++ b/scripts/generate_python_backend.py
@@ -908,7 +908,11 @@
     enum_name = decl.id
     tag_decls = []
     for t in decl.tags:
-        tag_decls.append(f"{t.id} = {hex(t.value)}")
+        if t.value is not None:
+            tag_decls.append(f"{t.id} = {hex(t.value)}")
+        if t.range is not None:
+            tag_decls.append(f"{t.id}_START = {hex(t.range[0])}")
+            tag_decls.append(f"{t.id}_END = {hex(t.range[1])}")
 
     return dedent("""\
 
diff --git a/scripts/packet_runtime.h b/scripts/packet_runtime.h
index 4a76383..555d092 100644
--- a/scripts/packet_runtime.h
+++ b/scripts/packet_runtime.h
@@ -150,7 +150,7 @@
   }
 
   /// Helper method to serialize the packet to a byte vector.
-  virtual std::vector<uint8_t> Serialize() const {
+  virtual std::vector<uint8_t> SerializeToBytes() const {
     std::vector<uint8_t> output;
     Serialize(output);
     return output;
diff --git a/scripts/pdl/ast.py b/scripts/pdl/ast.py
index 4f884e5..b07f6ad 100644
--- a/scripts/pdl/ast.py
+++ b/scripts/pdl/ast.py
@@ -268,7 +268,7 @@
         return [convert_(elt) for elt in obj]
     if isinstance(obj, object):
         if 'start' in obj.keys() and 'end' in obj.keys():
-            return (objs.start, obj.end)
+            return (obj['start'], obj['end'])
         kind = obj['kind']
         loc = obj['loc']
         loc = SourceRange(loc['file'], SourceLocation(**loc['start']), SourceLocation(**loc['end']))
diff --git a/src/backends/rust.rs b/src/backends/rust.rs
index cda1a8f..f369179 100644
--- a/src/backends/rust.rs
+++ b/src/backends/rust.rs
@@ -483,9 +483,9 @@
         }
 
         quote! {
-            let #parent_id_lower = Arc::new(#parent_data {
+            let #parent_id_lower = #parent_data {
                 #(#field: #value,)*
-            });
+            };
         }
     });
 
@@ -510,7 +510,7 @@
             #[derive(Debug, Clone, PartialEq, Eq)]
             #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
             pub enum #id_data_child {
-                #(#child(Arc<#child_data>),)*
+                #(#child(#child_data),)*
                 Payload(Bytes),
                 None,
             }
@@ -588,7 +588,7 @@
         pub struct #id_packet {
             #(
                 #[cfg_attr(feature = "serde", serde(flatten))]
-                #parent_lower_ids: Arc<#parent_data>,
+                #parent_lower_ids: #parent_data,
             )*
         }
 
@@ -637,12 +637,12 @@
 
             fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
                 let data = #top_level_data::parse_inner(&mut bytes)?;
-                Self::new(Arc::new(data))
+                Self::new(data)
             }
 
             #specialize
 
-            fn new(#top_level_id_lower: Arc<#top_level_data>) -> Result<Self> {
+            fn new(#top_level_id_lower: #top_level_data) -> Result<Self> {
                 #(
                     let #parent_shifted_lower_ids = match &#parent_lower_ids.child {
                         #parent_data_child::#parent_shifted_ids(value) => value.clone(),
@@ -656,7 +656,7 @@
             }
 
             #(pub fn #all_field_getter_names(&self) -> #all_field_borrows #all_field_types {
-                #all_field_borrows #all_field_self_field.as_ref().#all_field_names
+                #all_field_borrows #all_field_self_field.#all_field_names
             })*
 
             #get_payload
diff --git a/src/backends/rust/parser.rs b/src/backends/rust/parser.rs
index 33dd840..203a19b 100644
--- a/src/backends/rust/parser.rs
+++ b/src/backends/rust/parser.rs
@@ -702,7 +702,7 @@
                     let mut cell = Cell::new(payload);
                     let child_data = #child_ids_data::parse_inner(&mut cell #child_parse_args)?;
                     // TODO(mgeisler): communicate back to user if !cell.get().is_empty()?
-                    #packet_data_child::#child_ids(Arc::new(child_data))
+                    #packet_data_child::#child_ids(child_data)
                 }),*
                 _ if !payload.is_empty() => {
                     #packet_data_child::Payload(Bytes::copy_from_slice(payload))
diff --git a/src/backends/rust/preamble.rs b/src/backends/rust/preamble.rs
index 45978f1..ce8b742 100644
--- a/src/backends/rust/preamble.rs
+++ b/src/backends/rust/preamble.rs
@@ -55,7 +55,6 @@
         use std::convert::{TryFrom, TryInto};
         use std::cell::Cell;
         use std::fmt;
-        use std::sync::Arc;
         use thiserror::Error;
 
         type Result<T> = std::result::Result<T, Error>;
diff --git a/tests/examples/array-field.pdl b/tests/examples/array-field.pdl
deleted file mode 100644
index 070a6cc..0000000
--- a/tests/examples/array-field.pdl
+++ /dev/null
@@ -1,39 +0,0 @@
-little_endian_packets
-
-custom_field custom: 1 "custom"
-checksum checksum: 1 "checksum"
-
-enum Enum : 1 {
-    tag = 0,
-}
-
-struct Struct {
-    a: 1,
-}
-
-packet Packet {
-    a: 1,
-}
-
-group Group {
-    a: 1,
-}
-
-packet InvalidKind {
-    array_0: Group[],
-    array_1: Packet[],
-    array_2: checksum[],
-}
-
-packet UndeclaredType {
-    array: Unknown[],
-}
-
-packet Correct {
-    array_0: custom[],
-    array_1: Enum[],
-    array_2: Struct[],
-    array_3: 1[],
-    array_4: 1[42],
-    array_5: 1[+2],
-}
diff --git a/tests/examples/checksum-field.pdl b/tests/examples/checksum-field.pdl
deleted file mode 100644
index 0e1a98b..0000000
--- a/tests/examples/checksum-field.pdl
+++ /dev/null
@@ -1,22 +0,0 @@
-little_endian_packets
-
-checksum crc16: 16 "crc16"
-
-packet Undefined {
-    _checksum_start_ (crc16),
-}
-
-packet InvalidType {
-    crc16: 16,
-    _checksum_start_ (crc16),
-}
-
-packet InvalidOrder {
-    _checksum_start_ (crc16),
-    crc16: crc16,
-}
-
-packet Correct {
-    crc16: crc16,
-    _checksum_start_ (crc16),
-}
diff --git a/tests/examples/count-field.pdl b/tests/examples/count-field.pdl
deleted file mode 100644
index a88cccd..0000000
--- a/tests/examples/count-field.pdl
+++ /dev/null
@@ -1,25 +0,0 @@
-little_endian_packets
-
-packet Undefined {
-    _count_ (array): 8,
-}
-
-packet InvalidType {
-    _count_ (array): 8,
-    array: 16,
-}
-
-packet InvalidOrder {
-    array: 16[],
-    _count_ (array): 8,
-}
-
-packet InvalidSize {
-    _count_ (array): 8,
-    array: 16[32],
-}
-
-packet Correct {
-    _count_ (array): 8,
-    array: 16[],
-}
diff --git a/tests/examples/decl-scope.pdl b/tests/examples/decl-scope.pdl
deleted file mode 100644
index c1391ab..0000000
--- a/tests/examples/decl-scope.pdl
+++ /dev/null
@@ -1,26 +0,0 @@
-
-// Clashes with custom_field, struct, enum
-checksum decl_name: 16 "crc16"
-
-// Clashes with checksum, struct, enum
-custom_field decl_name: 1 "custom"
-
-// Clashes with checksum, custom_field, struct
-enum decl_name : 1 {
-    A = 1,
-}
-
-// Clashes with checksum, custom_field, enum
-struct decl_name {
-    a: 1,
-}
-
-// OK
-group decl_name {
-    a: 1,
-}
-
-// OK
-packet decl_name {
-    a: 1,
-}
diff --git a/tests/examples/example.pdl b/tests/examples/example.pdl
deleted file mode 100644
index b34d140..0000000
--- a/tests/examples/example.pdl
+++ /dev/null
@@ -1,78 +0,0 @@
-// line comment
-/* block comment */
-
-little_endian_packets
-
-/* stuff */
-enum FourBits : 4 {
-  ONE = 1,
-  TWO = 2,
-  THREE = 3,
-  FIVE = 5,
-  TEN = 10,
-  LAZY_ME = 15,
-}
-
-/* other stuff */
-enum FourBits : 4 {
-  ONE = 1,
-  TWO = 2,
-  THREE = 3,
-  FIVE = 5,
-  TEN = 10,
-  LAZY_ME = 15
-}
-
-packet Test {
-    /* Checksum */
-    _checksum_start_ (crc16),
-    /* Padding */
-    _padding_ [1],
-    /* Size */
-    _size_ (_payload_) : 1,
-    _size_ (_body_) : 1,
-    _size_ (id) : 1,
-    /* Body */
-    _body_,
-    /* Payload */
-    _payload_,
-    _payload_ : [+1],
-    /* Fixed */
-    _fixed_ = 1:1,
-    _fixed_ = id:id,
-    /* Reserved */
-    _reserved_ : 1,
-    /* Array */
-    id: 1[+1],
-    id: id[+1],
-    id: 1[1],
-    id: id[1],
-    id: 1[],
-    id: id[],
-    /* Scalar */
-    id: 1,
-    /* Typedef */
-    id : id,
-    /* Group */
-    id { a=1, b=2 },
-    id,
-}
-
-packet TestChild : Test {
-}
-
-packet TestChild (a=1, b=2) {
-}
-
-packet TestChild : Test (a=1, b=2) {
-}
-
-checksum id: 1 "id"
-
-custom_field id : 1 "id"
-custom_field id "id"
-
-test Test {
-    "1111",
-    "2222",
-}
diff --git a/tests/examples/fixed-field.pdl b/tests/examples/fixed-field.pdl
deleted file mode 100644
index e69fc7e..0000000
--- a/tests/examples/fixed-field.pdl
+++ /dev/null
@@ -1,22 +0,0 @@
-little_endian_packets
-
-enum Enum : 1 {
-    tag = 0,
-}
-
-packet InvalidValue {
-    _fixed_ = 1: 256,
-}
-
-packet UndeclaredEnum {
-    _fixed_ = tag : InvalidEnum,
-}
-
-packet UndeclaredTag {
-    _fixed_ = invalid_tag : Enum,
-}
-
-packet Correct {
-    _fixed_ = 1: 256,
-    _fixed_ = tag: Enum,
-}
diff --git a/tests/examples/group-constraint.pdl b/tests/examples/group-constraint.pdl
deleted file mode 100644
index 34ee2ab..0000000
--- a/tests/examples/group-constraint.pdl
+++ /dev/null
@@ -1,39 +0,0 @@
-little_endian_packets
-
-custom_field custom_field: 1 "custom"
-checksum checksum: 1 "checksum"
-
-enum Enum : 1 {
-    tag = 0,
-}
-
-group Group {
-    a: 4,
-    b: Enum,
-    c: custom_field,
-    d: checksum,
-}
-
-struct Undeclared {
-    Group { e=1 },
-}
-
-struct Redeclared {
-    Group { a=1, a=2 },
-}
-
-struct TypeMismatch {
-    Group { a=tag, b=1, c=1, d=1 },
-}
-
-struct InvalidLiteral {
-    Group { a=42 },
-}
-
-struct UndeclaredTag {
-    Group { b=undeclared_tag },
-}
-
-struct Correct {
-    Group { a=1, b=tag },
-}
diff --git a/tests/examples/packet.pdl b/tests/examples/packet.pdl
deleted file mode 100644
index 9b9ca20..0000000
--- a/tests/examples/packet.pdl
+++ /dev/null
@@ -1,52 +0,0 @@
-little_endian_packets
-
-custom_field custom: 1 "custom"
-checksum checksum: 1 "checksum"
-
-enum Enum : 1 {
-    tag = 0,
-}
-
-packet Packet {
-    a: 4,
-    b: Enum,
-    c: custom,
-    d: checksum,
-}
-
-struct Struct {
-    a: 4,
-}
-
-packet RecursivePacket_0 : RecursivePacket_1 {
-}
-
-packet RecursivePacket_1 : RecursivePacket_0 {
-}
-
-packet InvalidParent : Struct {
-}
-
-packet UndeclaredParent : FooBar {
-}
-
-packet UnnecessaryConstraints (a=1) {
-}
-
-packet Undeclared : Packet (c=1) {
-}
-
-packet Redeclared : Packet (a=1, a=2) {
-}
-
-packet TypeMismatch : Packet (a=tag, b=1, c=1, d=1) {
-}
-
-packet InvalidLiteral : Packet (a=42) {
-}
-
-packet UndeclaredTag : Packet (b=undeclared_tag) {
-}
-
-packet Correct : Packet (a=1, b=tag) {
-}
diff --git a/tests/examples/recurse.pdl b/tests/examples/recurse.pdl
deleted file mode 100644
index ad3a200..0000000
--- a/tests/examples/recurse.pdl
+++ /dev/null
@@ -1,38 +0,0 @@
-
-struct Struct_0: Struct_1 {
-}
-
-struct Struct_1: Struct_0 {
-}
-
-
-struct Packet_0: Packet_1 {
-}
-
-struct Packet_1: Packet_0 {
-}
-
-
-group Group_0 {
-    Group_1
-}
-
-struct Struct_2 {
-    Group_0
-}
-
-group Group_1 {
-    a: Struct_2
-}
-
-
-struct Struct_3: Struct_4 {
-}
-
-struct Struct_4 {
-    Group_2
-}
-
-group Group_2 {
-    a: Struct_3
-}
diff --git a/tests/examples/size-field.pdl b/tests/examples/size-field.pdl
deleted file mode 100644
index dfa9ad7..0000000
--- a/tests/examples/size-field.pdl
+++ /dev/null
@@ -1,58 +0,0 @@
-little_endian_packets
-
-packet Undefined {
-    _size_ (array): 8,
-}
-
-packet UndefinedPayloadWithBody {
-    _size_ (_payload_): 8,
-    _body_,
-}
-
-packet UndefinedPayload {
-    _size_ (_payload_): 8,
-}
-
-packet UndefinedBodyWithPayload {
-    _size_ (_body_): 8,
-    _payload_,
-}
-
-packet UndefinedBody {
-    _size_ (_body_): 8,
-}
-
-packet InvalidType {
-    _size_ (array): 8,
-    array: 16,
-}
-
-packet InvalidArrayOrder {
-    array: 16[],
-    _size_ (array): 8,
-}
-
-packet InvalidPayloadOrder {
-    _payload_,
-    _size_ (_payload_): 8,
-}
-
-packet InvalidBodyOrder {
-    _body_,
-    _size_ (_body_): 8,
-}
-
-packet CorrectArray {
-    _size_ (array): 8,
-    array: 16[],
-}
-
-packet CorrectPayload {
-    _size_ (_payload_): 8,
-    _payload_,
-}
-
-packet CorrectBody {
-    _size_ (_body_): 8,
-    _body_,
-}
diff --git a/tests/examples/struct.pdl b/tests/examples/struct.pdl
deleted file mode 100644
index d8ed439..0000000
--- a/tests/examples/struct.pdl
+++ /dev/null
@@ -1,52 +0,0 @@
-little_endian_packets
-
-custom_field custom: 1 "custom"
-checksum checksum: 1 "checksum"
-
-enum Enum : 1 {
-    tag = 0,
-}
-
-struct Struct {
-    a: 4,
-    b: Enum,
-    c: custom,
-    d: checksum,
-}
-
-packet Packet {
-    a: 4,
-}
-
-struct RecursiveStruct_0 : RecursiveStruct_1 {
-}
-
-struct RecursiveStruct_1 : RecursiveStruct_0 {
-}
-
-struct InvalidParent : Packet {
-}
-
-struct UndeclaredParent : FooBar {
-}
-
-struct UnnecessaryConstraints (a=1) {
-}
-
-struct Undeclared : Struct (c=1) {
-}
-
-struct Redeclared : Struct (a=1, a=2) {
-}
-
-struct TypeMismatch : Struct (a=tag, b=1, c=1, d=1) {
-}
-
-struct InvalidLiteral : Struct (a=42) {
-}
-
-struct UndeclaredTag : Struct (b=undeclared_tag) {
-}
-
-struct Correct : Struct (a=1, b=tag) {
-}
diff --git a/tests/examples/typedef-field.pdl b/tests/examples/typedef-field.pdl
deleted file mode 100644
index 2e56676..0000000
--- a/tests/examples/typedef-field.pdl
+++ /dev/null
@@ -1,36 +0,0 @@
-little_endian_packets
-
-custom_field custom: 1 "custom"
-checksum checksum: 1 "checksum"
-
-enum Enum : 1 {
-    tag = 0,
-}
-
-struct Struct {
-    a: 1,
-}
-
-packet Packet {
-    a: 1,
-}
-
-group Group {
-    a: 1,
-}
-
-packet InvalidKind {
-    typedef_0: Group,
-    typedef_1: Packet,
-}
-
-packet UndeclaredType {
-    typedef: Unknown,
-}
-
-packet Correct {
-    typedef_0: custom,
-    typedef_1: checksum,
-    typedef_2: Enum,
-    typedef_3: Struct,
-}
diff --git a/tests/generated/custom_field_declaration_big_endian.rs b/tests/generated/custom_field_declaration_big_endian.rs
index 31fa603..8046f5a 100644
--- a/tests/generated/custom_field_declaration_big_endian.rs
+++ b/tests/generated/custom_field_declaration_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
diff --git a/tests/generated/custom_field_declaration_little_endian.rs b/tests/generated/custom_field_declaration_little_endian.rs
index 31fa603..8046f5a 100644
--- a/tests/generated/custom_field_declaration_little_endian.rs
+++ b/tests/generated/custom_field_declaration_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
diff --git a/tests/generated/enum_declaration_big_endian.rs b/tests/generated/enum_declaration_big_endian.rs
index 87b5d0e..badb3f0 100644
--- a/tests/generated/enum_declaration_big_endian.rs
+++ b/tests/generated/enum_declaration_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
diff --git a/tests/generated/enum_declaration_little_endian.rs b/tests/generated/enum_declaration_little_endian.rs
index 87b5d0e..badb3f0 100644
--- a/tests/generated/enum_declaration_little_endian.rs
+++ b/tests/generated/enum_declaration_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
diff --git a/tests/generated/packet_decl_24bit_enum_array_big_endian.rs b/tests/generated/packet_decl_24bit_enum_array_big_endian.rs
index bd352ef..47b45dc 100644
--- a/tests/generated/packet_decl_24bit_enum_array_big_endian.rs
+++ b/tests/generated/packet_decl_24bit_enum_array_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -99,7 +98,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -178,13 +177,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &[Foo; 5] {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -195,7 +194,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_enum_array_little_endian.rs b/tests/generated/packet_decl_24bit_enum_array_little_endian.rs
index 5027984..a413ce1 100644
--- a/tests/generated/packet_decl_24bit_enum_array_little_endian.rs
+++ b/tests/generated/packet_decl_24bit_enum_array_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -99,7 +98,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -178,13 +177,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &[Foo; 5] {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -195,7 +194,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_enum_big_endian.rs b/tests/generated/packet_decl_24bit_enum_big_endian.rs
index d2b63be..c63b562 100644
--- a/tests/generated/packet_decl_24bit_enum_big_endian.rs
+++ b/tests/generated/packet_decl_24bit_enum_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -99,7 +98,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -170,13 +169,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> Foo {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -187,7 +186,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_enum_little_endian.rs b/tests/generated/packet_decl_24bit_enum_little_endian.rs
index 40f9894..2e58a9e 100644
--- a/tests/generated/packet_decl_24bit_enum_little_endian.rs
+++ b/tests/generated/packet_decl_24bit_enum_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -99,7 +98,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -170,13 +169,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> Foo {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -187,7 +186,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_scalar_array_big_endian.rs b/tests/generated/packet_decl_24bit_scalar_array_big_endian.rs
index eaa7537..193c5e5 100644
--- a/tests/generated/packet_decl_24bit_scalar_array_big_endian.rs
+++ b/tests/generated/packet_decl_24bit_scalar_array_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -124,13 +123,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> &[u32; 5] {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -141,7 +140,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_scalar_array_little_endian.rs b/tests/generated/packet_decl_24bit_scalar_array_little_endian.rs
index f987846..fafba2c 100644
--- a/tests/generated/packet_decl_24bit_scalar_array_little_endian.rs
+++ b/tests/generated/packet_decl_24bit_scalar_array_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -124,13 +123,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> &[u32; 5] {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -141,7 +140,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_scalar_big_endian.rs b/tests/generated/packet_decl_24bit_scalar_big_endian.rs
index e5aa0e2..15e76b0 100644
--- a/tests/generated/packet_decl_24bit_scalar_big_endian.rs
+++ b/tests/generated/packet_decl_24bit_scalar_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -121,13 +120,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u32 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -138,7 +137,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_24bit_scalar_little_endian.rs b/tests/generated/packet_decl_24bit_scalar_little_endian.rs
index c9a65ed..77ede78 100644
--- a/tests/generated/packet_decl_24bit_scalar_little_endian.rs
+++ b/tests/generated/packet_decl_24bit_scalar_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -121,13 +120,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u32 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -138,7 +137,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_enum_array_big_endian.rs b/tests/generated/packet_decl_64bit_enum_array_big_endian.rs
index 6940901..dd28666 100644
--- a/tests/generated/packet_decl_64bit_enum_array_big_endian.rs
+++ b/tests/generated/packet_decl_64bit_enum_array_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -84,7 +83,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -163,13 +162,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &[Foo; 7] {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -180,7 +179,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_enum_array_little_endian.rs b/tests/generated/packet_decl_64bit_enum_array_little_endian.rs
index a7008b3..371c1eb 100644
--- a/tests/generated/packet_decl_64bit_enum_array_little_endian.rs
+++ b/tests/generated/packet_decl_64bit_enum_array_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -84,7 +83,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -163,13 +162,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &[Foo; 7] {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -180,7 +179,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_enum_big_endian.rs b/tests/generated/packet_decl_64bit_enum_big_endian.rs
index a8f182c..bd46742 100644
--- a/tests/generated/packet_decl_64bit_enum_big_endian.rs
+++ b/tests/generated/packet_decl_64bit_enum_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -84,7 +83,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -155,13 +154,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> Foo {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -172,7 +171,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_enum_little_endian.rs b/tests/generated/packet_decl_64bit_enum_little_endian.rs
index 8fa8467..75a43b6 100644
--- a/tests/generated/packet_decl_64bit_enum_little_endian.rs
+++ b/tests/generated/packet_decl_64bit_enum_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -84,7 +83,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -155,13 +154,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> Foo {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -172,7 +171,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_scalar_array_big_endian.rs b/tests/generated/packet_decl_64bit_scalar_array_big_endian.rs
index d162424..b4816d6 100644
--- a/tests/generated/packet_decl_64bit_scalar_array_big_endian.rs
+++ b/tests/generated/packet_decl_64bit_scalar_array_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -124,13 +123,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> &[u64; 7] {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -141,7 +140,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_scalar_array_little_endian.rs b/tests/generated/packet_decl_64bit_scalar_array_little_endian.rs
index 5d8c77e..b6c3423 100644
--- a/tests/generated/packet_decl_64bit_scalar_array_little_endian.rs
+++ b/tests/generated/packet_decl_64bit_scalar_array_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -124,13 +123,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> &[u64; 7] {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -141,7 +140,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_scalar_big_endian.rs b/tests/generated/packet_decl_64bit_scalar_big_endian.rs
index 176a4af..1cda594 100644
--- a/tests/generated/packet_decl_64bit_scalar_big_endian.rs
+++ b/tests/generated/packet_decl_64bit_scalar_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -118,13 +117,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u64 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -135,7 +134,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_64bit_scalar_little_endian.rs b/tests/generated/packet_decl_64bit_scalar_little_endian.rs
index 3f26f6c..10e62d4 100644
--- a/tests/generated/packet_decl_64bit_scalar_little_endian.rs
+++ b/tests/generated/packet_decl_64bit_scalar_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -118,13 +117,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u64 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -135,7 +134,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_enum_array_big_endian.rs b/tests/generated/packet_decl_8bit_enum_array_big_endian.rs
index ef47d85..4c16ddf 100644
--- a/tests/generated/packet_decl_8bit_enum_array_big_endian.rs
+++ b/tests/generated/packet_decl_8bit_enum_array_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -114,7 +113,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -193,13 +192,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &[Foo; 3] {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -210,7 +209,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_enum_array_little_endian.rs b/tests/generated/packet_decl_8bit_enum_array_little_endian.rs
index ef47d85..4c16ddf 100644
--- a/tests/generated/packet_decl_8bit_enum_array_little_endian.rs
+++ b/tests/generated/packet_decl_8bit_enum_array_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -114,7 +113,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -193,13 +192,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &[Foo; 3] {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -210,7 +209,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_enum_big_endian.rs b/tests/generated/packet_decl_8bit_enum_big_endian.rs
index b3c4979..8ceb132 100644
--- a/tests/generated/packet_decl_8bit_enum_big_endian.rs
+++ b/tests/generated/packet_decl_8bit_enum_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -114,7 +113,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -185,13 +184,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> Foo {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -202,7 +201,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_enum_little_endian.rs b/tests/generated/packet_decl_8bit_enum_little_endian.rs
index b3c4979..8ceb132 100644
--- a/tests/generated/packet_decl_8bit_enum_little_endian.rs
+++ b/tests/generated/packet_decl_8bit_enum_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -114,7 +113,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -185,13 +184,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> Foo {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -202,7 +201,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_scalar_array_big_endian.rs b/tests/generated/packet_decl_8bit_scalar_array_big_endian.rs
index a1915a2..518a775 100644
--- a/tests/generated/packet_decl_8bit_scalar_array_big_endian.rs
+++ b/tests/generated/packet_decl_8bit_scalar_array_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -124,13 +123,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> &[u8; 3] {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -141,7 +140,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_scalar_array_little_endian.rs b/tests/generated/packet_decl_8bit_scalar_array_little_endian.rs
index a1915a2..518a775 100644
--- a/tests/generated/packet_decl_8bit_scalar_array_little_endian.rs
+++ b/tests/generated/packet_decl_8bit_scalar_array_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -124,13 +123,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> &[u8; 3] {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -141,7 +140,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_scalar_big_endian.rs b/tests/generated/packet_decl_8bit_scalar_big_endian.rs
index ae3515a..19b51a9 100644
--- a/tests/generated/packet_decl_8bit_scalar_big_endian.rs
+++ b/tests/generated/packet_decl_8bit_scalar_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -118,13 +117,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u8 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -135,7 +134,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_8bit_scalar_little_endian.rs b/tests/generated/packet_decl_8bit_scalar_little_endian.rs
index ae3515a..19b51a9 100644
--- a/tests/generated/packet_decl_8bit_scalar_little_endian.rs
+++ b/tests/generated/packet_decl_8bit_scalar_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -118,13 +117,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u8 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -135,7 +134,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { x: self.x });
+        let foo = FooData { x: self.x };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_dynamic_count_big_endian.rs b/tests/generated/packet_decl_array_dynamic_count_big_endian.rs
index c9a5e22..e1887d6 100644
--- a/tests/generated/packet_decl_array_dynamic_count_big_endian.rs
+++ b/tests/generated/packet_decl_array_dynamic_count_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -54,7 +53,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -144,16 +143,16 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_padding(&self) -> u8 {
-        self.foo.as_ref().padding
+        self.foo.padding
     }
     pub fn get_x(&self) -> &Vec<u32> {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -164,10 +163,10 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             padding: self.padding,
             x: self.x,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_dynamic_count_little_endian.rs b/tests/generated/packet_decl_array_dynamic_count_little_endian.rs
index 7a9f27f..a7fcdd1 100644
--- a/tests/generated/packet_decl_array_dynamic_count_little_endian.rs
+++ b/tests/generated/packet_decl_array_dynamic_count_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -54,7 +53,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -144,16 +143,16 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_padding(&self) -> u8 {
-        self.foo.as_ref().padding
+        self.foo.padding
     }
     pub fn get_x(&self) -> &Vec<u32> {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -164,10 +163,10 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             padding: self.padding,
             x: self.x,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_dynamic_size_big_endian.rs b/tests/generated/packet_decl_array_dynamic_size_big_endian.rs
index ec48736..934b21f 100644
--- a/tests/generated/packet_decl_array_dynamic_size_big_endian.rs
+++ b/tests/generated/packet_decl_array_dynamic_size_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -54,7 +53,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -155,16 +154,16 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_padding(&self) -> u8 {
-        self.foo.as_ref().padding
+        self.foo.padding
     }
     pub fn get_x(&self) -> &Vec<u32> {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -175,10 +174,10 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             padding: self.padding,
             x: self.x,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_dynamic_size_little_endian.rs b/tests/generated/packet_decl_array_dynamic_size_little_endian.rs
index cec18ee..d56c554 100644
--- a/tests/generated/packet_decl_array_dynamic_size_little_endian.rs
+++ b/tests/generated/packet_decl_array_dynamic_size_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -54,7 +53,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -155,16 +154,16 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_padding(&self) -> u8 {
-        self.foo.as_ref().padding
+        self.foo.padding
     }
     pub fn get_x(&self) -> &Vec<u32> {
-        &self.foo.as_ref().x
+        &self.foo.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -175,10 +174,10 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             padding: self.padding,
             x: self.x,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_big_endian.rs b/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_big_endian.rs
index b57eb29..0ddc911 100644
--- a/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_big_endian.rs
+++ b/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -107,7 +106,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -184,13 +183,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &Vec<Foo> {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -201,7 +200,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_little_endian.rs b/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_little_endian.rs
index 3fb7990..86a85e4 100644
--- a/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_little_endian.rs
+++ b/tests/generated/packet_decl_array_unknown_element_width_dynamic_count_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -107,7 +106,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -184,13 +183,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &Vec<Foo> {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -201,7 +200,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_big_endian.rs b/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_big_endian.rs
index ee4459e..bd67530 100644
--- a/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_big_endian.rs
+++ b/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -107,7 +106,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -196,13 +195,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &Vec<Foo> {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -213,7 +212,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_little_endian.rs b/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_little_endian.rs
index a0605eb..c41a8d4 100644
--- a/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_little_endian.rs
+++ b/tests/generated/packet_decl_array_unknown_element_width_dynamic_size_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -107,7 +106,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -196,13 +195,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_x(&self) -> &Vec<Foo> {
-        &self.bar.as_ref().x
+        &self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -213,7 +212,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
+        let bar = BarData { x: self.x };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_with_padding_big_endian.rs b/tests/generated/packet_decl_array_with_padding_big_endian.rs
index 36b5571..e45dc03 100644
--- a/tests/generated/packet_decl_array_with_padding_big_endian.rs
+++ b/tests/generated/packet_decl_array_with_padding_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -107,7 +106,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -188,13 +187,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_a(&self) -> &Vec<Foo> {
-        &self.bar.as_ref().a
+        &self.bar.a
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -205,7 +204,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { a: self.a });
+        let bar = BarData { a: self.a };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_array_with_padding_little_endian.rs b/tests/generated/packet_decl_array_with_padding_little_endian.rs
index 53cec92..bd1aae0 100644
--- a/tests/generated/packet_decl_array_with_padding_little_endian.rs
+++ b/tests/generated/packet_decl_array_with_padding_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -107,7 +106,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -188,13 +187,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = BarData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(bar: Arc<BarData>) -> Result<Self> {
+    fn new(bar: BarData) -> Result<Self> {
         Ok(Self { bar })
     }
     pub fn get_a(&self) -> &Vec<Foo> {
-        &self.bar.as_ref().a
+        &self.bar.a
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -205,7 +204,7 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { a: self.a });
+        let bar = BarData { a: self.a };
         Bar::new(bar).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_child_packets_big_endian.rs b/tests/generated/packet_decl_child_packets_big_endian.rs
index e8468a7..7a000c7 100644
--- a/tests/generated/packet_decl_child_packets_big_endian.rs
+++ b/tests/generated/packet_decl_child_packets_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -98,8 +97,8 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum FooDataChild {
-    Bar(Arc<BarData>),
-    Baz(Arc<BazData>),
+    Bar(BarData),
+    Baz(BazData),
     Payload(Bytes),
     None,
 }
@@ -132,7 +131,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -194,12 +193,12 @@
             (100, _) if BarData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = BarData::parse_inner(&mut cell)?;
-                FooDataChild::Bar(Arc::new(child_data))
+                FooDataChild::Bar(child_data)
             }
             (_, Enum16::B) if BazData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = BazData::parse_inner(&mut cell)?;
-                FooDataChild::Baz(Arc::new(child_data))
+                FooDataChild::Baz(child_data)
             }
             _ if !payload.is_empty() => {
                 FooDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -260,7 +259,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -270,14 +269,14 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Enum16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -288,14 +287,14 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
@@ -313,9 +312,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -392,9 +391,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         let bar = match &foo.child {
             FooDataChild::Bar(value) => value.clone(),
             _ => {
@@ -407,13 +406,13 @@
         Ok(Self { foo, bar })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Enum16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_x(&self) -> u8 {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -424,12 +423,12 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
-        let foo = Arc::new(FooData {
+        let bar = BarData { x: self.x };
+        let foo = FooData {
             a: 100,
             b: self.b,
             child: FooDataChild::Bar(bar),
-        });
+        };
         Bar::new(foo).unwrap()
     }
 }
@@ -452,9 +451,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Baz {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    baz: Arc<BazData>,
+    baz: BazData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -531,9 +530,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         let baz = match &foo.child {
             FooDataChild::Baz(value) => value.clone(),
             _ => {
@@ -546,13 +545,13 @@
         Ok(Self { foo, baz })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Enum16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_y(&self) -> u16 {
-        self.baz.as_ref().y
+        self.baz.y
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.baz.write_to(buffer)
@@ -563,12 +562,12 @@
 }
 impl BazBuilder {
     pub fn build(self) -> Baz {
-        let baz = Arc::new(BazData { y: self.y });
-        let foo = Arc::new(FooData {
+        let baz = BazData { y: self.y };
+        let foo = FooData {
             a: self.a,
             b: Enum16::B,
             child: FooDataChild::Baz(baz),
-        });
+        };
         Baz::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_child_packets_little_endian.rs b/tests/generated/packet_decl_child_packets_little_endian.rs
index bbbb261..7fe9783 100644
--- a/tests/generated/packet_decl_child_packets_little_endian.rs
+++ b/tests/generated/packet_decl_child_packets_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -98,8 +97,8 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum FooDataChild {
-    Bar(Arc<BarData>),
-    Baz(Arc<BazData>),
+    Bar(BarData),
+    Baz(BazData),
     Payload(Bytes),
     None,
 }
@@ -132,7 +131,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -194,12 +193,12 @@
             (100, _) if BarData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = BarData::parse_inner(&mut cell)?;
-                FooDataChild::Bar(Arc::new(child_data))
+                FooDataChild::Bar(child_data)
             }
             (_, Enum16::B) if BazData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = BazData::parse_inner(&mut cell)?;
-                FooDataChild::Baz(Arc::new(child_data))
+                FooDataChild::Baz(child_data)
             }
             _ if !payload.is_empty() => {
                 FooDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -260,7 +259,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -270,14 +269,14 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Enum16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -288,14 +287,14 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
@@ -313,9 +312,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Bar {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    bar: Arc<BarData>,
+    bar: BarData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -392,9 +391,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         let bar = match &foo.child {
             FooDataChild::Bar(value) => value.clone(),
             _ => {
@@ -407,13 +406,13 @@
         Ok(Self { foo, bar })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Enum16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_x(&self) -> u8 {
-        self.bar.as_ref().x
+        self.bar.x
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.bar.write_to(buffer)
@@ -424,12 +423,12 @@
 }
 impl BarBuilder {
     pub fn build(self) -> Bar {
-        let bar = Arc::new(BarData { x: self.x });
-        let foo = Arc::new(FooData {
+        let bar = BarData { x: self.x };
+        let foo = FooData {
             a: 100,
             b: self.b,
             child: FooDataChild::Bar(bar),
-        });
+        };
         Bar::new(foo).unwrap()
     }
 }
@@ -452,9 +451,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Baz {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    baz: Arc<BazData>,
+    baz: BazData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -531,9 +530,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         let baz = match &foo.child {
             FooDataChild::Baz(value) => value.clone(),
             _ => {
@@ -546,13 +545,13 @@
         Ok(Self { foo, baz })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Enum16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_y(&self) -> u16 {
-        self.baz.as_ref().y
+        self.baz.y
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.baz.write_to(buffer)
@@ -563,12 +562,12 @@
 }
 impl BazBuilder {
     pub fn build(self) -> Baz {
-        let baz = Arc::new(BazData { y: self.y });
-        let foo = Arc::new(FooData {
+        let baz = BazData { y: self.y };
+        let foo = FooData {
             a: self.a,
             b: Enum16::B,
             child: FooDataChild::Baz(baz),
-        });
+        };
         Baz::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_complex_scalars_big_endian.rs b/tests/generated/packet_decl_complex_scalars_big_endian.rs
index 688af42..be97361 100644
--- a/tests/generated/packet_decl_complex_scalars_big_endian.rs
+++ b/tests/generated/packet_decl_complex_scalars_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -58,7 +57,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -168,28 +167,28 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> u8 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_c(&self) -> u8 {
-        self.foo.as_ref().c
+        self.foo.c
     }
     pub fn get_d(&self) -> u32 {
-        self.foo.as_ref().d
+        self.foo.d
     }
     pub fn get_e(&self) -> u16 {
-        self.foo.as_ref().e
+        self.foo.e
     }
     pub fn get_f(&self) -> u8 {
-        self.foo.as_ref().f
+        self.foo.f
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -200,14 +199,14 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             c: self.c,
             d: self.d,
             e: self.e,
             f: self.f,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_complex_scalars_little_endian.rs b/tests/generated/packet_decl_complex_scalars_little_endian.rs
index 83da632..7ccee61 100644
--- a/tests/generated/packet_decl_complex_scalars_little_endian.rs
+++ b/tests/generated/packet_decl_complex_scalars_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -58,7 +57,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -168,28 +167,28 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> u8 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_c(&self) -> u8 {
-        self.foo.as_ref().c
+        self.foo.c
     }
     pub fn get_d(&self) -> u32 {
-        self.foo.as_ref().d
+        self.foo.d
     }
     pub fn get_e(&self) -> u16 {
-        self.foo.as_ref().e
+        self.foo.e
     }
     pub fn get_f(&self) -> u8 {
-        self.foo.as_ref().f
+        self.foo.f
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -200,14 +199,14 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             c: self.c,
             d: self.d,
             e: self.e,
             f: self.f,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_custom_field_big_endian.rs b/tests/generated/packet_decl_custom_field_big_endian.rs
index 72bb2c6..7b7dc9a 100644
--- a/tests/generated/packet_decl_custom_field_big_endian.rs
+++ b/tests/generated/packet_decl_custom_field_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -93,7 +92,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -154,16 +153,16 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> Bar1 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Bar2 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -174,7 +173,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { a: self.a, b: self.b });
+        let foo = FooData { a: self.a, b: self.b };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_custom_field_little_endian.rs b/tests/generated/packet_decl_custom_field_little_endian.rs
index 600bab6..d805403 100644
--- a/tests/generated/packet_decl_custom_field_little_endian.rs
+++ b/tests/generated/packet_decl_custom_field_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -93,7 +92,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -154,16 +153,16 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> Bar1 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> Bar2 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -174,7 +173,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { a: self.a, b: self.b });
+        let foo = FooData { a: self.a, b: self.b };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_empty_big_endian.rs b/tests/generated/packet_decl_empty_big_endian.rs
index d05c2ff..eb0b173 100644
--- a/tests/generated/packet_decl_empty_big_endian.rs
+++ b/tests/generated/packet_decl_empty_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -51,7 +50,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -104,9 +103,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     fn write_to(&self, buffer: &mut BytesMut) {
@@ -118,7 +117,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {});
+        let foo = FooData {};
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_empty_little_endian.rs b/tests/generated/packet_decl_empty_little_endian.rs
index d05c2ff..eb0b173 100644
--- a/tests/generated/packet_decl_empty_little_endian.rs
+++ b/tests/generated/packet_decl_empty_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -51,7 +50,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -104,9 +103,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     fn write_to(&self, buffer: &mut BytesMut) {
@@ -118,7 +117,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {});
+        let foo = FooData {};
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_fixed_enum_field_big_endian.rs b/tests/generated/packet_decl_fixed_enum_field_big_endian.rs
index 8683e02..2ec6b58 100644
--- a/tests/generated/packet_decl_fixed_enum_field_big_endian.rs
+++ b/tests/generated/packet_decl_fixed_enum_field_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -119,7 +118,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -198,13 +197,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_b(&self) -> u64 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -215,7 +214,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { b: self.b });
+        let foo = FooData { b: self.b };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_fixed_enum_field_little_endian.rs b/tests/generated/packet_decl_fixed_enum_field_little_endian.rs
index f598d3e..13aecd9 100644
--- a/tests/generated/packet_decl_fixed_enum_field_little_endian.rs
+++ b/tests/generated/packet_decl_fixed_enum_field_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -119,7 +118,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -198,13 +197,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_b(&self) -> u64 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -215,7 +214,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { b: self.b });
+        let foo = FooData { b: self.b };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_fixed_scalar_field_big_endian.rs b/tests/generated/packet_decl_fixed_scalar_field_big_endian.rs
index a44732e..e047669 100644
--- a/tests/generated/packet_decl_fixed_scalar_field_big_endian.rs
+++ b/tests/generated/packet_decl_fixed_scalar_field_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -132,13 +131,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_b(&self) -> u64 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -149,7 +148,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { b: self.b });
+        let foo = FooData { b: self.b };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_fixed_scalar_field_little_endian.rs b/tests/generated/packet_decl_fixed_scalar_field_little_endian.rs
index d2c7985..39922ca 100644
--- a/tests/generated/packet_decl_fixed_scalar_field_little_endian.rs
+++ b/tests/generated/packet_decl_fixed_scalar_field_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -53,7 +52,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -132,13 +131,13 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_b(&self) -> u64 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -149,7 +148,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData { b: self.b });
+        let foo = FooData { b: self.b };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_grand_children_big_endian.rs b/tests/generated/packet_decl_grand_children_big_endian.rs
index 33432f3..896a46f 100644
--- a/tests/generated/packet_decl_grand_children_big_endian.rs
+++ b/tests/generated/packet_decl_grand_children_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -98,7 +97,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ParentDataChild {
-    Child(Arc<ChildData>),
+    Child(ChildData),
     Payload(Bytes),
     None,
 }
@@ -130,7 +129,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Parent {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -213,7 +212,7 @@
             (Enum16::A) if ChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = ChildData::parse_inner(&mut cell, bar, baz)?;
-                ParentDataChild::Child(Arc::new(child_data))
+                ParentDataChild::Child(child_data)
             }
             _ if !payload.is_empty() => {
                 ParentDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -274,7 +273,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ParentChild {
         match &self.parent.child {
@@ -285,17 +284,17 @@
             ParentDataChild::None => ParentChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         Ok(Self { parent })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.parent.write_to(buffer)
@@ -306,7 +305,7 @@
 }
 impl ParentBuilder {
     pub fn build(self) -> Parent {
-        let parent = Arc::new(ParentData {
+        let parent = ParentData {
             bar: self.bar,
             baz: self.baz,
             foo: self.foo,
@@ -314,7 +313,7 @@
                 None => ParentDataChild::None,
                 Some(bytes) => ParentDataChild::Payload(bytes),
             },
-        });
+        };
         Parent::new(parent).unwrap()
     }
 }
@@ -326,7 +325,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ChildDataChild {
-    GrandChild(Arc<GrandChildData>),
+    GrandChild(GrandChildData),
     Payload(Bytes),
     None,
 }
@@ -356,9 +355,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Child {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -402,7 +401,7 @@
             (Enum16::A, Enum16::A) if GrandChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = GrandChildData::parse_inner(&mut cell, baz)?;
-                ChildDataChild::GrandChild(Arc::new(child_data))
+                ChildDataChild::GrandChild(child_data)
             }
             _ if !payload.is_empty() => {
                 ChildDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -465,7 +464,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ChildChild {
         match &self.child.child {
@@ -476,7 +475,7 @@
             ChildDataChild::None => ChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -489,16 +488,16 @@
         Ok(Self { parent, child })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     pub fn get_quux(&self) -> Enum16 {
-        self.child.as_ref().quux
+        self.child.quux
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.child.write_to(buffer)
@@ -509,19 +508,19 @@
 }
 impl ChildBuilder {
     pub fn build(self) -> Child {
-        let child = Arc::new(ChildData {
+        let child = ChildData {
             quux: self.quux,
             child: match self.payload {
                 None => ChildDataChild::None,
                 Some(bytes) => ChildDataChild::Payload(bytes),
             },
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             bar: self.bar,
             baz: self.baz,
             foo: Enum16::A,
             child: ParentDataChild::Child(child),
-        });
+        };
         Child::new(parent).unwrap()
     }
 }
@@ -538,7 +537,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum GrandChildDataChild {
-    GrandGrandChild(Arc<GrandGrandChildData>),
+    GrandGrandChild(GrandGrandChildData),
     Payload(Bytes),
     None,
 }
@@ -567,11 +566,11 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct GrandChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    grandchild: Arc<GrandChildData>,
+    grandchild: GrandChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -595,7 +594,7 @@
             (Enum16::A) if GrandGrandChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = GrandGrandChildData::parse_inner(&mut cell)?;
-                GrandChildDataChild::GrandGrandChild(Arc::new(child_data))
+                GrandChildDataChild::GrandGrandChild(child_data)
             }
             _ if !payload.is_empty() => {
                 GrandChildDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -662,7 +661,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> GrandChildChild {
         match &self.grandchild.child {
@@ -677,7 +676,7 @@
             GrandChildDataChild::None => GrandChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -699,16 +698,16 @@
         Ok(Self { parent, child, grandchild })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     pub fn get_quux(&self) -> Enum16 {
-        self.child.as_ref().quux
+        self.child.quux
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.grandchild.write_to(buffer)
@@ -719,22 +718,22 @@
 }
 impl GrandChildBuilder {
     pub fn build(self) -> GrandChild {
-        let grandchild = Arc::new(GrandChildData {
+        let grandchild = GrandChildData {
             child: match self.payload {
                 None => GrandChildDataChild::None,
                 Some(bytes) => GrandChildDataChild::Payload(bytes),
             },
-        });
-        let child = Arc::new(ChildData {
+        };
+        let child = ChildData {
             quux: Enum16::A,
             child: ChildDataChild::GrandChild(grandchild),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             bar: Enum16::A,
             baz: self.baz,
             foo: Enum16::A,
             child: ParentDataChild::Child(child),
-        });
+        };
         GrandChild::new(parent).unwrap()
     }
 }
@@ -782,13 +781,13 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct GrandGrandChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    grandchild: Arc<GrandChildData>,
+    grandchild: GrandChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    grandgrandchild: Arc<GrandGrandChildData>,
+    grandgrandchild: GrandGrandChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -877,7 +876,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> GrandGrandChildChild {
         match &self.grandgrandchild.child {
@@ -887,7 +886,7 @@
             GrandGrandChildDataChild::None => GrandGrandChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -923,16 +922,16 @@
         })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     pub fn get_quux(&self) -> Enum16 {
-        self.child.as_ref().quux
+        self.child.quux
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.grandgrandchild.child {
@@ -949,25 +948,25 @@
 }
 impl GrandGrandChildBuilder {
     pub fn build(self) -> GrandGrandChild {
-        let grandgrandchild = Arc::new(GrandGrandChildData {
+        let grandgrandchild = GrandGrandChildData {
             child: match self.payload {
                 None => GrandGrandChildDataChild::None,
                 Some(bytes) => GrandGrandChildDataChild::Payload(bytes),
             },
-        });
-        let grandchild = Arc::new(GrandChildData {
+        };
+        let grandchild = GrandChildData {
             child: GrandChildDataChild::GrandGrandChild(grandgrandchild),
-        });
-        let child = Arc::new(ChildData {
+        };
+        let child = ChildData {
             quux: Enum16::A,
             child: ChildDataChild::GrandChild(grandchild),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             bar: Enum16::A,
             baz: Enum16::A,
             foo: Enum16::A,
             child: ParentDataChild::Child(child),
-        });
+        };
         GrandGrandChild::new(parent).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_grand_children_little_endian.rs b/tests/generated/packet_decl_grand_children_little_endian.rs
index c223814..4a672a6 100644
--- a/tests/generated/packet_decl_grand_children_little_endian.rs
+++ b/tests/generated/packet_decl_grand_children_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -98,7 +97,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ParentDataChild {
-    Child(Arc<ChildData>),
+    Child(ChildData),
     Payload(Bytes),
     None,
 }
@@ -130,7 +129,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Parent {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -213,7 +212,7 @@
             (Enum16::A) if ChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = ChildData::parse_inner(&mut cell, bar, baz)?;
-                ParentDataChild::Child(Arc::new(child_data))
+                ParentDataChild::Child(child_data)
             }
             _ if !payload.is_empty() => {
                 ParentDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -274,7 +273,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ParentChild {
         match &self.parent.child {
@@ -285,17 +284,17 @@
             ParentDataChild::None => ParentChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         Ok(Self { parent })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.parent.write_to(buffer)
@@ -306,7 +305,7 @@
 }
 impl ParentBuilder {
     pub fn build(self) -> Parent {
-        let parent = Arc::new(ParentData {
+        let parent = ParentData {
             bar: self.bar,
             baz: self.baz,
             foo: self.foo,
@@ -314,7 +313,7 @@
                 None => ParentDataChild::None,
                 Some(bytes) => ParentDataChild::Payload(bytes),
             },
-        });
+        };
         Parent::new(parent).unwrap()
     }
 }
@@ -326,7 +325,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ChildDataChild {
-    GrandChild(Arc<GrandChildData>),
+    GrandChild(GrandChildData),
     Payload(Bytes),
     None,
 }
@@ -356,9 +355,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Child {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -402,7 +401,7 @@
             (Enum16::A, Enum16::A) if GrandChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = GrandChildData::parse_inner(&mut cell, baz)?;
-                ChildDataChild::GrandChild(Arc::new(child_data))
+                ChildDataChild::GrandChild(child_data)
             }
             _ if !payload.is_empty() => {
                 ChildDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -465,7 +464,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ChildChild {
         match &self.child.child {
@@ -476,7 +475,7 @@
             ChildDataChild::None => ChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -489,16 +488,16 @@
         Ok(Self { parent, child })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     pub fn get_quux(&self) -> Enum16 {
-        self.child.as_ref().quux
+        self.child.quux
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.child.write_to(buffer)
@@ -509,19 +508,19 @@
 }
 impl ChildBuilder {
     pub fn build(self) -> Child {
-        let child = Arc::new(ChildData {
+        let child = ChildData {
             quux: self.quux,
             child: match self.payload {
                 None => ChildDataChild::None,
                 Some(bytes) => ChildDataChild::Payload(bytes),
             },
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             bar: self.bar,
             baz: self.baz,
             foo: Enum16::A,
             child: ParentDataChild::Child(child),
-        });
+        };
         Child::new(parent).unwrap()
     }
 }
@@ -538,7 +537,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum GrandChildDataChild {
-    GrandGrandChild(Arc<GrandGrandChildData>),
+    GrandGrandChild(GrandGrandChildData),
     Payload(Bytes),
     None,
 }
@@ -567,11 +566,11 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct GrandChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    grandchild: Arc<GrandChildData>,
+    grandchild: GrandChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -595,7 +594,7 @@
             (Enum16::A) if GrandGrandChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = GrandGrandChildData::parse_inner(&mut cell)?;
-                GrandChildDataChild::GrandGrandChild(Arc::new(child_data))
+                GrandChildDataChild::GrandGrandChild(child_data)
             }
             _ if !payload.is_empty() => {
                 GrandChildDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -662,7 +661,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> GrandChildChild {
         match &self.grandchild.child {
@@ -677,7 +676,7 @@
             GrandChildDataChild::None => GrandChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -699,16 +698,16 @@
         Ok(Self { parent, child, grandchild })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     pub fn get_quux(&self) -> Enum16 {
-        self.child.as_ref().quux
+        self.child.quux
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.grandchild.write_to(buffer)
@@ -719,22 +718,22 @@
 }
 impl GrandChildBuilder {
     pub fn build(self) -> GrandChild {
-        let grandchild = Arc::new(GrandChildData {
+        let grandchild = GrandChildData {
             child: match self.payload {
                 None => GrandChildDataChild::None,
                 Some(bytes) => GrandChildDataChild::Payload(bytes),
             },
-        });
-        let child = Arc::new(ChildData {
+        };
+        let child = ChildData {
             quux: Enum16::A,
             child: ChildDataChild::GrandChild(grandchild),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             bar: Enum16::A,
             baz: self.baz,
             foo: Enum16::A,
             child: ParentDataChild::Child(child),
-        });
+        };
         GrandChild::new(parent).unwrap()
     }
 }
@@ -782,13 +781,13 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct GrandGrandChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    grandchild: Arc<GrandChildData>,
+    grandchild: GrandChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    grandgrandchild: Arc<GrandGrandChildData>,
+    grandgrandchild: GrandGrandChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -877,7 +876,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> GrandGrandChildChild {
         match &self.grandgrandchild.child {
@@ -887,7 +886,7 @@
             GrandGrandChildDataChild::None => GrandGrandChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -923,16 +922,16 @@
         })
     }
     pub fn get_bar(&self) -> Enum16 {
-        self.parent.as_ref().bar
+        self.parent.bar
     }
     pub fn get_baz(&self) -> Enum16 {
-        self.parent.as_ref().baz
+        self.parent.baz
     }
     pub fn get_foo(&self) -> Enum16 {
-        self.parent.as_ref().foo
+        self.parent.foo
     }
     pub fn get_quux(&self) -> Enum16 {
-        self.child.as_ref().quux
+        self.child.quux
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.grandgrandchild.child {
@@ -949,25 +948,25 @@
 }
 impl GrandGrandChildBuilder {
     pub fn build(self) -> GrandGrandChild {
-        let grandgrandchild = Arc::new(GrandGrandChildData {
+        let grandgrandchild = GrandGrandChildData {
             child: match self.payload {
                 None => GrandGrandChildDataChild::None,
                 Some(bytes) => GrandGrandChildDataChild::Payload(bytes),
             },
-        });
-        let grandchild = Arc::new(GrandChildData {
+        };
+        let grandchild = GrandChildData {
             child: GrandChildDataChild::GrandGrandChild(grandgrandchild),
-        });
-        let child = Arc::new(ChildData {
+        };
+        let child = ChildData {
             quux: Enum16::A,
             child: ChildDataChild::GrandChild(grandchild),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             bar: Enum16::A,
             baz: Enum16::A,
             foo: Enum16::A,
             child: ParentDataChild::Child(child),
-        });
+        };
         GrandGrandChild::new(parent).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_mask_scalar_value_big_endian.rs b/tests/generated/packet_decl_mask_scalar_value_big_endian.rs
index 581542d..47f7a70 100644
--- a/tests/generated/packet_decl_mask_scalar_value_big_endian.rs
+++ b/tests/generated/packet_decl_mask_scalar_value_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -55,7 +54,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -135,19 +134,19 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> u32 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_c(&self) -> u8 {
-        self.foo.as_ref().c
+        self.foo.c
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -158,11 +157,11 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             c: self.c,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_mask_scalar_value_little_endian.rs b/tests/generated/packet_decl_mask_scalar_value_little_endian.rs
index 9bce70a..95f6c9d 100644
--- a/tests/generated/packet_decl_mask_scalar_value_little_endian.rs
+++ b/tests/generated/packet_decl_mask_scalar_value_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -55,7 +54,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -135,19 +134,19 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> u32 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_c(&self) -> u8 {
-        self.foo.as_ref().c
+        self.foo.c
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -158,11 +157,11 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             c: self.c,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs b/tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs
index 87d0ecf..122b202 100644
--- a/tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs
+++ b/tests/generated/packet_decl_mixed_scalars_enums_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -178,7 +177,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -270,22 +269,22 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_w(&self) -> u8 {
-        self.foo.as_ref().w
+        self.foo.w
     }
     pub fn get_x(&self) -> Enum7 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     pub fn get_y(&self) -> u8 {
-        self.foo.as_ref().y
+        self.foo.y
     }
     pub fn get_z(&self) -> Enum9 {
-        self.foo.as_ref().z
+        self.foo.z
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -296,12 +295,12 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             w: self.w,
             x: self.x,
             y: self.y,
             z: self.z,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_mixed_scalars_enums_little_endian.rs b/tests/generated/packet_decl_mixed_scalars_enums_little_endian.rs
index 85297cc..0cc3d92 100644
--- a/tests/generated/packet_decl_mixed_scalars_enums_little_endian.rs
+++ b/tests/generated/packet_decl_mixed_scalars_enums_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -178,7 +177,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -270,22 +269,22 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_w(&self) -> u8 {
-        self.foo.as_ref().w
+        self.foo.w
     }
     pub fn get_x(&self) -> Enum7 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     pub fn get_y(&self) -> u8 {
-        self.foo.as_ref().y
+        self.foo.y
     }
     pub fn get_z(&self) -> Enum9 {
-        self.foo.as_ref().z
+        self.foo.z
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -296,12 +295,12 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             w: self.w,
             x: self.x,
             y: self.y,
             z: self.z,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_parent_with_alias_child_big_endian.rs b/tests/generated/packet_decl_parent_with_alias_child_big_endian.rs
index a2c69a6..8c9232d 100644
--- a/tests/generated/packet_decl_parent_with_alias_child_big_endian.rs
+++ b/tests/generated/packet_decl_parent_with_alias_child_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -111,8 +110,8 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ParentDataChild {
-    AliasChild(Arc<AliasChildData>),
-    NormalChild(Arc<NormalChildData>),
+    AliasChild(AliasChildData),
+    NormalChild(NormalChildData),
     Payload(Bytes),
     None,
 }
@@ -144,7 +143,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Parent {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -182,12 +181,12 @@
             (Enum8::B | Enum8::C) if AliasChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = AliasChildData::parse_inner(&mut cell, v)?;
-                ParentDataChild::AliasChild(Arc::new(child_data))
+                ParentDataChild::AliasChild(child_data)
             }
             (Enum8::A) if NormalChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = NormalChildData::parse_inner(&mut cell)?;
-                ParentDataChild::NormalChild(Arc::new(child_data))
+                ParentDataChild::NormalChild(child_data)
             }
             _ if !payload.is_empty() => {
                 ParentDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -240,7 +239,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ParentChild {
         match &self.parent.child {
@@ -254,11 +253,11 @@
             ParentDataChild::None => ParentChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         Ok(Self { parent })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.parent.write_to(buffer)
@@ -269,13 +268,13 @@
 }
 impl ParentBuilder {
     pub fn build(self) -> Parent {
-        let parent = Arc::new(ParentData {
+        let parent = ParentData {
             v: self.v,
             child: match self.payload {
                 None => ParentDataChild::None,
                 Some(bytes) => ParentDataChild::Payload(bytes),
             },
-        });
+        };
         Parent::new(parent).unwrap()
     }
 }
@@ -287,8 +286,8 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum AliasChildDataChild {
-    NormalGrandChild1(Arc<NormalGrandChild1Data>),
-    NormalGrandChild2(Arc<NormalGrandChild2Data>),
+    NormalGrandChild1(NormalGrandChild1Data),
+    NormalGrandChild2(NormalGrandChild2Data),
     Payload(Bytes),
     None,
 }
@@ -319,9 +318,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct AliasChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    aliaschild: Arc<AliasChildData>,
+    aliaschild: AliasChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -345,12 +344,12 @@
             (Enum8::B) if NormalGrandChild1Data::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = NormalGrandChild1Data::parse_inner(&mut cell)?;
-                AliasChildDataChild::NormalGrandChild1(Arc::new(child_data))
+                AliasChildDataChild::NormalGrandChild1(child_data)
             }
             (Enum8::C) if NormalGrandChild2Data::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = NormalGrandChild2Data::parse_inner(&mut cell)?;
-                AliasChildDataChild::NormalGrandChild2(Arc::new(child_data))
+                AliasChildDataChild::NormalGrandChild2(child_data)
             }
             _ if !payload.is_empty() => {
                 AliasChildDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -413,7 +412,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> AliasChildChild {
         match &self.aliaschild.child {
@@ -433,7 +432,7 @@
             AliasChildDataChild::None => AliasChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let aliaschild = match &parent.child {
             ParentDataChild::AliasChild(value) => value.clone(),
             _ => {
@@ -446,7 +445,7 @@
         Ok(Self { parent, aliaschild })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.aliaschild.write_to(buffer)
@@ -457,16 +456,16 @@
 }
 impl AliasChildBuilder {
     pub fn build(self) -> AliasChild {
-        let aliaschild = Arc::new(AliasChildData {
+        let aliaschild = AliasChildData {
             child: match self.payload {
                 None => AliasChildDataChild::None,
                 Some(bytes) => AliasChildDataChild::Payload(bytes),
             },
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             v: self.v,
             child: ParentDataChild::AliasChild(aliaschild),
-        });
+        };
         AliasChild::new(parent).unwrap()
     }
 }
@@ -487,9 +486,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct NormalChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    normalchild: Arc<NormalChildData>,
+    normalchild: NormalChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -553,9 +552,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let normalchild = match &parent.child {
             ParentDataChild::NormalChild(value) => value.clone(),
             _ => {
@@ -568,7 +567,7 @@
         Ok(Self { parent, normalchild })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.normalchild.write_to(buffer)
@@ -579,11 +578,11 @@
 }
 impl NormalChildBuilder {
     pub fn build(self) -> NormalChild {
-        let normalchild = Arc::new(NormalChildData {});
-        let parent = Arc::new(ParentData {
+        let normalchild = NormalChildData {};
+        let parent = ParentData {
             v: Enum8::A,
             child: ParentDataChild::NormalChild(normalchild),
-        });
+        };
         NormalChild::new(parent).unwrap()
     }
 }
@@ -604,11 +603,11 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct NormalGrandChild1 {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    aliaschild: Arc<AliasChildData>,
+    aliaschild: AliasChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    normalgrandchild1: Arc<NormalGrandChild1Data>,
+    normalgrandchild1: NormalGrandChild1Data,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -677,9 +676,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let aliaschild = match &parent.child {
             ParentDataChild::AliasChild(value) => value.clone(),
             _ => {
@@ -705,7 +704,7 @@
         })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.normalgrandchild1.write_to(buffer)
@@ -716,14 +715,14 @@
 }
 impl NormalGrandChild1Builder {
     pub fn build(self) -> NormalGrandChild1 {
-        let normalgrandchild1 = Arc::new(NormalGrandChild1Data {});
-        let aliaschild = Arc::new(AliasChildData {
+        let normalgrandchild1 = NormalGrandChild1Data {};
+        let aliaschild = AliasChildData {
             child: AliasChildDataChild::NormalGrandChild1(normalgrandchild1),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             v: Enum8::B,
             child: ParentDataChild::AliasChild(aliaschild),
-        });
+        };
         NormalGrandChild1::new(parent).unwrap()
     }
 }
@@ -771,11 +770,11 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct NormalGrandChild2 {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    aliaschild: Arc<AliasChildData>,
+    aliaschild: AliasChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    normalgrandchild2: Arc<NormalGrandChild2Data>,
+    normalgrandchild2: NormalGrandChild2Data,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -859,7 +858,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> NormalGrandChild2Child {
         match &self.normalgrandchild2.child {
@@ -869,7 +868,7 @@
             NormalGrandChild2DataChild::None => NormalGrandChild2Child::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let aliaschild = match &parent.child {
             ParentDataChild::AliasChild(value) => value.clone(),
             _ => {
@@ -895,7 +894,7 @@
         })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.normalgrandchild2.child {
@@ -912,19 +911,19 @@
 }
 impl NormalGrandChild2Builder {
     pub fn build(self) -> NormalGrandChild2 {
-        let normalgrandchild2 = Arc::new(NormalGrandChild2Data {
+        let normalgrandchild2 = NormalGrandChild2Data {
             child: match self.payload {
                 None => NormalGrandChild2DataChild::None,
                 Some(bytes) => NormalGrandChild2DataChild::Payload(bytes),
             },
-        });
-        let aliaschild = Arc::new(AliasChildData {
+        };
+        let aliaschild = AliasChildData {
             child: AliasChildDataChild::NormalGrandChild2(normalgrandchild2),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             v: Enum8::C,
             child: ParentDataChild::AliasChild(aliaschild),
-        });
+        };
         NormalGrandChild2::new(parent).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_parent_with_alias_child_little_endian.rs b/tests/generated/packet_decl_parent_with_alias_child_little_endian.rs
index a2c69a6..8c9232d 100644
--- a/tests/generated/packet_decl_parent_with_alias_child_little_endian.rs
+++ b/tests/generated/packet_decl_parent_with_alias_child_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -111,8 +110,8 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ParentDataChild {
-    AliasChild(Arc<AliasChildData>),
-    NormalChild(Arc<NormalChildData>),
+    AliasChild(AliasChildData),
+    NormalChild(NormalChildData),
     Payload(Bytes),
     None,
 }
@@ -144,7 +143,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Parent {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -182,12 +181,12 @@
             (Enum8::B | Enum8::C) if AliasChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = AliasChildData::parse_inner(&mut cell, v)?;
-                ParentDataChild::AliasChild(Arc::new(child_data))
+                ParentDataChild::AliasChild(child_data)
             }
             (Enum8::A) if NormalChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = NormalChildData::parse_inner(&mut cell)?;
-                ParentDataChild::NormalChild(Arc::new(child_data))
+                ParentDataChild::NormalChild(child_data)
             }
             _ if !payload.is_empty() => {
                 ParentDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -240,7 +239,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ParentChild {
         match &self.parent.child {
@@ -254,11 +253,11 @@
             ParentDataChild::None => ParentChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         Ok(Self { parent })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.parent.write_to(buffer)
@@ -269,13 +268,13 @@
 }
 impl ParentBuilder {
     pub fn build(self) -> Parent {
-        let parent = Arc::new(ParentData {
+        let parent = ParentData {
             v: self.v,
             child: match self.payload {
                 None => ParentDataChild::None,
                 Some(bytes) => ParentDataChild::Payload(bytes),
             },
-        });
+        };
         Parent::new(parent).unwrap()
     }
 }
@@ -287,8 +286,8 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum AliasChildDataChild {
-    NormalGrandChild1(Arc<NormalGrandChild1Data>),
-    NormalGrandChild2(Arc<NormalGrandChild2Data>),
+    NormalGrandChild1(NormalGrandChild1Data),
+    NormalGrandChild2(NormalGrandChild2Data),
     Payload(Bytes),
     None,
 }
@@ -319,9 +318,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct AliasChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    aliaschild: Arc<AliasChildData>,
+    aliaschild: AliasChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -345,12 +344,12 @@
             (Enum8::B) if NormalGrandChild1Data::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = NormalGrandChild1Data::parse_inner(&mut cell)?;
-                AliasChildDataChild::NormalGrandChild1(Arc::new(child_data))
+                AliasChildDataChild::NormalGrandChild1(child_data)
             }
             (Enum8::C) if NormalGrandChild2Data::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = NormalGrandChild2Data::parse_inner(&mut cell)?;
-                AliasChildDataChild::NormalGrandChild2(Arc::new(child_data))
+                AliasChildDataChild::NormalGrandChild2(child_data)
             }
             _ if !payload.is_empty() => {
                 AliasChildDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -413,7 +412,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> AliasChildChild {
         match &self.aliaschild.child {
@@ -433,7 +432,7 @@
             AliasChildDataChild::None => AliasChildChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let aliaschild = match &parent.child {
             ParentDataChild::AliasChild(value) => value.clone(),
             _ => {
@@ -446,7 +445,7 @@
         Ok(Self { parent, aliaschild })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.aliaschild.write_to(buffer)
@@ -457,16 +456,16 @@
 }
 impl AliasChildBuilder {
     pub fn build(self) -> AliasChild {
-        let aliaschild = Arc::new(AliasChildData {
+        let aliaschild = AliasChildData {
             child: match self.payload {
                 None => AliasChildDataChild::None,
                 Some(bytes) => AliasChildDataChild::Payload(bytes),
             },
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             v: self.v,
             child: ParentDataChild::AliasChild(aliaschild),
-        });
+        };
         AliasChild::new(parent).unwrap()
     }
 }
@@ -487,9 +486,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct NormalChild {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    normalchild: Arc<NormalChildData>,
+    normalchild: NormalChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -553,9 +552,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let normalchild = match &parent.child {
             ParentDataChild::NormalChild(value) => value.clone(),
             _ => {
@@ -568,7 +567,7 @@
         Ok(Self { parent, normalchild })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.normalchild.write_to(buffer)
@@ -579,11 +578,11 @@
 }
 impl NormalChildBuilder {
     pub fn build(self) -> NormalChild {
-        let normalchild = Arc::new(NormalChildData {});
-        let parent = Arc::new(ParentData {
+        let normalchild = NormalChildData {};
+        let parent = ParentData {
             v: Enum8::A,
             child: ParentDataChild::NormalChild(normalchild),
-        });
+        };
         NormalChild::new(parent).unwrap()
     }
 }
@@ -604,11 +603,11 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct NormalGrandChild1 {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    aliaschild: Arc<AliasChildData>,
+    aliaschild: AliasChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    normalgrandchild1: Arc<NormalGrandChild1Data>,
+    normalgrandchild1: NormalGrandChild1Data,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -677,9 +676,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let aliaschild = match &parent.child {
             ParentDataChild::AliasChild(value) => value.clone(),
             _ => {
@@ -705,7 +704,7 @@
         })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.normalgrandchild1.write_to(buffer)
@@ -716,14 +715,14 @@
 }
 impl NormalGrandChild1Builder {
     pub fn build(self) -> NormalGrandChild1 {
-        let normalgrandchild1 = Arc::new(NormalGrandChild1Data {});
-        let aliaschild = Arc::new(AliasChildData {
+        let normalgrandchild1 = NormalGrandChild1Data {};
+        let aliaschild = AliasChildData {
             child: AliasChildDataChild::NormalGrandChild1(normalgrandchild1),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             v: Enum8::B,
             child: ParentDataChild::AliasChild(aliaschild),
-        });
+        };
         NormalGrandChild1::new(parent).unwrap()
     }
 }
@@ -771,11 +770,11 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct NormalGrandChild2 {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    aliaschild: Arc<AliasChildData>,
+    aliaschild: AliasChildData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    normalgrandchild2: Arc<NormalGrandChild2Data>,
+    normalgrandchild2: NormalGrandChild2Data,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -859,7 +858,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> NormalGrandChild2Child {
         match &self.normalgrandchild2.child {
@@ -869,7 +868,7 @@
             NormalGrandChild2DataChild::None => NormalGrandChild2Child::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let aliaschild = match &parent.child {
             ParentDataChild::AliasChild(value) => value.clone(),
             _ => {
@@ -895,7 +894,7 @@
         })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.normalgrandchild2.child {
@@ -912,19 +911,19 @@
 }
 impl NormalGrandChild2Builder {
     pub fn build(self) -> NormalGrandChild2 {
-        let normalgrandchild2 = Arc::new(NormalGrandChild2Data {
+        let normalgrandchild2 = NormalGrandChild2Data {
             child: match self.payload {
                 None => NormalGrandChild2DataChild::None,
                 Some(bytes) => NormalGrandChild2DataChild::Payload(bytes),
             },
-        });
-        let aliaschild = Arc::new(AliasChildData {
+        };
+        let aliaschild = AliasChildData {
             child: AliasChildDataChild::NormalGrandChild2(normalgrandchild2),
-        });
-        let parent = Arc::new(ParentData {
+        };
+        let parent = ParentData {
             v: Enum8::C,
             child: ParentDataChild::AliasChild(aliaschild),
-        });
+        };
         NormalGrandChild2::new(parent).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_parent_with_no_payload_big_endian.rs b/tests/generated/packet_decl_parent_with_no_payload_big_endian.rs
index 35c6dac..4f58e26 100644
--- a/tests/generated/packet_decl_parent_with_no_payload_big_endian.rs
+++ b/tests/generated/packet_decl_parent_with_no_payload_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -105,7 +104,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ParentDataChild {
-    Child(Arc<ChildData>),
+    Child(ChildData),
     Payload(Bytes),
     None,
 }
@@ -135,7 +134,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Parent {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -172,7 +171,7 @@
             (Enum8::A) if ChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = ChildData::parse_inner(&mut cell)?;
-                ParentDataChild::Child(Arc::new(child_data))
+                ParentDataChild::Child(child_data)
             }
             _ if !payload.is_empty() => {
                 ParentDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -219,7 +218,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ParentChild {
         match &self.parent.child {
@@ -230,11 +229,11 @@
             ParentDataChild::None => ParentChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         Ok(Self { parent })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.parent.write_to(buffer)
@@ -245,10 +244,10 @@
 }
 impl ParentBuilder {
     pub fn build(self) -> Parent {
-        let parent = Arc::new(ParentData {
+        let parent = ParentData {
             v: self.v,
             child: ParentDataChild::None,
-        });
+        };
         Parent::new(parent).unwrap()
     }
 }
@@ -264,9 +263,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Child {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -330,9 +329,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -345,7 +344,7 @@
         Ok(Self { parent, child })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.child.write_to(buffer)
@@ -356,11 +355,11 @@
 }
 impl ChildBuilder {
     pub fn build(self) -> Child {
-        let child = Arc::new(ChildData {});
-        let parent = Arc::new(ParentData {
+        let child = ChildData {};
+        let parent = ParentData {
             v: Enum8::A,
             child: ParentDataChild::None,
-        });
+        };
         Child::new(parent).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_parent_with_no_payload_little_endian.rs b/tests/generated/packet_decl_parent_with_no_payload_little_endian.rs
index 35c6dac..4f58e26 100644
--- a/tests/generated/packet_decl_parent_with_no_payload_little_endian.rs
+++ b/tests/generated/packet_decl_parent_with_no_payload_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -105,7 +104,7 @@
 #[derive(Debug, Clone, PartialEq, Eq)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub enum ParentDataChild {
-    Child(Arc<ChildData>),
+    Child(ChildData),
     Payload(Bytes),
     None,
 }
@@ -135,7 +134,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Parent {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -172,7 +171,7 @@
             (Enum8::A) if ChildData::conforms(&payload) => {
                 let mut cell = Cell::new(payload);
                 let child_data = ChildData::parse_inner(&mut cell)?;
-                ParentDataChild::Child(Arc::new(child_data))
+                ParentDataChild::Child(child_data)
             }
             _ if !payload.is_empty() => {
                 ParentDataChild::Payload(Bytes::copy_from_slice(payload))
@@ -219,7 +218,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> ParentChild {
         match &self.parent.child {
@@ -230,11 +229,11 @@
             ParentDataChild::None => ParentChild::None,
         }
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         Ok(Self { parent })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.parent.write_to(buffer)
@@ -245,10 +244,10 @@
 }
 impl ParentBuilder {
     pub fn build(self) -> Parent {
-        let parent = Arc::new(ParentData {
+        let parent = ParentData {
             v: self.v,
             child: ParentDataChild::None,
-        });
+        };
         Parent::new(parent).unwrap()
     }
 }
@@ -264,9 +263,9 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Child {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    parent: Arc<ParentData>,
+    parent: ParentData,
     #[cfg_attr(feature = "serde", serde(flatten))]
-    child: Arc<ChildData>,
+    child: ChildData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -330,9 +329,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = ParentData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(parent: Arc<ParentData>) -> Result<Self> {
+    fn new(parent: ParentData) -> Result<Self> {
         let child = match &parent.child {
             ParentDataChild::Child(value) => value.clone(),
             _ => {
@@ -345,7 +344,7 @@
         Ok(Self { parent, child })
     }
     pub fn get_v(&self) -> Enum8 {
-        self.parent.as_ref().v
+        self.parent.v
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.child.write_to(buffer)
@@ -356,11 +355,11 @@
 }
 impl ChildBuilder {
     pub fn build(self) -> Child {
-        let child = Arc::new(ChildData {});
-        let parent = Arc::new(ParentData {
+        let child = ChildData {};
+        let parent = ParentData {
             v: Enum8::A,
             child: ParentDataChild::None,
-        });
+        };
         Child::new(parent).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_payload_field_unknown_size_big_endian.rs b/tests/generated/packet_decl_payload_field_unknown_size_big_endian.rs
index 452c365..be55b05 100644
--- a/tests/generated/packet_decl_payload_field_unknown_size_big_endian.rs
+++ b/tests/generated/packet_decl_payload_field_unknown_size_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -74,7 +73,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -155,7 +154,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -163,11 +162,11 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u32 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.foo.child {
@@ -184,13 +183,13 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_payload_field_unknown_size_little_endian.rs b/tests/generated/packet_decl_payload_field_unknown_size_little_endian.rs
index 99c06b9..bc20979 100644
--- a/tests/generated/packet_decl_payload_field_unknown_size_little_endian.rs
+++ b/tests/generated/packet_decl_payload_field_unknown_size_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -74,7 +73,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -155,7 +154,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -163,11 +162,11 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u32 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.foo.child {
@@ -184,13 +183,13 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_payload_field_unknown_size_terminal_big_endian.rs b/tests/generated/packet_decl_payload_field_unknown_size_terminal_big_endian.rs
index f54477a..a8af260 100644
--- a/tests/generated/packet_decl_payload_field_unknown_size_terminal_big_endian.rs
+++ b/tests/generated/packet_decl_payload_field_unknown_size_terminal_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -74,7 +73,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -162,7 +161,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -170,11 +169,11 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u32 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.foo.child {
@@ -191,13 +190,13 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_payload_field_unknown_size_terminal_little_endian.rs b/tests/generated/packet_decl_payload_field_unknown_size_terminal_little_endian.rs
index 616c87f..c615757 100644
--- a/tests/generated/packet_decl_payload_field_unknown_size_terminal_little_endian.rs
+++ b/tests/generated/packet_decl_payload_field_unknown_size_terminal_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -74,7 +73,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -162,7 +161,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -170,11 +169,11 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u32 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.foo.child {
@@ -191,13 +190,13 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_payload_field_variable_size_big_endian.rs b/tests/generated/packet_decl_payload_field_variable_size_big_endian.rs
index fd2a3c1..ea6f7bf 100644
--- a/tests/generated/packet_decl_payload_field_variable_size_big_endian.rs
+++ b/tests/generated/packet_decl_payload_field_variable_size_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -75,7 +74,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -185,7 +184,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -193,14 +192,14 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> u16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.foo.child {
@@ -217,14 +216,14 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_payload_field_variable_size_little_endian.rs b/tests/generated/packet_decl_payload_field_variable_size_little_endian.rs
index 65f1809..f2932f0 100644
--- a/tests/generated/packet_decl_payload_field_variable_size_little_endian.rs
+++ b/tests/generated/packet_decl_payload_field_variable_size_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -75,7 +74,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -185,7 +184,7 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
     pub fn specialize(&self) -> FooChild {
         match &self.foo.child {
@@ -193,14 +192,14 @@
             FooDataChild::None => FooChild::None,
         }
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_a(&self) -> u8 {
-        self.foo.as_ref().a
+        self.foo.a
     }
     pub fn get_b(&self) -> u16 {
-        self.foo.as_ref().b
+        self.foo.b
     }
     pub fn get_payload(&self) -> &[u8] {
         match &self.foo.child {
@@ -217,14 +216,14 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             a: self.a,
             b: self.b,
             child: match self.payload {
                 None => FooDataChild::None,
                 Some(bytes) => FooDataChild::Payload(bytes),
             },
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_reserved_field_big_endian.rs b/tests/generated/packet_decl_reserved_field_big_endian.rs
index f03c7bf..6d2a01e 100644
--- a/tests/generated/packet_decl_reserved_field_big_endian.rs
+++ b/tests/generated/packet_decl_reserved_field_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -51,7 +50,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -114,9 +113,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     fn write_to(&self, buffer: &mut BytesMut) {
@@ -128,7 +127,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {});
+        let foo = FooData {};
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_reserved_field_little_endian.rs b/tests/generated/packet_decl_reserved_field_little_endian.rs
index f03c7bf..6d2a01e 100644
--- a/tests/generated/packet_decl_reserved_field_little_endian.rs
+++ b/tests/generated/packet_decl_reserved_field_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -51,7 +50,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -114,9 +113,9 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     fn write_to(&self, buffer: &mut BytesMut) {
@@ -128,7 +127,7 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {});
+        let foo = FooData {};
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_simple_scalars_big_endian.rs b/tests/generated/packet_decl_simple_scalars_big_endian.rs
index 303a785..f2048d9 100644
--- a/tests/generated/packet_decl_simple_scalars_big_endian.rs
+++ b/tests/generated/packet_decl_simple_scalars_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -55,7 +54,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -143,19 +142,19 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u8 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     pub fn get_y(&self) -> u16 {
-        self.foo.as_ref().y
+        self.foo.y
     }
     pub fn get_z(&self) -> u32 {
-        self.foo.as_ref().z
+        self.foo.z
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -166,11 +165,11 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             x: self.x,
             y: self.y,
             z: self.z,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/packet_decl_simple_scalars_little_endian.rs b/tests/generated/packet_decl_simple_scalars_little_endian.rs
index 043a72f..16f01f7 100644
--- a/tests/generated/packet_decl_simple_scalars_little_endian.rs
+++ b/tests/generated/packet_decl_simple_scalars_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
@@ -55,7 +54,7 @@
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
 pub struct Foo {
     #[cfg_attr(feature = "serde", serde(flatten))]
-    foo: Arc<FooData>,
+    foo: FooData,
 }
 #[derive(Debug)]
 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
@@ -143,19 +142,19 @@
     }
     fn parse_inner(mut bytes: &mut Cell<&[u8]>) -> Result<Self> {
         let data = FooData::parse_inner(&mut bytes)?;
-        Self::new(Arc::new(data))
+        Self::new(data)
     }
-    fn new(foo: Arc<FooData>) -> Result<Self> {
+    fn new(foo: FooData) -> Result<Self> {
         Ok(Self { foo })
     }
     pub fn get_x(&self) -> u8 {
-        self.foo.as_ref().x
+        self.foo.x
     }
     pub fn get_y(&self) -> u16 {
-        self.foo.as_ref().y
+        self.foo.y
     }
     pub fn get_z(&self) -> u32 {
-        self.foo.as_ref().z
+        self.foo.z
     }
     fn write_to(&self, buffer: &mut BytesMut) {
         self.foo.write_to(buffer)
@@ -166,11 +165,11 @@
 }
 impl FooBuilder {
     pub fn build(self) -> Foo {
-        let foo = Arc::new(FooData {
+        let foo = FooData {
             x: self.x,
             y: self.y,
             z: self.z,
-        });
+        };
         Foo::new(foo).unwrap()
     }
 }
diff --git a/tests/generated/preamble.rs b/tests/generated/preamble.rs
index e200e6d..e3e9772 100644
--- a/tests/generated/preamble.rs
+++ b/tests/generated/preamble.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
diff --git a/tests/generated/struct_decl_complex_scalars_big_endian.rs b/tests/generated/struct_decl_complex_scalars_big_endian.rs
index 8ea2bb9..a8de9c9 100644
--- a/tests/generated/struct_decl_complex_scalars_big_endian.rs
+++ b/tests/generated/struct_decl_complex_scalars_big_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values
diff --git a/tests/generated/struct_decl_complex_scalars_little_endian.rs b/tests/generated/struct_decl_complex_scalars_little_endian.rs
index 0ec2c38..e0741f7 100644
--- a/tests/generated/struct_decl_complex_scalars_little_endian.rs
+++ b/tests/generated/struct_decl_complex_scalars_little_endian.rs
@@ -4,7 +4,6 @@
 use std::convert::{TryFrom, TryInto};
 use std::cell::Cell;
 use std::fmt;
-use std::sync::Arc;
 use thiserror::Error;
 type Result<T> = std::result::Result<T, Error>;
 /// Private prevents users from creating arbitrary scalar values