diff options
Diffstat (limited to 'chromium/v8/samples/cppgc/hello-world.cc')
-rw-r--r-- | chromium/v8/samples/cppgc/hello-world.cc | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/chromium/v8/samples/cppgc/hello-world.cc b/chromium/v8/samples/cppgc/hello-world.cc new file mode 100644 index 00000000000..d76c16a5536 --- /dev/null +++ b/chromium/v8/samples/cppgc/hello-world.cc @@ -0,0 +1,64 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <cppgc/allocation.h> +#include <cppgc/default-platform.h> +#include <cppgc/garbage-collected.h> +#include <cppgc/heap.h> +#include <cppgc/member.h> +#include <cppgc/visitor.h> + +#include <iostream> +#include <memory> +#include <string> + +/** + * This sample program shows how to set up a stand-alone cppgc heap. + */ + +/** + * Simple string rope to illustrate allocation and garbage collection below. + * The rope keeps the next parts alive via regular managed reference. + */ +class Rope final : public cppgc::GarbageCollected<Rope> { + public: + explicit Rope(std::string part, Rope* next = nullptr) + : part_(part), next_(next) {} + + void Trace(cppgc::Visitor* visitor) const { visitor->Trace(next_); } + + private: + std::string part_; + cppgc::Member<Rope> next_; + + friend std::ostream& operator<<(std::ostream& os, const Rope& rope) { + os << rope.part_; + if (rope.next_) { + os << *rope.next_; + } + return os; + } +}; + +int main(int argc, char* argv[]) { + // Create a default platform that is used by cppgc::Heap for execution and + // backend allocation. + auto cppgc_platform = std::make_shared<cppgc::DefaultPlatform>(); + // Initialize the process. This must happen before any cppgc::Heap::Create() + // calls. + cppgc::DefaultPlatform::InitializeProcess(cppgc_platform.get()); + // Create a managed heap. + std::unique_ptr<cppgc::Heap> heap = cppgc::Heap::Create(cppgc_platform); + // Allocate a string rope on the managed heap. + auto* greeting = cppgc::MakeGarbageCollected<Rope>( + heap->GetAllocationHandle(), "Hello ", + cppgc::MakeGarbageCollected<Rope>(heap->GetAllocationHandle(), "World!")); + // Manually trigger garbage collection. The object greeting is held alive + // through conservative stack scanning. + heap->ForceGarbageCollectionSlow("CppGC example", "Testing"); + std::cout << *greeting << std::endl; + // Gracefully shutdown the process. + cppgc::ShutdownProcess(); + return 0; +} |