Skip to content

Commit 1e49c35

Browse files
committed
Fixed panic on resize. Added NewClassWIndex funciton
1 parent 553ca68 commit 1e49c35

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

class.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,20 @@ func NewClass(mjr Major, mnr Minor, index Index) (Class, error) {
8585
return newClass(mjr, mnr, index)
8686
}
8787

88+
// NewClassWIndex creates new index and class for provided 'mjr' Major and 'mnr' Minor.
89+
// Returns error if any of the input values are not valid.
90+
func NewClassWIndex(mjr Major, mnr Minor) (Class, error) {
91+
return newClassWIndex(mjr, mnr)
92+
}
93+
94+
func newClassWIndex(mjr Major, mnr Minor) (Class, error) {
95+
index, err := container.newIndex(mjr, mnr)
96+
if err != nil {
97+
return 0, err
98+
}
99+
return newClass(mjr, mnr, index)
100+
}
101+
88102
// MustNewClass gets new class from the provided 'minor' and 'index'.
89103
// Panics if any of the arguments is not valid or out of bands.
90104
func MustNewClass(mjr Major, mnr Minor, index Index) Class {
@@ -95,6 +109,17 @@ func MustNewClass(mjr Major, mnr Minor, index Index) Class {
95109
return c
96110
}
97111

112+
// MustNewClassWIndex creates new 'mjr' Major, 'mnr' Minor 'index' and then
113+
// a new Class for provided triplet.
114+
// Panics on error.
115+
func MustNewClassWIndex(mjr Major, mnr Minor) Class {
116+
c, err := newClassWIndex(mjr, mnr)
117+
if err != nil {
118+
panic(err)
119+
}
120+
return c
121+
}
122+
98123
// NewMinorClass gets the class from provided 'minor'.
99124
// The function gets minor's major and gets the major/minor class.
100125
func NewMinorClass(mjr Major, mnr Minor) (Class, error) {

class_test.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ func TestClass(t *testing.T) {
9191
}
9292

9393
assert.NotEqual(t, initLen, len(container.indexes[mjr]))
94+
9495
})
9596

9697
t.Run("Index", func(t *testing.T) {
@@ -152,6 +153,22 @@ func TestClass(t *testing.T) {
152153
assert.Panics(t, func() { MustNewClass(mjr, invMnr, inx2) })
153154
assert.Panics(t, func() { MustNewClass(invMjr, mnr, inx2) })
154155
assert.Panics(t, func() { MustNewClass(mjr, mnr, invIndex) })
156+
157+
c, err := NewClassWIndex(mjr, mnr)
158+
require.NoError(t, err)
159+
160+
var c2 Class
161+
162+
assert.NotPanics(t, func() { c2 = MustNewClassWIndex(mjr, mnr) })
163+
assert.NotEqual(t, c, c2)
164+
165+
_, err = NewClassWIndex(invMjr, mnr)
166+
assert.Error(t, err)
167+
168+
_, err = NewClassWIndex(mjr, invMnr)
169+
assert.Error(t, err)
170+
171+
assert.Panics(t, func() { MustNewClassWIndex(invMjr, mnr) })
155172
})
156173
}
157174

container.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ func (c *classContainer) newMajor() Major {
2727
}
2828

2929
func (c *classContainer) newMinor(mjr Major) (Minor, error) {
30+
c.Lock()
31+
defer c.Unlock()
32+
3033
if !mjr.Valid() {
3134
return 0, New(ClInvalidMajor, "provided invalid Major")
3235
}
@@ -39,6 +42,9 @@ func (c *classContainer) newMinor(mjr Major) (Minor, error) {
3942
}
4043

4144
func (c *classContainer) newIndex(mjr Major, mnr Minor) (Index, error) {
45+
c.Lock()
46+
defer c.Unlock()
47+
4248
if !mjr.Valid() {
4349
return 0, New(ClInvalidMajor, "provided invalid Major")
4450
}
@@ -64,9 +70,10 @@ func (c *classContainer) resizeMinors(mjr Major) {
6470
size = 4
6571
}
6672

67-
for size < int(mjr) {
73+
for size <= int(mjr) {
6874
size *= 2
6975
}
76+
7077
temp := make([]Minor, size)
7178
copy(temp, c.minors)
7279
c.minors = temp
@@ -82,7 +89,7 @@ func (c *classContainer) resizeIndexesMajor(mjr Major) {
8289
size = 4
8390
}
8491

85-
for size < int(mjr) {
92+
for size <= int(mjr) {
8693
size *= 2
8794
}
8895
temp := make([][]Index, size)
@@ -100,7 +107,7 @@ func (c *classContainer) resizeIndexesMinors(mjr Major, mnr Minor) {
100107
size = 4
101108
}
102109

103-
for size < int(mnr) {
110+
for size <= int(mnr) {
104111
size *= 2
105112
}
106113
temp := make([]Index, size)

0 commit comments

Comments
 (0)