From 1b153f8d8d4b2f09afc2d039256c958e94bd3b05 Mon Sep 17 00:00:00 2001 From: Neil Date: Wed, 20 Dec 2023 09:24:23 +1100 Subject: Add IDocumentEditable interface for efficient interaction with document objects. --- src/Document.cxx | 12 ++++++++++-- src/Document.h | 6 ++++-- src/Editor.cxx | 14 +++++++++----- 3 files changed, 23 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/Document.cxx b/src/Document.cxx index dcb087930..d67cac25e 100644 --- a/src/Document.cxx +++ b/src/Document.cxx @@ -184,7 +184,7 @@ Document::~Document() { } // Increase reference count and return its previous value. -int Document::AddRef() { +int SCI_METHOD Document::AddRef() noexcept { return refCount++; } @@ -461,6 +461,10 @@ Sci_Position SCI_METHOD Document::LineEnd(Sci_Position line) const { return cb.LineEnd(line); } +int SCI_METHOD Document::DEVersion() const noexcept { + return deRelease0; +} + void SCI_METHOD Document::SetErrorStatus(int status) { // Tell the watchers an error has occurred. for (const WatcherWithUserData &watcher : watchers) { @@ -1341,8 +1345,12 @@ int SCI_METHOD Document::AddData(const char *data, Sci_Position length) { return static_cast(Status::Ok); } +IDocumentEditable *Document::AsDocumentEditable() noexcept { + return static_cast(this); +} + void * SCI_METHOD Document::ConvertToDocument() { - return this; + return AsDocumentEditable(); } Sci::Position Document::Undo() { diff --git a/src/Document.h b/src/Document.h index f7f4eeedd..9f51fc719 100644 --- a/src/Document.h +++ b/src/Document.h @@ -259,7 +259,7 @@ struct CharacterExtracted { /** */ -class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader { +class Document : PerLine, public Scintilla::IDocument, public Scintilla::ILoader, public Scintilla::IDocumentEditable { public: /** Used to pair watcher pointer with user data. */ @@ -329,7 +329,7 @@ public: Document &operator=(Document &&) = delete; ~Document() override; - int AddRef(); + int SCI_METHOD AddRef() noexcept override; int SCI_METHOD Release() override; // From PerLine @@ -347,6 +347,7 @@ public: int SCI_METHOD Version() const override { return Scintilla::dvRelease4; } + int SCI_METHOD DEVersion() const noexcept override; void SCI_METHOD SetErrorStatus(int status) override; @@ -383,6 +384,7 @@ public: Sci::Position InsertString(Sci::Position position, std::string_view sv); void ChangeInsertion(const char *s, Sci::Position length); int SCI_METHOD AddData(const char *data, Sci_Position length) override; + IDocumentEditable *AsDocumentEditable() noexcept; void * SCI_METHOD ConvertToDocument() override; Sci::Position Undo(); Sci::Position Redo(); diff --git a/src/Editor.cxx b/src/Editor.cxx index 28d680d7a..8f29d3a8f 100644 --- a/src/Editor.cxx +++ b/src/Editor.cxx @@ -6079,6 +6079,10 @@ constexpr Selection::SelTypes SelTypeFromMode(SelectionMode mode) { } } +sptr_t SPtrFromPtr(void *ptr) noexcept { + return reinterpret_cast(ptr); +} + } void Editor::SetSelectionMode(uptr_t wParam, bool setMoveExtends) { @@ -8216,11 +8220,11 @@ sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { break; case Message::GetDocPointer: - return reinterpret_cast(pdoc); + return SPtrFromPtr(pdoc->AsDocumentEditable()); case Message::SetDocPointer: CancelModes(); - SetDocPointer(static_cast(PtrFromSPtr(lParam))); + SetDocPointer(static_cast(static_cast(PtrFromSPtr(lParam)))); return 0; case Message::CreateDocument: { @@ -8228,15 +8232,15 @@ sptr_t Editor::WndProc(Message iMessage, uptr_t wParam, sptr_t lParam) { doc->AddRef(); doc->Allocate(PositionFromUPtr(wParam)); pcs = ContractionStateCreate(pdoc->IsLarge()); - return reinterpret_cast(doc); + return SPtrFromPtr(doc->AsDocumentEditable()); } case Message::AddRefDocument: - (static_cast(PtrFromSPtr(lParam)))->AddRef(); + (static_cast(PtrFromSPtr(lParam)))->AddRef(); break; case Message::ReleaseDocument: - (static_cast(PtrFromSPtr(lParam)))->Release(); + (static_cast(PtrFromSPtr(lParam)))->Release(); break; case Message::GetDocumentOptions: -- cgit v1.2.3