From f3fa423de0349bbadd2fa777f0400acbfb6e4ebd Mon Sep 17 00:00:00 2001 From: miloyip Date: Thu, 3 Jul 2014 19:20:33 +0800 Subject: [PATCH] Updates "Create/Modify Values" section --- doc/diagram/move2.dot | 63 +++++++++++++++++++++++++++++++++++++ doc/diagram/move2.png | Bin 0 -> 23536 bytes doc/diagram/move3.dot | 57 ++++++++++++++++++++++++++++++++++ doc/diagram/move3.png | Bin 0 -> 22932 bytes doc/tutorial.md | 70 +++++++++++++++++++++++++++++------------- 5 files changed, 168 insertions(+), 22 deletions(-) create mode 100644 doc/diagram/move2.dot create mode 100644 doc/diagram/move2.png create mode 100644 doc/diagram/move3.dot create mode 100644 doc/diagram/move3.png diff --git a/doc/diagram/move2.dot b/doc/diagram/move2.dot new file mode 100644 index 00000000..9c631626 --- /dev/null +++ b/doc/diagram/move2.dot @@ -0,0 +1,63 @@ +digraph { + compound=true + fontname="Inconsolata, Consolas" + fontsize=10 + margin="0,0" + ranksep=0.2 + penwidth=0.5 + forcelabels=true + + node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] + edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] + + subgraph cluster1 { + margin="10,10" + labeljust="left" + label = "Before Copying" + style=filled + fillcolor=gray95 + + node [shape=Mrecord, style=filled, colorscheme=spectral7] + + c1 [label="{contact:array|}", fillcolor=4] + c11 [label="{|}"] + c12 [label="{|}"] + c13 [shape="none", label="...", style="solid"] + o1 [label="{o:object|}", fillcolor=3] + + c1 -> o1 [style="dashed", constraint=false, label="AddMember"] + + edge [arrowhead=vee] + c1 -> { c11; c12; c13 } + } + + subgraph cluster2 { + margin="10,10" + labeljust="left" + label = "After Copying" + style=filled + fillcolor=gray95 + + node [shape=Mrecord, style=filled, colorscheme=spectral7] + + { + rank = same + c2 [label="{contact:array|}", fillcolor=4] + c3 [label="{array|}", fillcolor=4] + } + c21 [label="{|}"] + c22 [label="{|}"] + c23 [shape=none, label="...", style="solid"] + o2 [label="{o:object|}", fillcolor=3] + cs [label="{string|\"contact\"}", fillcolor=5] + c31 [label="{|}"] + c32 [label="{|}"] + c33 [shape="none", label="...", style="solid"] + + edge [arrowhead=vee] + c2 -> { c21; c22; c23 } + o2 -> cs + cs -> c3 [arrowhead=none] + c3 -> { c31; c32; c33 } + } +} \ No newline at end of file diff --git a/doc/diagram/move2.png b/doc/diagram/move2.png new file mode 100644 index 0000000000000000000000000000000000000000..a65966ec9e4a1a1793e519c55a0c7cc29f92c2f2 GIT binary patch literal 23536 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 z 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 anv~oeUXj}u&-cNf5Ox`u>KE%ep8YrU-&Mf? literal 0 HcmV?d00001 diff --git a/doc/diagram/move3.dot b/doc/diagram/move3.dot new file mode 100644 index 00000000..4c2177d4 --- /dev/null +++ b/doc/diagram/move3.dot @@ -0,0 +1,57 @@ +digraph { + compound=true + fontname="Inconsolata, Consolas" + fontsize=10 + margin="0,0" + ranksep=0.2 + penwidth=0.5 + forcelabels=true + + node [fontname="Inconsolata, Consolas", fontsize=10, penwidth=0.5] + edge [fontname="Inconsolata, Consolas", fontsize=10, arrowhead=normal] + + subgraph cluster1 { + margin="10,10" + labeljust="left" + label = "Before Moving" + style=filled + fillcolor=gray95 + + node [shape=Mrecord, style=filled, colorscheme=spectral7] + + c1 [label="{contact:array|}", fillcolor=4] + c11 [label="{|}"] + c12 [label="{|}"] + c13 [shape=none, label="...", style="none"] + o1 [label="{o:object|}", fillcolor=3] + + c1 -> o1 [style="dashed", constraint=false, label="AddMember"] + + edge [arrowhead=vee] + c1 -> { c11; c12; c13 } + } + + subgraph cluster2 { + margin="10,10" + labeljust="left" + label = "After Moving" + style=filled + fillcolor=gray95 + + node [shape=Mrecord, style=filled, colorscheme=spectral7] + + rank = same + c2 [label="{contact:null|}", fillcolor=1] + c3 [label="{array|}", fillcolor=4] + c21 [label="{|}"] + c22 [label="{|}"] + c23 [shape="none", label="...", style="solid"] + o2 [label="{o:object|}", fillcolor=3] + cs [label="{string|\"contact\"}", fillcolor=5] + + edge [arrowhead=vee] + c3 -> { c21; c22; c23 } + o2 -> cs + cs -> c3 [arrowhead=none] + } +} \ No newline at end of file diff --git a/doc/diagram/move3.png b/doc/diagram/move3.png new file mode 100644 index 0000000000000000000000000000000000000000..f666acad9778897ad4410fb6403b635fa398509d GIT binary patch literal 22932 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 X(UsKK_3zPUnP6gQwm-|@ which transfer ownership during assignment. Move is much faster and simpler, it just destructs the original value, memcpy() the source to destination, and finally sets the source as Null type. +To make RapidJSON simple and fast, we chose to use *move* semantics for assignment. It is similar to `std::auto_ptr` which transfer ownership during assignment. Move is much faster and simpler, it just destructs the original value, `memcpy()` the source to destination, and finally sets the source as Null type. -So, with move semantics, the above example become: +So, with move semantics, the above example becomes: ```cpp Value o(kObjectType); @@ -304,19 +306,21 @@ Value o(kObjectType); } ``` -This is called move assignment operator in C++11. As RapidJSON supports C++03, it adopts move semantics as default. +![move3](diagram/move3.png?raw=true) -### Manipulating String +This is called move assignment operator in C++11. As RapidJSON supports C++03, it adopts move semantics using normal copy constructor, assignment operator, and all other modifying function like `AddMember()`, `PushBack()`, which will be discussed soon. + +### Create String RapidJSON provide two strategies for storing string. 1. copy-string: allocates a buffer, and then copy the source data into it. 2. const-string: simply store a pointer of string. -Copy-string is always safe because it owns a copy of the data. Const-string can be used for storing string literal, and in-situ parsing which we will mentioned in Document. +Copy-string is always safe because it owns a copy of the data. Const-string can be used for storing string literal, and in-situ parsing which we will mentioned in Document section. -To make memory allocation customizable, rapidjson needs user to pass an instance of allocator, whenever that operation may require allocation. This design is more flexible than STL's allocator type per class, as we can assign a allocator instance for each allocation. +To make memory allocation customizable, RapidJSON requires user to pass an instance of allocator, whenever an operation may require allocation. This design is more flexible than STL's allocator type per class, as we can assign an allocator instance for each allocation. -Therefore, when we assign a copy-string, we call this overloaded SetString() with allocator: +Therefore, when we assign a copy-string, we call this overloaded `SetString()` with allocator: ```cpp Document document; @@ -328,11 +332,11 @@ memset(buffer, 0, sizeof(buffer)); // author.GetString() still contains "Milo Yip" after buffer is destroyed ``` -In this example, we get the allocator from a Document instance. This is a common idiom when using rapidjson. But you may use other instances of allocator. +In this example, we get the allocator from a `Document` instance. This is a common idiom when using RapidJSON. But you may use other instances of allocator. -Besides, the above SetString() requires the length of a string. This can handle null characters within a string. There is another SetString() overloaded function without the length parameter. And it actually assumes the input is null-terminated and calls a strlen()-like function to obtain the length. +Besides, the above `SetString()` requires length. This can handle null characters within a string. There is another `SetString()` overloaded function without the length parameter. And it assumes the input is null-terminated and calls a `strlen()`-like function to obtain the length. -Finally, for literal string or string with safe life-cycle can use const-string version of SetString(), which are without alloactor parameter: +Finally, for literal string or string with safe life-cycle can use const-string version of `SetString()`, which lacks alloactor parameter: ```cpp Value s; @@ -341,7 +345,7 @@ s.SetString("rapidjson"); // slower, assumes null-terminated s = "rapidjson"; // shortcut, same as above ``` -### Manipulating Array +### Modify Array Value with array type provides similar APIs as `std::vector`. * `Clear()` @@ -359,7 +363,7 @@ Value a(kArrayType); Document::AllocatorType& allocator = document.GetAllocator(); for (int i = 5; i <= 10; i++) - a.PushBack(i, allocator); // allocator is needed for potentially realloc. + a.PushBack(i, allocator); // allocator is needed for potential realloc(). // Fluent interface a.PushBack("Lua", allocator).PushBack("Mio", allocator); @@ -367,7 +371,7 @@ a.PushBack("Lua", allocator).PushBack("Mio", allocator); Differs from STL, `PushBack()`/`PopBack()` returns the array reference itself. This is called fluent interface. -### Manipulating Object +### Modify Object Object is a collection of key-value pairs. Each key must be a string value. The way to manipulating object is to add/remove members: * `Value& AddMember(Value&, Value&, Allocator& allocator)` @@ -376,7 +380,7 @@ Object is a collection of key-value pairs. Each key must be a string value. The * `template Value& AddMember(const Ch*, T value, Allocator&)` * `bool RemoveMember(const Ch*)` -There are 4 overloaded version of AddMember(). They are 4 combinations for supplying the name string (copy- or const-), whether to supply a different allocator for name string, and whether use generic type for value. +There are 4 overloaded version of `AddMember()`. They are 4 combinations for supplying the name string (copy- or const-), whether to supply a different allocator for name string, and whether use generic type for value. Here is an example. @@ -386,9 +390,31 @@ contact.AddMember("name", "Milo", document.GetAllocator()); contact.AddMember("married", true, document.GetAllocator()); ``` -### Object +### Deep Copy Value +Although we mentioned that copying values implicitly may have performance problem, sometimes, explicit copying is needed. Threr are two APIs for deep copy: constructor with allocator and `CopyFrom()`. -### Array +```cpp +Document d; +Document::AllocatorType& a = d.GetAllocator(); +Value v1("foo"); +// Value v2(v1); // not allowed -### String +Value v2(v1, a); // make a copy +RAPIDJSON_ASSERT(v1.IsString()); // v1 untouched +d.SetArray().PushBack(v1, a).PushBack(v2, a); +RAPIDJSON_ASSERT(v1.IsNull() && v2.IsNull()); // both moved to d +v2.CopyFrom(d, a); // copy whole document to v2 +RAPIDJSON_ASSERT(d.IsArray() && d.Size() == 2); // d untouched +v1.SetObject().AddMember( "array", v2, a ); +d.PushBack(v1,a); +``` + +### Swap Values + +## What's next + +Stream +Encoding +DOM +SAX