summaryrefslogtreecommitdiff
path: root/vendor/codeberg.org/gruf/go-bitutil/flag.tpl
diff options
context:
space:
mode:
authorLibravatar kim <grufwub@gmail.com>2025-05-26 11:57:50 +0200
committerLibravatar tobi <kipvandenbos@noreply.codeberg.org>2025-05-26 11:57:50 +0200
commit326e04283a2536d64a7055bfef184f5817b691d6 (patch)
treeaf3f86c2ce3a0ce430825a84f653f8a1e2c40b03 /vendor/codeberg.org/gruf/go-bitutil/flag.tpl
parent[chore] update dependencies (#4188) (diff)
downloadgotosocial-326e04283a2536d64a7055bfef184f5817b691d6.tar.xz
[feature] update proof-of-work to allow setting required rounds (#4186)
# Description This updates our proof-of-work middleware, NoLLaMas, to work on a more easily configurable algorithm (thank you f0x for bringing this to my attention!). Instead of requiring that a solution with pre-determined number of '0' chars be found, it now pre-computes a result with a pre-determined nonce value that it expects the client to iterate up-to. (though with some level of jitter applied, to prevent it being too-easily gamed). This allows the user to configure roughly how many hash-encode rounds they want their clients to have to complete. ## Checklist - [x] I/we have read the [GoToSocial contribution guidelines](https://codeberg.org/superseriousbusiness/gotosocial/src/branch/main/CONTRIBUTING.md). - [x] I/we have discussed the proposed changes already, either in an issue on the repository, or in the Matrix chat. - [x] I/we have not leveraged AI to create the proposed changes. - [x] I/we have performed a self-review of added code. - [x] I/we have written code that is legible and maintainable by others. - [x] I/we have commented the added code, particularly in hard-to-understand areas. - [x] I/we have made any necessary changes to documentation. - [ ] I/we have added tests that cover new code. - [x] I/we have run tests and they pass locally with the changes. - [x] I/we have run `go fmt ./...` and `golangci-lint run`. Reviewed-on: https://codeberg.org/superseriousbusiness/gotosocial/pulls/4186 Co-authored-by: kim <grufwub@gmail.com> Co-committed-by: kim <grufwub@gmail.com>
Diffstat (limited to 'vendor/codeberg.org/gruf/go-bitutil/flag.tpl')
-rw-r--r--vendor/codeberg.org/gruf/go-bitutil/flag.tpl117
1 files changed, 117 insertions, 0 deletions
diff --git a/vendor/codeberg.org/gruf/go-bitutil/flag.tpl b/vendor/codeberg.org/gruf/go-bitutil/flag.tpl
new file mode 100644
index 000000000..ac00bfa97
--- /dev/null
+++ b/vendor/codeberg.org/gruf/go-bitutil/flag.tpl
@@ -0,0 +1,117 @@
+package bitutil
+
+import (
+ "strings"
+ "unsafe"
+)
+
+{{ range $idx, $size := . }}
+
+// Flags{{ $size.Size }} is a type-casted unsigned integer with helper
+// methods for easily managing up to {{ $size.Size }} bit-flags.
+type Flags{{ $size.Size }} uint{{ $size.Size }}
+
+// Get will fetch the flag bit value at index 'bit'.
+func (f Flags{{ $size.Size }}) Get(bit uint8) bool {
+ mask := Flags{{ $size.Size }}(1) << bit
+ return (f & mask != 0)
+}
+
+// Set will set the flag bit value at index 'bit'.
+func (f Flags{{ $size.Size }}) Set(bit uint8) Flags{{ $size.Size }} {
+ mask := Flags{{ $size.Size }}(1) << bit
+ return f | mask
+}
+
+// Unset will unset the flag bit value at index 'bit'.
+func (f Flags{{ $size.Size }}) Unset(bit uint8) Flags{{ $size.Size }} {
+ mask := Flags{{ $size.Size }}(1) << bit
+ return f & ^mask
+}
+
+{{ range $idx := $size.Bits }}
+
+// Get{{ $idx }} will fetch the flag bit value at index {{ $idx }}.
+func (f Flags{{ $size.Size }}) Get{{ $idx }}() bool {
+ const mask = Flags{{ $size.Size }}(1) << {{ $idx }}
+ return (f & mask != 0)
+}
+
+// Set{{ $idx }} will set the flag bit value at index {{ $idx }}.
+func (f Flags{{ $size.Size }}) Set{{ $idx }}() Flags{{ $size.Size }} {
+ const mask = Flags{{ $size.Size }}(1) << {{ $idx }}
+ return f | mask
+}
+
+// Unset{{ $idx }} will unset the flag bit value at index {{ $idx }}.
+func (f Flags{{ $size.Size }}) Unset{{ $idx }}() Flags{{ $size.Size }} {
+ const mask = Flags{{ $size.Size }}(1) << {{ $idx }}
+ return f & ^mask
+}
+
+{{ end }}
+
+// String returns a human readable representation of Flags{{ $size.Size }}.
+func (f Flags{{ $size.Size }}) String() string {
+ var (
+ i int
+ val bool
+ buf []byte
+ )
+
+ // Make a prealloc est. based on longest-possible value
+ const prealloc = 1+(len("false ")*{{ $size.Size }})-1+1
+ buf = make([]byte, prealloc)
+
+ buf[i] = '{'
+ i++
+
+ {{ range $idx := .Bits }}
+ val = f.Get{{ $idx }}()
+ i += copy(buf[i:], bool2str(val))
+ buf[i] = ' '
+ i++
+ {{ end }}
+
+ buf[i-1] = '}'
+ buf = buf[:i]
+
+ return *(*string)(unsafe.Pointer(&buf))
+}
+
+// GoString returns a more verbose human readable representation of Flags{{ $size.Size }}.
+func (f Flags{{ $size.Size }})GoString() string {
+ var (
+ i int
+ val bool
+ buf []byte
+ )
+
+ // Make a prealloc est. based on longest-possible value
+ const prealloc = len("bitutil.Flags{{ $size.Size }}{")+(len("{{ sub $size.Size 1 }}=false ")*{{ $size.Size }})-1+1
+ buf = make([]byte, prealloc)
+
+ i += copy(buf[i:], "bitutil.Flags{{ $size.Size }}{")
+
+ {{ range $idx := .Bits }}
+ val = f.Get{{ $idx }}()
+ i += copy(buf[i:], "{{ $idx }}=")
+ i += copy(buf[i:], bool2str(val))
+ buf[i] = ' '
+ i++
+ {{ end }}
+
+ buf[i-1] = '}'
+ buf = buf[:i]
+
+ return *(*string)(unsafe.Pointer(&buf))
+}
+
+{{ end }}
+
+func bool2str(b bool) string {
+ if b {
+ return "true"
+ }
+ return "false"
+} \ No newline at end of file