diff --git a/Project.toml b/Project.toml index f760ecc..f194eeb 100644 --- a/Project.toml +++ b/Project.toml @@ -1,7 +1,7 @@ name = "ManualMemory" uuid = "d125e4d3-2237-4719-b19c-fa641b8a4667" authors = ["chriselrod and contributors"] -version = "0.1.6" +version = "0.1.7" [compat] julia = "1.5" diff --git a/README.md b/README.md index 860615a..878e620 100644 --- a/README.md +++ b/README.md @@ -4,3 +4,35 @@ [![Dev](https://img.shields.io/badge/docs-dev-blue.svg)](https://JuliaSIMD.github.io/ManualMemory.jl/dev) [![Build Status](https://github.com/JuliaSIMD/ManualMemory.jl/actions/workflows/CI.yml/badge.svg)](https://github.com/JuliaSIMD/ManualMemory.jl/actions/workflows/CI.yml) [![Coverage](https://codecov.io/gh/JuliaSIMD/ManualMemory.jl/branch/main/graph/badge.svg)](https://codecov.io/gh/JuliaSIMD/ManualMemory.jl) + +Manually managed memory buffers backed by NTuples + +### Examples + +```julia +julia> using ManualMemory: MemoryBuffer, load, store!, LazyPreserve, preserve, PseudoPtr, Reference + +julia> m = MemoryBuffer{4,Float64}(undef) +MemoryBuffer{4, Float64}((2.283825594e-314, 2.2157350003e-314, 2.216358792e-314, 2.08e-322)) + +julia> store!(pointer(m), 1.23) + +julia> load(pointer(m)) +1.23 +``` +Specifying an existing `NTuple` of data: +```julia +julia> s = (1,2,3,4,5); + +julia> m = MemoryBuffer(s) +MemoryBuffer{5, Int64}((1, 2, 3, 4, 5)) + +julia> load(p) +1 + +julia> load(p+sizeof(Int64)) +2 + +julia> load(p+sizeof(Int64)*2) +3 +``` diff --git a/src/ManualMemory.jl b/src/ManualMemory.jl index 9b68dd0..5ecc335 100644 --- a/src/ManualMemory.jl +++ b/src/ManualMemory.jl @@ -6,6 +6,10 @@ mutable struct MemoryBuffer{N,T} @assert Base.allocatedinline(T) new{N,T}() end + @inline function MemoryBuffer(data::NTuple{N,T}) where {N,T} + @assert Base.allocatedinline(T) + new{N,T}(data) + end end @inline Base.unsafe_convert(::Type{Ptr{T}}, m::MemoryBuffer) where {T} = Ptr{T}(pointer_from_objref(m)) @inline Base.pointer(m::MemoryBuffer{N,T}) where {N,T} = Ptr{T}(pointer_from_objref(m)) diff --git a/test/runtests.jl b/test/runtests.jl index 7fc1516..6854a6c 100644 --- a/test/runtests.jl +++ b/test/runtests.jl @@ -31,8 +31,11 @@ using Test store!(pointer(x), 1) @test load(pointer(x)) === 1 === load(pointer(y)) end + + # Test construction with existing data + s = (1,2,3,4,5) + @test MemoryBuffer(s).data === s end using ThreadingUtilities include(joinpath(pkgdir(ThreadingUtilities), "test", "runtests.jl")) -