#pragma once #include #include #include #include namespace Dna::API { class ImmutableManagedVector { public: template static ImmutableManagedVector* From(const std::vector* input) { auto managedVector = new ImmutableManagedVector(); for (auto item : *input) { managedVector->items->push_back(item); } return managedVector; } template static ImmutableManagedVector* From(const std::vector* input) { return ImmutableManagedVector::From((std::vector*)input); } template static ImmutableManagedVector* NonCopyingFrom(const std::vector* input) { auto managedVector = new ImmutableManagedVector(); managedVector->items = (std::vector*)input; return managedVector; } template static ImmutableManagedVector* From(const llvm::ArrayRef* input) { auto managedVector = new ImmutableManagedVector(); for (auto item : *input) { managedVector->items->push_back(item); } return managedVector; } template static ImmutableManagedVector* From(llvm::SmallVectorImpl* input) { auto managedVector = new ImmutableManagedVector(); for (auto item : *input) { managedVector->items->push_back(item); } return managedVector; } int GetCount() { return items->size(); } void* GetElement(int index) { return items->at(index); } std::vector* items = new std::vector(); }; // Helper function that's exported to managed code. This allows us to create vectors // from managed code. DNA_EXPORT ImmutableManagedVector* ImmutableManagedVector_FromManagedArray(void** inputArray, int count) { auto items = new std::vector(); for (int i = 0; i < count; i++) items->push_back(inputArray[i]); return ImmutableManagedVector::NonCopyingFrom(items); } DNA_EXPORT unsigned int ImmutableManagedVector_GetCount(ImmutableManagedVector* vec) { return vec->GetCount(); } DNA_EXPORT void* ImmutableManagedVector_GetElementAt(ImmutableManagedVector* vec, int index) { return vec->GetElement(index); } }