pmaps

package
v0.4.171 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 12, 2024 License: ISC Imports: 4 Imported by: 1

Documentation

Overview

Package pmaps provides an unordered, thread-safe, RWMutex-mechanic map pmaps.RWMap.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func GoMapSize added in v0.4.75

func GoMapSize[K comparable, V any](m map[K]V) (size uint64)

GoMapSize returns the current size of the bucket array of Go map m

  • size is 0 for a nil map
  • size is 1 for an unallocated hash-table — rare case
  • otherwise size is a power of 2

About Go map:

  • Go map is a hash map
  • a hash table is a space-time trade-off compared to array access
  • size is how many slots m’s hash table currently has
  • size may grow or shrink as m is modified
  • a mapping of the hash value-space is used for hash-table array access
  • each map slot contains a linked list of key-value pairs
  • more slots is faster closing in on O(1) complexity, fewer slots saves memory
  • Load factor is number of hash-table entries including collisions divided by hash table size

Source code:

  • the map source code part of the runtime package is available online:
  • https://go.googlesource.com/go/+/refs/heads/master/src/runtime/map.go
  • runtime source is typically installed on a computer that has Go:
  • — module directory: …libexec/src, package directory: runtime
  • — on macOS homebrew similar to: …/homebrew/Cellar/go/1.20.2/libexec/src

func NewRWMap

func NewRWMap[K comparable, V any]() (rwMap parli.ThreadSafeMap[K, V])

NewRWMap returns a thread-safe map implementation

Types

type RWMap

type RWMap[K comparable, V any] struct {
	// contains filtered or unexported fields
}

RWMap is a thread-safe mapping based on read/write mutex

  • 5 native Go map functions: Get Put Delete Length Range
  • — Delete optionally writes zero-value
  • complex atomic methods:
  • — GetOrCreate method is an atomic, thread-safe operation as opposed to Get-then-Put
  • — PutIf is atomic, thread-safe operation
  • convenience methods:
  • — Clone Clone2 based on maps.Clone
  • — Clear using fast recreate or maps.Range optionally writing zero-values
  • order functions:
  • — List unordered values
  • — Keys unordered keys
  • V is copied so if V is large or contains locks, use pointer to V type
  • RWMap implements parli.ThreadSafeMap[K comparable, V any]
  • map mechanic is Go map
  • RWMap uses reader/writer mutual exclusion lock for slightly higher performance
  • Get methods are O(1)
  • innermost type provides thread-safety
  • outermost type provides map api

func NewRWMap2 added in v0.4.34

func NewRWMap2[K comparable, V any]() (rwMap *RWMap[K, V])

NewRWMap2 returns a thread-safe map implementation

func (*RWMap) Clear

func (m *RWMap) Clear(useRange ...bool)

Clear empties the map

func (*RWMap[K, V]) Clone

func (m *RWMap[K, V]) Clone() (clone parli.ThreadSafeMap[K, V])

Clone returns a shallow clone of the map

func (*RWMap[K, V]) Clone2 added in v0.4.47

func (m *RWMap[K, V]) Clone2() (clone *RWMap[K, V])

Clone returns a shallow clone of the map

func (*RWMap) Delete

func (m *RWMap) Delete(key K, useZeroValue ...bool)

func (*RWMap) Get

func (m *RWMap) Get(key K) (value V, ok bool)

func (*RWMap) GetOrCreate

func (m *RWMap) GetOrCreate(
	key K,
	newV func() (value *V),
	makeV func() (value V),
) (value V, hasValue bool)

GetOrCreate returns an item from the map if it exists otherwise creates it.

  • newV or makeV are invoked in the critical section, ie. these functions may not access the map or deadlock
  • if a key is mapped, its value is returned
  • otherwise, if newV and makeV are both nil, nil is returned.
  • otherwise, if newV is present, it is invoked to return a pointer ot a value. A nil return value from newV causes panic. A new mapping is created using the value pointed to by the newV return value.
  • otherwise, a mapping is created using whatever makeV returns
  • newV and makeV may not access the map. The map’s write lock is held during their execution
  • GetOrCreate is an atomic, thread-safe operation
  • value insert is O(log n)

func (*RWMap[K, V]) Keys added in v0.4.47

func (m *RWMap[K, V]) Keys(n ...int) (keys []K)

Keys provides the mapping keys, undefined ordering

  • O(n)
  • invoked while holding RLock or Lock

func (*RWMap) Length

func (m *RWMap) Length() (length int)

func (*RWMap) List

func (m *RWMap) List(n ...int) (list []V)

List provides the mapped values, undefined ordering

  • O(n)

func (*RWMap) Put

func (m *RWMap) Put(key K, value V)

func (*RWMap[K, V]) PutIf added in v0.4.39

func (m *RWMap[K, V]) PutIf(key K, value V, putIf func(value V) (doPut bool)) (wasNewKey bool)

Putif is conditional Put depending on the return value from the putIf function

  • if key does not exist in the map, the put is carried out and wasNewKey is true
  • if key exists and putIf is nil or returns true, the put is carried out and wasNewKey is false
  • if key exists and putIf returns false, the put is not carried out and wasNewKey is false
  • during PutIf, the map cannot be accessed and the map’s write-lock is held
  • PutIf is an atomic, thread-safe operation

func (*RWMap) Range added in v0.4.93

func (m *RWMap) Range(rangeFunc func(key K, value V) (keepGoing bool)) (rangedAll bool)

Directories

Path Synopsis
Package pmaps2 contains resusable map types for other parl packages.
Package pmaps2 contains resusable map types for other parl packages.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL