7
7
#include < sstream>
8
8
#include < unordered_map>
9
9
#include < vector>
10
+ #include < memory>
10
11
11
12
using std::equal;
12
13
using std::move;
13
14
using std::pair;
14
15
using std::string;
15
16
using std::u16string;
16
17
using std::vector;
18
+ using std::unique_ptr;
19
+ using std::make_unique;
20
+ using std::shared_ptr;
21
+ using std::make_shared;
17
22
using MatchOptions = Regex::MatchOptions;
18
23
using MatchResult = Regex::MatchResult;
19
24
using SubsequenceMatch = TextBuffer::SubsequenceMatch;
@@ -23,7 +28,7 @@ uint32_t TextBuffer::MAX_CHUNK_SIZE_TO_COPY = 1024;
23
28
static Text EMPTY_TEXT;
24
29
25
30
struct TextBuffer ::Layer {
26
- Layer * previous_layer;
31
+ std::shared_ptr< Layer> previous_layer;
27
32
Patch patch;
28
33
optional<Text> text;
29
34
bool uses_patch;
@@ -40,7 +45,7 @@ struct TextBuffer::Layer {
40
45
size_{this ->text ->size ()},
41
46
snapshot_count{0 } {}
42
47
43
- explicit Layer (Layer * previous_layer) :
48
+ explicit Layer (std::shared_ptr< Layer> previous_layer) :
44
49
previous_layer{previous_layer},
45
50
patch{Patch ()},
46
51
uses_patch{true },
@@ -52,8 +57,8 @@ struct TextBuffer::Layer {
52
57
return Point (position.row , position.column - 1 );
53
58
}
54
59
55
- bool is_above_layer (const Layer * layer) const {
56
- Layer * predecessor = previous_layer;
60
+ bool is_above_layer (const shared_ptr< Layer> layer) const {
61
+ auto predecessor = previous_layer;
57
62
while (predecessor != nullptr ) {
58
63
if (predecessor == layer) return true ;
59
64
predecessor = predecessor->previous_layer ;
@@ -637,7 +642,7 @@ struct TextBuffer::Layer {
637
642
return matches;
638
643
}
639
644
640
- bool is_modified (const Layer * base_layer) {
645
+ bool is_modified (const shared_ptr< Layer> base_layer) {
641
646
if (size () != base_layer->size ()) return true ;
642
647
643
648
bool result = false ;
@@ -671,18 +676,17 @@ struct TextBuffer::Layer {
671
676
};
672
677
673
678
TextBuffer::TextBuffer (u16string &&text) :
674
- base_layer{new Layer ( move (text))},
679
+ base_layer{make_shared< Layer>( Layer ( move (text) ))},
675
680
top_layer{base_layer} {}
676
681
677
682
TextBuffer::TextBuffer () :
678
- base_layer{new Layer ( Text{})},
683
+ base_layer{make_shared< Layer>( Layer ( Text{}) )},
679
684
top_layer{base_layer} {}
680
685
681
686
TextBuffer::~TextBuffer () {
682
- Layer * layer = top_layer;
687
+ auto layer = top_layer;
683
688
while (layer != nullptr ) {
684
- Layer *previous_layer = layer->previous_layer ;
685
- delete layer;
689
+ auto previous_layer = layer->previous_layer ;
686
690
layer = previous_layer;
687
691
}
688
692
}
@@ -709,8 +713,7 @@ void TextBuffer::reset(Text &&new_base_text) {
709
713
710
714
layer = top_layer->previous_layer ;
711
715
while (layer != nullptr ) {
712
- Layer *previous_layer = layer->previous_layer ;
713
- delete layer;
716
+ auto previous_layer = layer->previous_layer ;
714
717
layer = previous_layer;
715
718
}
716
719
@@ -723,10 +726,10 @@ void TextBuffer::reset(Text &&new_base_text) {
723
726
top_layer->previous_layer = nullptr ;
724
727
}
725
728
726
- Patch TextBuffer::get_inverted_changes (const Snapshot * snapshot) const {
727
- vector<const Patch *> patches;
728
- Layer * layer = top_layer;
729
- while (layer != &snapshot->base_layer ) {
729
+ Patch TextBuffer::get_inverted_changes (const shared_ptr< Snapshot> snapshot) const {
730
+ vector<const Patch*> patches;
731
+ auto layer = top_layer;
732
+ while (layer. get () != &snapshot->base_layer ) {
730
733
patches.insert (patches.begin (), &layer->patch );
731
734
layer = layer->previous_layer ;
732
735
}
@@ -767,7 +770,7 @@ void TextBuffer::serialize_changes(Serializer &serializer) {
767
770
}
768
771
769
772
vector<const Patch *> patches;
770
- Layer * layer = top_layer;
773
+ auto layer = top_layer;
771
774
while (layer != base_layer) {
772
775
patches.insert (patches.begin (), &layer->patch );
773
776
layer = layer->previous_layer ;
@@ -784,7 +787,7 @@ void TextBuffer::serialize_changes(Serializer &serializer) {
784
787
785
788
bool TextBuffer::deserialize_changes (Deserializer &deserializer) {
786
789
if (top_layer != base_layer || (base_layer->previous_layer != nullptr )) return false ;
787
- top_layer = new Layer (base_layer);
790
+ top_layer = make_shared< Layer> (base_layer);
788
791
top_layer->size_ = deserializer.read <uint32_t >();
789
792
top_layer->extent_ = Point (deserializer);
790
793
top_layer->patch = Patch (deserializer);
@@ -891,7 +894,7 @@ void TextBuffer::set_text(const u16string &new_text) {
891
894
892
895
void TextBuffer::set_text_in_range (Range old_range, u16string &&string) {
893
896
if (top_layer == base_layer || top_layer->snapshot_count > 0 ) {
894
- top_layer = new Layer ( top_layer);
897
+ top_layer = make_shared< Layer>( Layer ( top_layer) );
895
898
}
896
899
897
900
auto start = clip_position (old_range.start );
@@ -968,13 +971,13 @@ bool TextBuffer::has_astral() {
968
971
return top_layer->has_astral ();
969
972
}
970
973
971
- bool TextBuffer::is_modified (const Snapshot * snapshot) const {
972
- return top_layer->is_modified (& snapshot->base_layer );
974
+ bool TextBuffer::is_modified (const shared_ptr< Snapshot> snapshot) const {
975
+ return top_layer->is_modified (make_shared<Layer>( snapshot->base_layer ) );
973
976
}
974
977
975
978
string TextBuffer::get_dot_graph () const {
976
- Layer * layer = top_layer;
977
- vector<Layer * > layers;
979
+ auto layer = top_layer;
980
+ vector<shared_ptr< Layer> > layers;
978
981
while (layer != nullptr ) {
979
982
layers.push_back (layer);
980
983
layer = layer->previous_layer ;
@@ -998,7 +1001,7 @@ string TextBuffer::get_dot_graph() const {
998
1001
999
1002
size_t TextBuffer::layer_count () const {
1000
1003
size_t result = 1 ;
1001
- const Layer * layer = top_layer;
1004
+ auto layer = top_layer;
1002
1005
while (layer->previous_layer != nullptr ) {
1003
1006
result++;
1004
1007
layer = layer->previous_layer ;
@@ -1075,7 +1078,8 @@ TextBuffer::Snapshot::Snapshot(TextBuffer &buffer, TextBuffer::Layer &layer,
1075
1078
void TextBuffer::Snapshot::flush_preceding_changes () {
1076
1079
if (!layer.text ) {
1077
1080
layer.text = Text{text ()};
1078
- if (layer.is_above_layer (buffer.base_layer )) buffer.base_layer = &layer;
1081
+ if (layer.is_above_layer (buffer.base_layer ))
1082
+ buffer.base_layer = std::make_shared<Layer>(layer);
1079
1083
buffer.consolidate_layers ();
1080
1084
}
1081
1085
}
@@ -1090,8 +1094,8 @@ TextBuffer::Snapshot::~Snapshot() {
1090
1094
}
1091
1095
1092
1096
void TextBuffer::consolidate_layers () {
1093
- Layer * layer = top_layer;
1094
- vector<Layer * > mutable_layers;
1097
+ auto layer = top_layer;
1098
+ vector<shared_ptr< Layer> > mutable_layers;
1095
1099
bool needed_by_layer_above = false ;
1096
1100
1097
1101
while (layer != nullptr ) {
@@ -1116,7 +1120,7 @@ void TextBuffer::consolidate_layers() {
1116
1120
squash_layers (mutable_layers);
1117
1121
}
1118
1122
1119
- void TextBuffer::squash_layers (const vector<Layer * > &layers) {
1123
+ void TextBuffer::squash_layers (const vector<shared_ptr< Layer> > &layers) {
1120
1124
size_t layer_index = 0 ;
1121
1125
size_t layer_count = layers.size ();
1122
1126
if (layer_count < 2 ) return ;
@@ -1147,7 +1151,7 @@ void TextBuffer::squash_layers(const vector<Layer *> &layers) {
1147
1151
// If there is another layer below these layers, combine their patches into
1148
1152
// into one. Otherwise, this is the new base layer, so we don't need a patch.
1149
1153
Patch patch;
1150
- Layer * previous_layer = layers.back ()->previous_layer ;
1154
+ auto previous_layer = layers.back ()->previous_layer ;
1151
1155
1152
1156
if (previous_layer != nullptr ) {
1153
1157
layer_index = layer_count - 1 ;
@@ -1166,8 +1170,4 @@ void TextBuffer::squash_layers(const vector<Layer *> &layers) {
1166
1170
layers[0 ]->previous_layer = previous_layer;
1167
1171
layers[0 ]->text = move (text);
1168
1172
layers[0 ]->patch = move (patch);
1169
-
1170
- for (layer_index = 1 ; layer_index < layer_count; layer_index++) {
1171
- delete layers[layer_index];
1172
- }
1173
1173
}
0 commit comments