mirror of
https://github.com/tursom/GoCollections.git
synced 2025-02-26 20:20:31 +08:00
60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package util
|
|
|
|
import "github.com/tursom/GoCollections/lang"
|
|
|
|
type (
|
|
Reference[R any] interface {
|
|
GetReference() R
|
|
}
|
|
MutableReference[R any] interface {
|
|
SetReference(reference R)
|
|
GetReference() R
|
|
}
|
|
StrongReference[R any] struct {
|
|
lang.BaseObject
|
|
reference R
|
|
}
|
|
NoReference[R any] struct {
|
|
lang.BaseObject
|
|
}
|
|
)
|
|
|
|
func NewStrongReference[R any](reference R) *StrongReference[R] {
|
|
return &StrongReference[R]{
|
|
reference: reference,
|
|
}
|
|
}
|
|
|
|
func NewNoReference[R any]() *NoReference[R] {
|
|
return &NoReference[R]{}
|
|
}
|
|
|
|
func (r *StrongReference[R]) Equals(o lang.Object) bool {
|
|
if r == o {
|
|
return true
|
|
}
|
|
if objectReference, ok := o.(Reference[R]); ok {
|
|
if reference, ok := any(r.reference).(lang.Equable); ok {
|
|
if referenceObject, ok := any(objectReference.GetReference()).(lang.Object); ok {
|
|
return reference.Equals(referenceObject)
|
|
}
|
|
}
|
|
}
|
|
return r == o
|
|
}
|
|
|
|
func (r *StrongReference[R]) SetReference(reference R) {
|
|
r.reference = reference
|
|
}
|
|
|
|
func (r *StrongReference[R]) GetReference() R {
|
|
return r.reference
|
|
}
|
|
|
|
func (r *NoReference[R]) SetReference(_ R) {
|
|
}
|
|
|
|
func (r *NoReference[R]) GetReference() R {
|
|
return lang.Nil[R]()
|
|
}
|