summaryrefslogtreecommitdiff
path: root/chromium/v8/samples/cppgc/hello-world.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/v8/samples/cppgc/hello-world.cc')
-rw-r--r--chromium/v8/samples/cppgc/hello-world.cc64
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;
+}