mirror of
https://github.com/Colton1skees/Dna
synced 2026-06-21 13:42:09 +00:00
95 lines
2.2 KiB
C++
95 lines
2.2 KiB
C++
#pragma once
|
|
|
|
#include <vector>
|
|
#include <llvm/ADT/ArrayRef.h>
|
|
#include <llvm/ADT/SmallVector.h>
|
|
#include <API/ExportDef.h>
|
|
|
|
namespace Dna::API {
|
|
class ImmutableManagedVector
|
|
{
|
|
public:
|
|
template <class T>
|
|
static ImmutableManagedVector* From(const std::vector<T*>* input)
|
|
{
|
|
auto managedVector = new ImmutableManagedVector();
|
|
for (auto item : *input)
|
|
{
|
|
managedVector->items->push_back(item);
|
|
}
|
|
|
|
return managedVector;
|
|
}
|
|
|
|
template <class T>
|
|
static ImmutableManagedVector* From(const std::vector<const T*>* input)
|
|
{
|
|
return ImmutableManagedVector::From((std::vector<T*>*)input);
|
|
}
|
|
|
|
template <class T>
|
|
static ImmutableManagedVector* NonCopyingFrom(const std::vector<T*>* input)
|
|
{
|
|
auto managedVector = new ImmutableManagedVector();
|
|
managedVector->items = (std::vector<void*>*)input;
|
|
return managedVector;
|
|
}
|
|
|
|
template <class T>
|
|
static ImmutableManagedVector* From(const llvm::ArrayRef<T*>* input)
|
|
{
|
|
auto managedVector = new ImmutableManagedVector();
|
|
for (auto item : *input)
|
|
{
|
|
managedVector->items->push_back(item);
|
|
}
|
|
|
|
return managedVector;
|
|
}
|
|
|
|
template <class T>
|
|
static ImmutableManagedVector* From(llvm::SmallVectorImpl<T*>* 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<void*>* items = new std::vector<void*>();
|
|
};
|
|
|
|
// 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<void*>();
|
|
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);
|
|
}
|
|
} |