# std/reservedmem

Dark Mode

- Manual
- Standard library
- Index
- Compiler docs
- Fusion docs
- devel, stable

Search:
Source Edit

Authors: | Zahary Karadjov

This module provides utilities for reserving a portions of the address space of a program without consuming physical memory. It can be used to implement a dynamically resizable buffer that is guaranteed to remain in the same memory location. The buffer will be able to grow up to the size of the initially reserved portion of the address space.

Unstable API.

# Imports

os, posix

# Types

    MemAccessFlags = int

  Source Edit

    ReservedMem = object
      memStart: pointer
      usedMemEnd: pointer
      committedMemEnd: pointer
      memEnd: pointer
      maxCommittedAndUnusedPages: int
      accessFlags: MemAccessFlags

  Source Edit

    ReservedMemSeq[T] = object
      mem: ReservedMem

  Source Edit

# Lets

    memExec = MemAccessFlags(4'i32)

  Source Edit

    memExecRead = MemAccessFlags(5'i32)

  Source Edit

    memExecReadWrite = MemAccessFlags(7'i32)

  Source Edit

    memRead = MemAccessFlags(1'i32)

  Source Edit

    memReadWrite = MemAccessFlags(3'i32)

  Source Edit

# Procs

    func `[]`[T](s: ReservedMemSeq[T]; pos: Natural): lent T

  Source Edit

    func `[]`[T](s: ReservedMemSeq[T]; rpos: BackwardsIndex): lent T

  Source Edit

    func `[]`[T](s: var ReservedMemSeq[T]; pos: Natural): var T

  Source Edit

    func `[]`[T](s: var ReservedMemSeq[T]; rpos: BackwardsIndex): var T

  Source Edit

    proc add[T](s: var ReservedMemSeq[T]; val: T)

  Source Edit

    func commitedLen(m: ReservedMem): int {....raises: [], tags: [].}

  Source Edit

    func commitedLen[T](s: ReservedMemSeq[T]): int

  Source Edit

    proc init(SeqType: type ReservedMemSeq; maxLen: Natural; initLen: Natural = 0;
              initCommitLen: Natural = 0; memStart = pointer(nil);
              accessFlags = memReadWrite; maxCommittedAndUnusedPages = 3): SeqType:type

  Source Edit

    proc init(T: type ReservedMem; maxLen: Natural; initLen: Natural = 0;
              initCommitLen = initLen; memStart = pointer(nil);
              accessFlags = memReadWrite; maxCommittedAndUnusedPages = 3): ReservedMem

  Source Edit

    func len(m: ReservedMem): int {....raises: [], tags: [].}

  Source Edit

    func len[T](s: ReservedMemSeq[T]): int

  Source Edit

    func maxLen(m: ReservedMem): int {....raises: [], tags: [].}

  Source Edit

    func maxLen[T](s: ReservedMemSeq[T]): int

  Source Edit

    proc pop[T](s: var ReservedMemSeq[T]): T

  Source Edit

    proc setLen(m: var ReservedMem; newLen: int) {....raises: [OSError], tags: [].}

  Source Edit

    proc setLen[T](s: var ReservedMemSeq[T]; newLen: int)

  Source Edit

# Templates

    template distance(lhs, rhs: pointer): int

  Source Edit

    template shift(p: pointer; distance: int): pointer

  Source Edit