FlashyDJ.Slotmaps
0.1.0-alpha
dotnet add package FlashyDJ.Slotmaps --version 0.1.0-alpha
NuGet\Install-Package FlashyDJ.Slotmaps -Version 0.1.0-alpha
<PackageReference Include="FlashyDJ.Slotmaps" Version="0.1.0-alpha" />
paket add FlashyDJ.Slotmaps --version 0.1.0-alpha
#r "nuget: FlashyDJ.Slotmaps, 0.1.0-alpha"
// Install FlashyDJ.Slotmaps as a Cake Addin #addin nuget:?package=FlashyDJ.Slotmaps&version=0.1.0-alpha&prerelease // Install FlashyDJ.Slotmaps as a Cake Tool #tool nuget:?package=FlashyDJ.Slotmaps&version=0.1.0-alpha&prerelease
<h1 align="center"> Slotmaps </h1>
<p align="center"> A <span style="font-weight:bold">C# .NET</span> library designed for slot-based data structures, enabling organized and quick item access using unique and persistent keys. </p>
<div align="center"> <p align="center"> <a href="https://dotnet.microsoft.com/en-us/languages/csharp"> <img src="https://img.shields.io/badge/%E2%A0%80CSharp%E2%A0%80-512BD4?style=for-the-badge&logo=c-sharp&logoColor=white&logoWidth=20" hspace="5" height="35"/> </a> <a href="https://dotnet.microsoft.com/"> <img src="https://img.shields.io/badge/%E2%A0%80dotnet%E2%A0%80-512BD4?style=for-the-badge&logo=dotnet&logoColor=white&logoWidth=20" hspace="5" height="35"/> </a> <a href="https://github.com/FlashyDJ/Slotmaps/blob/main/LICENSE"> <img src="https://img.shields.io/badge/MIT-License-a31f34?style=for-the-badge&labelColor=a31f34&color=545759" hspace="5" height="35"/> </a> </p> <a href="https://www.nuget.org/packages/FlashyDJ.Slotmaps/#versions-body-tab"> <img src="https://img.shields.io/badge/NuGet-004880?style=for-the-badge&logo=nuget" hspace="5"/> </a> <a href="https://flashydj.github.io/Slotmaps/"> <img src="https://img.shields.io/website?up_message=Live&down_message=Down&url=https%3A%2F%2Fflashydj.github.io%2FSlotmaps%2F&style=for-the-badge&logo=github&label=Documentation" hspace="5"/> </a> </div>
Table of Contents 📑
- Introduction
- Features
- Getting Started
- Basic Usage
- Documentation
- Contributing
- License
- Special Thanks
- Status
Introduction ✨
This library provides an implementation of slot-based data structures that allows you to store values in collections that assign them unique keys. You can use these keys to access, modify or remove the values later.
The collections are very efficient, as they can perform these operations in constant time with low overhead. These are especially useful for scenarios where you need to keep track of objects that do not have a clear owner, such as game entities or graph nodes.
Features 🎯
This library offers the following features:
- Efficient storage and retrieval of objects with constant-time complexity.
- Stable and unique identifiers for objects, even after removals.
- Generic type parameters to store any kind of values in the collections and secondary collections.
- Two types of secondary collections to associate additional data with collection keys:
SecondaryMap
andSparseSecondaryMap
. - Comprehensive unit tests to ensure correctness.
Getting Started 🚀
To use this library, you need to have a C# project that targets .NET 8 or higher. You can install the library from NuGet using the following command:
dotnet add package FlashyDJ.Slotmaps
Alternatively, you can download the source code from this repository and build it yourself.
Basic Usage ⚡
To use the collections, you need to import the FlashyDJ.Slotmaps
namespace in your code:
using FlashyDJ.Slotmaps;
SlotMap (Primary Map)
You can create a collection of your desired type and store values in it:
// Create a SlotMap
SlotMap<string> slotMap = new SlotMap<string>();
// Add some values and get their keys.
SlotKey key1 = slotMap.Add("Item 1");
SlotKey key2 = slotMap.Add("Item 2");
SlotKey key3 = slotMap.Add("Item 3");
// Replacing value from slot
SlotKey newKey2 = slotMap.Insert(key2, "Updated Item 2");
// Access the value using the keys
Console.WriteLine(slotMap[key1]); // Prints "Item 1"
Console.WriteLine(slotMap[newKey2]); // Prints "Updated Item 2"
Console.WriteLine(slotMap[key3]); // Prints "Item 3"
Console.WriteLine(slotMap[key2]); // Throws KeyNotFoundException
// Remove a value using its key
slotMap.Remove(key1);
// The removed key is no longer valid.
Console.WriteLine(slotMap.ContainsKey(key1)); // Prints "False"
Secondary Maps
You can also create secondary collections that can map the keys returned by a collection to other values, to attach extra data to objects stored in collections:
// Create a SlotMap and a SecondaryMap
SlotMap<string> slotMap = a SlotMap<string>();
SecondaryMap<int> secondaryMap = new SecondaryMap<int>();
// Add values to the SlotMap
SlotKey key1 = slotMap.Add("Item 1");
SlotKey key2 = slotMap.Add("Item 2");
// Insert some values using the keys from the primary map (SlotMap).
secondaryMap.Insert(key1, 42);
secondaryMap.Insert(key2, 56);
// Retrieve items using the keys from the primary map (SlotMap).
Console.WriteLine(secondaryMap[key1]); // Prints "42"
Console.WriteLine(secondaryMap[key2]); // Print "56"
There is only one primary type of collection available at the moment: SlotMap
. More types of collections will be added in the future.
Documentation 📖
For more details and examples, please refer to the documentation. The API References can also be found there.
Contributing 👋
This library is open for contributions from anyone who is interested. If you have any ideas, suggestions or bug reports, please open an issue or a pull request on this repository.
License 📋
This library is licensed under the MIT license. See the LICENSE file for more details.
Acknowledgement 💎
This C# library is inspired by the Rust crate slotmap, created by orlp. This adapts the ideas and core concepts of the Rust implementation.
Status 🛠️
Builds
Branch | Debug | Release |
---|---|---|
Unit Tests
Branch | Debug | Release |
---|---|---|
NuGet Builds
Branch | Debug | Release |
---|---|---|
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
0.1.0-alpha | 84 | 10/10/2023 |