Commit ccafac30 authored by LUXEY Adrien's avatar LUXEY Adrien
Browse files

trashing concrete types

parent 2e9d1156
......@@ -15,30 +15,30 @@ type Describer interface {
Younger(Describer) bool
}
// Descriptor implements the cyclon.Describer interface
// It gives descriptor's age operations in addition to gossip.Descriptor functionality
type Descriptor struct {
gossip.Describer
MyAge int
}
func NewDescriptor(IP string) (d *Descriptor) {
return &Descriptor{gossip.NewDescriptor(IP), 0}
}
func NewDescriptorFromGossipDescriber(gd gossip.Describer) (d *Descriptor) {
return &Descriptor{gd, 0}
}
func (d *Descriptor) Age() int { return d.MyAge }
func (d *Descriptor) Copy() gossip.Describer {
return &Descriptor{d.Describer.Copy(), d.MyAge}
}
func (d *Descriptor) IncrementAge() { d.MyAge++ }
func (d *Descriptor) ResetAge() { d.MyAge = 0 }
func (d *Descriptor) String() string {
return fmt.Sprintf("cyclon.Descriptor(%p){ID: %s, IP: %s, Age: %d}",
d, d.ID(), d.IP(), d.MyAge)
}
func (d *Descriptor) Younger(d1 Describer) bool { return d.MyAge < d1.Age() }
// // Descriptor implements the cyclon.Describer interface
// // It gives descriptor's age operations in addition to gossip.Descriptor functionality
// type Descriptor struct {
// gossip.Describer
// MyAge int
// }
// func NewDescriptor(IP string) (d *Descriptor) {
// return &Descriptor{gossip.NewDescriptor(IP), 0}
// }
// func NewDescriptorFromGossipDescriber(gd gossip.Describer) (d *Descriptor) {
// return &Descriptor{gd, 0}
// }
// func (d *Descriptor) Age() int { return d.MyAge }
// func (d *Descriptor) Copy() gossip.Describer {
// return &Descriptor{d.Describer.Copy(), d.MyAge}
// }
// func (d *Descriptor) IncrementAge() { d.MyAge++ }
// func (d *Descriptor) ResetAge() { d.MyAge = 0 }
// func (d *Descriptor) String() string {
// return fmt.Sprintf("cyclon.Descriptor(%p){ID: %s, IP: %s, Age: %d}",
// d, d.ID(), d.IP(), d.MyAge)
// }
// func (d *Descriptor) Younger(d1 Describer) bool { return d.MyAge < d1.Age() }
......@@ -13,121 +13,127 @@ type Viewer interface {
ResetAge()
}
// View implements Viewer
// It gives descriptor's age operation in addition to gossip.View functionality
type View struct {
gossip.View
}
// // View implements Viewer
// // It gives descriptor's age operation in addition to gossip.View functionality
// type View struct {
// gossip.Viewer
// }
// func NewView(items ...gossip.Describer) (Viewer, error) {
// v := new(View)
// v.View = make(map[string]gossip.Describer)
// if err := v.Add(items...); err != nil {
// gossipView, err := gossip.NewView(items...)
// if err != nil {
// return nil, err
// }
// return v, nil
// return &View{gossipView}, nil
// // v := new(View)
// // v.View = NewView(items)
// // if err := v.Add(items...); err != nil {
// // return nil, err
// // }
// // return v, nil
// }
// ----------------- Age functionality -----------------
func (v *View) IncrementAge() {
for _, item := range v.View {
if cyItem, ok := item.(Describer); !ok {
panic(fmt.Sprintf(
"cyclon.View contains an item that is not an cyclon.Describer: %v of type %T",
item, item))
} else {
cyItem.IncrementAge()
}
}
}
func (v *View) Oldest() Describer {
oldestAge := 0
oldestKey := ""
for key, item := range v.View {
if cyItem, ok := item.(Describer); !ok {
panic(fmt.Sprintf(
"cyclon.View contains an item that is not a cyclon.Describer: %v of type %T",
item, item))
} else {
if cyItem.Age() > oldestAge {
oldestKey = key
oldestAge = cyItem.Age()
}
}
}
return v.View[oldestKey].Copy().(Describer)
}
func (v *View) ResetAge() {
for key := range v.View {
if cyItem, ok := v.View[key].(*Descriptor); !ok {
panic(fmt.Sprintf(
"cyclon.View contains an item that is not a *cyclon.Descriptor: %v of type %T",
cyItem, cyItem))
} else {
cyItem.ResetAge()
}
}
}
// ----------------- Overrides from gossip.View -----------------
// func UnionView(views ...gossip.Viewer) (Viewer, error) {
// v, _ := gossip.NewView()
// for _, view := range views {
// if view == nil {
// continue
// // ----------------- Age functionality -----------------
// func (v *View) IncrementAge() {
// for _, item := range v.List() {
// if cyItem, ok := item.(Describer); !ok {
// panic(fmt.Sprintf(
// "cyclon.View contains an item that is not an cyclon.Describer: %v of type %T",
// item, item))
// } else {
// cyItem.IncrementAge()
// }
// if err := v.Add(view.List()...); err != nil {
// return nil, err
// }
// }
// func (v *View) Oldest() Describer {
// oldestAge := 0
// oldestKey := ""
// for _, item := range v.List() {
// if cyItem, ok := item.(Describer); !ok {
// panic(fmt.Sprintf(
// "cyclon.View contains an item that is not a cyclon.Describer: %v of type %T",
// item, item))
// } else {
// if cyItem.Age() > oldestAge {
// oldestKey = item.ID()
// oldestAge = cyItem.Age()
// }
// }
// }
// return v.Get(oldestKey).(Describer)
// }
// func (v *View) ResetAge() {
// for _, item := range v.List() {
// if cyItem, ok := v.Get(item.ID()).(Describer); cyItem != nil {
// panic(fmt.Sprintf(
// "cyclon.View contains an item that is not a *cyclon.Descriptor: %v of type %T",
// cyItem, cyItem))
// } else {
// cyItem.ResetAge()
// }
// return v, nil
// }
// }
func (v *View) Add(items ...gossip.Describer) error {
var ok bool
for _, item := range items {
if item == nil {
continue
}
// Type assertion/cast for parameter item
var toAdd Describer
if toAdd, ok = item.(Describer); !ok {
toAdd = NewDescriptorFromGossipDescriber(item)
}
// When duplicates...
var d gossip.Describer
if d, ok = v.View[toAdd.ID()]; ok {
// Type assertion/cast for internal item
var existing Describer
if existing, ok = d.(Describer); !ok {
panic(fmt.Sprintf(
"Value %v of type %T should be of type cyclon.Describer",
existing, existing))
}
// ...keep younger
if existing.Younger(toAdd) {
continue
}
}
v.View[toAdd.ID()] = toAdd.Copy()
}
return nil
}
// // ----------------- Overrides from gossip.View -----------------
// // func UnionView(views ...gossip.Viewer) (Viewer, error) {
// // v, _ := gossip.NewView()
// // for _, view := range views {
// // if view == nil {
// // continue
// // }
// // if err := v.Add(view.List()...); err != nil {
// // return nil, err
// // }
// // }
// // return v, nil
// // }
// func (v *View) Add(items ...gossip.Describer) error {
// var ok bool
// for _, item := range items {
// if item == nil {
// continue
// }
// // Type assertion/cast for parameter item
// var toAdd Describer
// if toAdd, ok = item.(Describer); !ok {
// toAdd = NewDescriptorFromGossipDescriber(item)
// }
// Overriding gossip.View to keep cyclon functionality when copying
// // When duplicates...
// var d gossip.Describer
// if d = v.Get(toAdd.ID()); d != nil {
// // Type assertion/cast for internal item
// var existing Describer
// if existing, ok = d.(Describer); !ok {
// panic(fmt.Sprintf(
// "Value %v of type %T should be of type cyclon.Describer",
// existing, existing))
// }
// // ...keep younger
// if existing.Younger(toAdd) {
// continue
// }
// }
// v.Add(toAdd)
// }
// return nil
// }
// // Overriding gossip.View to keep cyclon functionality when copying
// func (v *View) Copy() gossip.Viewer {
// v2, _ := NewView(v.List()...)
// return v2
// }
// Must be overridden to use cyclon.View.Add in cyclon.View.Merge
// // Must be overridden to use cyclon.View.Add in cyclon.View.Merge
// func (v *View) Merge(views ...gossip.Viewer) error {
// for _, view := range views {
// if err := v.Add(view.List()...); err != nil {
......@@ -136,16 +142,18 @@ func (v *View) Add(items ...gossip.Describer) error {
// }
// return nil
// }
func (v *View) String() string {
ret := fmt.Sprintf("View(len:%v){", v.Len())
for _, item := range v.View {
if _, ok := item.(*Descriptor); !ok {
panic(fmt.Sprintf(
"cyclon.View contains an item that is not a *cyclon.Descriptor: %v of type %T",
item, item))
}
ret += fmt.Sprintf("\n\t%s,", item.(*Descriptor))
}
ret += "\n}"
return ret
}
// func (v *View) String() string {
// ret := fmt.Sprintf("View(len:%v){", v.Len())
// for _, item := range v.List() {
// if d, ok := item.(Describer); !ok {
// panic(fmt.Sprintf(
// "cyclon.View contains an item that is not a *cyclon.Descriptor: %v of type %T",
// item, item))
// } else {
// ret += fmt.Sprintf("\n\t%s,", d)
// }
// }
// ret += "\n}"
// return ret
// }
......@@ -17,24 +17,24 @@ func RandomID() (b string) {
return
}
// Descriptor implements the Describer interface
type Descriptor struct {
MyID string
MyIP string
}
// // Descriptor implements the Describer interface
// type Descriptor struct {
// MyID string
// MyIP string
// }
func NewDescriptor(IP string) *Descriptor {
return &Descriptor{
MyID: RandomID(),
MyIP: IP,
}
}
func (d *Descriptor) Copy() Describer { return &Descriptor{d.MyID, d.MyIP} }
func (d *Descriptor) Equals(d1 Describer) bool { return d1 != nil && d.MyID == d1.ID() }
func (d *Descriptor) ID() string { return d.MyID }
func (d *Descriptor) IP() string { return d.MyIP }
func (d *Descriptor) SetID(ID string) { d.MyID = ID }
func (d *Descriptor) String() string {
return fmt.Sprintf("gossip.Descriptor(%p){ID: %s, IP: %s}",
d, d.MyID, d.MyIP)
}
// func NewDescriptor(IP string) *Descriptor {
// return &Descriptor{
// MyID: RandomID(),
// MyIP: IP,
// }
// }
// func (d *Descriptor) Copy() Describer { return &Descriptor{d.MyID, d.MyIP} }
// func (d *Descriptor) Equals(d1 Describer) bool { return d1 != nil && d.MyID == d1.ID() }
// func (d *Descriptor) ID() string { return d.MyID }
// func (d *Descriptor) IP() string { return d.MyIP }
// func (d *Descriptor) SetID(ID string) { d.MyID = ID }
// func (d *Descriptor) String() string {
// return fmt.Sprintf("gossip.Descriptor(%p){ID: %s, IP: %s}",
// d, d.MyID, d.MyIP)
// }
......@@ -4,12 +4,12 @@ import (
"testing"
)
func TestDescriptorCopy(t *testing.T) {
d := NewDescriptor("lalala")
d2 := d.Copy()
// func TestDescriptorCopy(t *testing.T) {
// d := NewDescriptor("lalala")
// d2 := d.Copy()
if d == d2 {
t.Errorf("TestDescriptorCopy failed: original and copy have same address:\nd: %s\nd2: %s\n",
d, d2)
}
}
// if d == d2 {
// t.Errorf("TestDescriptorCopy failed: original and copy have same address:\nd: %s\nd2: %s\n",
// d, d2)
// }
// }
......@@ -34,6 +34,7 @@ type Viewer interface {
Diff(Viewer)
Empty() bool
Equals(v2 Viewer) bool
Get(string) Describer
GetSubset(int) Viewer
Has(item Describer) bool
IDs() string
......
......@@ -8,146 +8,153 @@ const (
ID_SEPARATOR = "|"
)
// View implements Viewer to store any Describer interface
type View map[string]Describer
// // View implements Viewer to store any Describer interface
// type View map[string]Describer
func NewView(items ...Describer) (Viewer, error) {
var v View = make(map[string]Describer)
if err := v.Add(items...); err != nil {
return nil, err
}
return &v, nil
}
func UnionView(views ...Viewer) (Viewer, error) {
v, _ := NewView()
for _, view := range views {
if view == nil {
continue
}
if err := v.Add(view.List()...); err != nil {
return nil, err
}
}
return v, nil
}
func (v *View) Add(items ...Describer) error {
for _, item := range items {
if item == nil {
continue
}
// Replace potential duplicates
(*v)[item.ID()] = item.Copy()
}
return nil
}
func (v *View) Copy() Viewer {
var v2 View = make(map[string]Describer)
for key, item := range *v {
v2[key] = item.Copy()
}
return &v2
}
func (v *View) Diff(v2 Viewer) {
if v2 == nil {
return
}
for key2 := range v2.Map() {
delete(*v, key2)
}
}
func (v *View) Empty() bool {
return len(*v) == 0
}
func (v *View) Equals(v2 Viewer) bool {
if v2 == nil || len(*v) != v2.Len() {
return false
}
for _, item := range *v {
if item2, ok := v2.Map()[item.ID()]; ok {
if !item.Equals(item2) {
return false
}
} else {
return false
}
}
return true
}
func (v *View) GetSubset(length int) Viewer {
if v.Len() < length {
return v.Copy()
}
v2, _ := NewView(v.List()[:length]...)
return v2
}
func (v *View) Has(item Describer) bool {
_, ok := (*v)[item.ID()]
return ok
}
func (v *View) IDs() string {
ret := ""
i := 0
for key := range *v {
ret += key
if i < len(*v)-1 {
ret += ID_SEPARATOR
}
i++
}
return ret
}
func (v *View) Len() int {
return len(*v)
}
func (v *View) List() []Describer {
list := make([]Describer, v.Len())
i := 0
for _, item := range *v {
list[i] = item.Copy()
i++
}
return list
}
func (v *View) Map() map[string]Describer {
newMap := make(map[string]Describer)
for id, item := range *v {
newMap[id] = item.Copy()
}
return newMap
}
// func NewView(items ...Describer) (Viewer, error) {
// var v View = make(map[string]Describer)
// if err := v.Add(items...); err != nil {
// return nil, err
// }
// return &v, nil
// }
// func (v *View) Merge(views ...Viewer) error {
// func UnionView(views ...Viewer) (Viewer, error) {
// v, _ := NewView()
// for _, view := range views {
// if view == nil {
// continue
// }
// if err := v.Add(view.List()...); err != nil {
// return err
// return nil, err
// }
// }
// return v, nil
// }
// func (v *View) Add(items ...Describer) error {
// for _, item := range items {
// if item == nil {
// continue
// }
// // Replace potential duplicates
// (*v)[item.ID()] = item.Copy()
// }
// return nil
// }
func (v *View) Remove(items ...Describer) {
for _, item := range items {
if item != nil {
delete(*v, item.ID())
}
// func (v *View) Copy() Viewer {
// var v2 View = make(map[string]Describer)
// for key, item := range *v {
// v2[key] = item.Copy()
// }
// return &v2
// }
// func (v *View) Diff(v2 Viewer) {
// if v2 == nil {
// return
// }
// for key2 := range v2.Map() {
// delete(*v, key2)
// }
// }
// func (v *View) Empty() bool {
// return len(*v) == 0
// }
}
}
func (v *View) String() string {
ret := fmt.Sprintf("View(len:%v){", len(*v))
for _, item := range *v {
ret += fmt.Sprintf("\n\t%s,", item)
}
ret += "}"
return ret
}
// func (v *View) Equals(v2 Viewer) bool {
// if v2 == nil || len(*v) != v2.Len() {
// return false
// }
// for _, item := range *v {
// if item2, ok := v2.Map()[item.ID()]; ok {
// if !item.Equals(item2) {
// return false
// }
// } else {
// return false
// }
// }
// return true
// }
// func (v *View) Get(key string) Describer {
// if d, ok := (*v)[key]; !ok {
// return nil
// } else {
// return d.Copy()
// }
// }
// func (v *View) GetSubset(length int) Viewer {
// if v.Len() < length {
// return v.Copy()
// }
// v2, _ := NewView(v.List()[:length]...)
// return v2
// }
// func (v *View) Has(item Describer) bool {
// _, ok := (*v)[item.ID()]
// return ok
// }
// func (v *View) IDs() string {
// ret := ""
// i := 0
// for key := range *v {
// ret += key
// if i < len(*v)-1 {
// ret += ID_SEPARATOR
// }
// i++
// }
// return ret
// }
// func (v *View) Len() int {
// return len(*v)
// }
// func (v *View) List() []Describer {
// list := make([]Describer, v.Len())
// i := 0
// for _, item := range *v {
// list[i] = item.Copy()
// i++
// }
// return list
// }
// func (v *View) Map() map[string]Describer {
// newMap := make(map[string]Describer)
// for id, item := range *v {
// newMap[id] = item.Copy()
// }
// return newMap
// }