Notes for C++


1. Like in Python, default constructors of classes take the arguments in the order or the fields:

// API: struct ColorU { r: u8, g: u8, b: u8 a: u8 } // therefore the arguments to the default constructor are passed in order: auto color = ColorU(/*r*/ 255, /*g*/ 255, /*b*/ 255, /*a*/ 255);

2. Explicit constructors are static functions, enums use enum class (C++11):

auto window = WindowCreateOptions::default(LayoutSolver::Default);

3. All by-value arguments require std::move in order to prevent accidental copies:

auto window = WindowCreateOptions::default(LayoutSolver::Default);;

4. In difference to C, constructing a RefAny does not require macros, instead generics are used:

class MyStruct { int field; public: MyStruct(int f) noexcept: field(f) { } } auto object = RefAny::new(std::move(MyStruct(5))); auto objectref = object.downcastRef<MyStruct>(); if (objectref): // objectref = std::optional<Ref<MyStruct>> std::cout << objectref->ptr.field << std::endl; objectref.delete(); // release reference auto objectrefmut = object.downcastRefMut<MyStruct>(); if (objectrefmut):// objectrefmut = std::optional<RefMut<MyStruct>> std::cout << objectrefmut->ptr.field << std::endl; objectrefmut.delete(); // release reference // "object" RefAny destructor automatically decreases refcount here

5. All *Vec types have a _fromStdVector() function that converts a std::vector into the given Vec type without copying the contents of the array. Additionally a _fromStdString function exists to convert a std::string into a String type. All strings are UTF-8 encoded.

auto scancodes = std::vector{0,1,2,3}; auto converted = ScanCodeVec::fromStdVector(std::move(scancodes)); auto converted_back = converted.intoStdVector();

6. Like in C, all union enums have special functions to emulate pattern matching:

// create a union enum - Exact() is a constexpr function auto cursor = StyleCursorValue::Exact(StyleCursor::Grab); // destructure a union enum if (auto result = cursor.matchRefExact()) { // result = const StyleCursor* std::cout << result << std::endl; } if (auto result = cursor.matchRefMutExact()) { // result = StyleCursor* restrict *result = StyleCursor::Default; }