Skip to content

Commit 2503c20

Browse files
committed
First make everything a shared_ptr
Later we can find the unique ones
1 parent 13ef1e3 commit 2503c20

File tree

2 files changed

+39
-38
lines changed

2 files changed

+39
-38
lines changed

src/core/text-buffer.cc

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@
77
#include <sstream>
88
#include <unordered_map>
99
#include <vector>
10+
#include <memory>
1011

1112
using std::equal;
1213
using std::move;
1314
using std::pair;
1415
using std::string;
1516
using std::u16string;
1617
using std::vector;
18+
using std::unique_ptr;
19+
using std::make_unique;
20+
using std::shared_ptr;
21+
using std::make_shared;
1722
using MatchOptions = Regex::MatchOptions;
1823
using MatchResult = Regex::MatchResult;
1924
using SubsequenceMatch = TextBuffer::SubsequenceMatch;
@@ -23,7 +28,7 @@ uint32_t TextBuffer::MAX_CHUNK_SIZE_TO_COPY = 1024;
2328
static Text EMPTY_TEXT;
2429

2530
struct TextBuffer::Layer {
26-
Layer *previous_layer;
31+
std::shared_ptr<Layer> previous_layer;
2732
Patch patch;
2833
optional<Text> text;
2934
bool uses_patch;
@@ -40,7 +45,7 @@ struct TextBuffer::Layer {
4045
size_{this->text->size()},
4146
snapshot_count{0} {}
4247

43-
explicit Layer(Layer *previous_layer) :
48+
explicit Layer(std::shared_ptr<Layer> previous_layer) :
4449
previous_layer{previous_layer},
4550
patch{Patch()},
4651
uses_patch{true},
@@ -52,8 +57,8 @@ struct TextBuffer::Layer {
5257
return Point(position.row, position.column - 1);
5358
}
5459

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;
5762
while (predecessor != nullptr) {
5863
if (predecessor == layer) return true;
5964
predecessor = predecessor->previous_layer;
@@ -637,7 +642,7 @@ struct TextBuffer::Layer {
637642
return matches;
638643
}
639644

640-
bool is_modified(const Layer *base_layer) {
645+
bool is_modified(const shared_ptr<Layer> base_layer) {
641646
if (size() != base_layer->size()) return true;
642647

643648
bool result = false;
@@ -671,18 +676,17 @@ struct TextBuffer::Layer {
671676
};
672677

673678
TextBuffer::TextBuffer(u16string &&text) :
674-
base_layer{new Layer(move(text))},
679+
base_layer{make_shared<Layer>(Layer(move(text)))},
675680
top_layer{base_layer} {}
676681

677682
TextBuffer::TextBuffer() :
678-
base_layer{new Layer(Text{})},
683+
base_layer{make_shared<Layer>(Layer(Text{}))},
679684
top_layer{base_layer} {}
680685

681686
TextBuffer::~TextBuffer() {
682-
Layer *layer = top_layer;
687+
auto layer = top_layer;
683688
while (layer != nullptr) {
684-
Layer *previous_layer = layer->previous_layer;
685-
delete layer;
689+
auto previous_layer = layer->previous_layer;
686690
layer = previous_layer;
687691
}
688692
}
@@ -709,8 +713,7 @@ void TextBuffer::reset(Text &&new_base_text) {
709713

710714
layer = top_layer->previous_layer;
711715
while (layer != nullptr) {
712-
Layer *previous_layer = layer->previous_layer;
713-
delete layer;
716+
auto previous_layer = layer->previous_layer;
714717
layer = previous_layer;
715718
}
716719

@@ -723,10 +726,10 @@ void TextBuffer::reset(Text &&new_base_text) {
723726
top_layer->previous_layer = nullptr;
724727
}
725728

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) {
730733
patches.insert(patches.begin(), &layer->patch);
731734
layer = layer->previous_layer;
732735
}
@@ -767,7 +770,7 @@ void TextBuffer::serialize_changes(Serializer &serializer) {
767770
}
768771

769772
vector<const Patch *> patches;
770-
Layer *layer = top_layer;
773+
auto layer = top_layer;
771774
while (layer != base_layer) {
772775
patches.insert(patches.begin(), &layer->patch);
773776
layer = layer->previous_layer;
@@ -784,7 +787,7 @@ void TextBuffer::serialize_changes(Serializer &serializer) {
784787

785788
bool TextBuffer::deserialize_changes(Deserializer &deserializer) {
786789
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);
788791
top_layer->size_ = deserializer.read<uint32_t>();
789792
top_layer->extent_ = Point(deserializer);
790793
top_layer->patch = Patch(deserializer);
@@ -891,7 +894,7 @@ void TextBuffer::set_text(const u16string &new_text) {
891894

892895
void TextBuffer::set_text_in_range(Range old_range, u16string &&string) {
893896
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));
895898
}
896899

897900
auto start = clip_position(old_range.start);
@@ -968,13 +971,13 @@ bool TextBuffer::has_astral() {
968971
return top_layer->has_astral();
969972
}
970973

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));
973976
}
974977

975978
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;
978981
while (layer != nullptr) {
979982
layers.push_back(layer);
980983
layer = layer->previous_layer;
@@ -998,7 +1001,7 @@ string TextBuffer::get_dot_graph() const {
9981001

9991002
size_t TextBuffer::layer_count() const {
10001003
size_t result = 1;
1001-
const Layer *layer = top_layer;
1004+
auto layer = top_layer;
10021005
while (layer->previous_layer != nullptr) {
10031006
result++;
10041007
layer = layer->previous_layer;
@@ -1075,7 +1078,8 @@ TextBuffer::Snapshot::Snapshot(TextBuffer &buffer, TextBuffer::Layer &layer,
10751078
void TextBuffer::Snapshot::flush_preceding_changes() {
10761079
if (!layer.text) {
10771080
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);
10791083
buffer.consolidate_layers();
10801084
}
10811085
}
@@ -1090,8 +1094,8 @@ TextBuffer::Snapshot::~Snapshot() {
10901094
}
10911095

10921096
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;
10951099
bool needed_by_layer_above = false;
10961100

10971101
while (layer != nullptr) {
@@ -1116,7 +1120,7 @@ void TextBuffer::consolidate_layers() {
11161120
squash_layers(mutable_layers);
11171121
}
11181122

1119-
void TextBuffer::squash_layers(const vector<Layer *> &layers) {
1123+
void TextBuffer::squash_layers(const vector<shared_ptr<Layer>> &layers) {
11201124
size_t layer_index = 0;
11211125
size_t layer_count = layers.size();
11221126
if (layer_count < 2) return;
@@ -1147,7 +1151,7 @@ void TextBuffer::squash_layers(const vector<Layer *> &layers) {
11471151
// If there is another layer below these layers, combine their patches into
11481152
// into one. Otherwise, this is the new base layer, so we don't need a patch.
11491153
Patch patch;
1150-
Layer *previous_layer = layers.back()->previous_layer;
1154+
auto previous_layer = layers.back()->previous_layer;
11511155

11521156
if (previous_layer != nullptr) {
11531157
layer_index = layer_count - 1;
@@ -1166,8 +1170,4 @@ void TextBuffer::squash_layers(const vector<Layer *> &layers) {
11661170
layers[0]->previous_layer = previous_layer;
11671171
layers[0]->text = move(text);
11681172
layers[0]->patch = move(patch);
1169-
1170-
for (layer_index = 1; layer_index < layer_count; layer_index++) {
1171-
delete layers[layer_index];
1172-
}
11731173
}

src/core/text-buffer.h

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,13 @@
99
#include "range.h"
1010
#include "regex.h"
1111
#include "marker-index.h"
12+
#include <memory>
1213

1314
class TextBuffer {
1415
struct Layer;
15-
Layer *base_layer;
16-
Layer *top_layer;
17-
void squash_layers(const std::vector<Layer *> &);
16+
std::shared_ptr<Layer> base_layer;
17+
std::shared_ptr<Layer> top_layer;
18+
void squash_layers(const std::vector<std::shared_ptr<Layer>> &);
1819
void consolidate_layers();
1920

2021
public:
@@ -95,8 +96,8 @@ class TextBuffer {
9596
friend class Snapshot;
9697
Snapshot *create_snapshot();
9798

98-
bool is_modified(const Snapshot *) const;
99-
Patch get_inverted_changes(const Snapshot *) const;
99+
bool is_modified(const std::shared_ptr <Snapshot>) const;
100+
Patch get_inverted_changes(const std::shared_ptr<Snapshot>) const;
100101

101102
size_t layer_count() const;
102103
std::string get_dot_graph() const;

0 commit comments

Comments
 (0)