ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/CBOR-XS/doc/indirection.pod
Revision: 1.4
Committed: Wed Nov 27 15:53:28 2019 UTC (4 years, 5 months ago) by root
Branch: MAIN
CVS Tags: rel-1_8, rel-1_82, rel-1_83, rel-1_81, rel-1_86, rel-1_87, rel-1_84, rel-1_85, HEAD
Changes since 1.3: +2 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 =head1 REGISTRATION INFORMATION
2
3 Tag 22098 (indirection)
4 Data Item multiple
5 Semantics hint that indicates an additional level of indirection
6 Reference http://cbor.schmorp.de/indirection
7 Contact Marc A. Lehmann <cbor@schmorp.de>
8
9 =head1 SUMMARY
10
11 This tag indicates an additional level of indirection when
12 decoding a value.
13
14 =head1 BACKGROUND
15
16 Data structures in some languages or data models sometimes employ
17 references, pointers or similar forms of indirection to represent
18 relationships between values. For example, in Perl, CBOR arrays are
19 usually represented as references to perl arrays, rather than arrays
20 themselves, while simple scalar values are represented as these values
21 themselves. However, CBOR leaves explicit references unencodable - while
22 arrays and maps might implicitly result in references, references to
23 simple values, or references to references are not representable.
24
25 For example, in Perl:
26
27 { 1, 2, 3, 4 } # reference to a hash, becomes CBOR map
28 [ 1, 2, 3, 4 } # reference to an array, becomes CBOR array
29 \5 # reference to the scalar value 5, needs extension
30 \[] # reference to a reference to an array, needs extension
31
32 This tag allows to encode such references - prefixing a value with this
33 tag indicates a hint to the decoder that the original value was actually
34 a reference. Decoders can chose to heed the hint (if their data model has
35 a convenient representation), or simply ignore it and decode the value
36 as-is.
37
38 For example, CBOR encoders for Perl would not use the indirection tag for
39 hash and array references, as the only way to reference these values in a
40 data structure is already by reference. However, references to strings,
41 numbers, other references or other complex objects would be encoded by
42 tagging the referenced value with the indirection tag.
43
44 Indirection tags can be nested - each additional level of nesting would
45 indicate an additional indirection.
46
47 =head1 EXAMPLES
48
49 The following Perl data structure is an array containing a reference to an
50 array, followed by a reference to a string:
51
52 [[], \"string"]
53
54 Since Perl cannot have "naked" arrays or maps inside another data
55 structure, but only a reference to it, the natural encoding of this
56 data structure uses a normal array for the array-reference (i.e. it
57 omits the reference). The string reference is uncommon but valid, and
58 not the natural way to store a string inside another data structure. An
59 encoder might therefore chose to encode this string reference using the
60 indirection tag:
61
62 256([[], 22098("string")])
63
64 d9 0100 # tag(256)
65 82 # array(2)
66 80 # array(0)
67 d9 5652 # tag(22098)
68 66 # text(6)
69 737472696e67 # "string"
70
71 =head1 IMPLEMENTATIONS
72
73 This section lists known implementations of this extension (L<drop me a
74 mail|mailto:cbor@schmorp.de?Subject=CBOR-indirection> if you want to be
75 listed here).
76
77 =over 4
78
79 =item * [Perl] L<CBOR::XS|http://software.schmorp.de/pkg/CBOR-XS.html> (reference implementation)
80
81 =item * [Perl] L<CBOR::Free|https://metacpan.org/pod/CBOR::Free>
82
83 =back
84