dbms_buffers 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +7 -1
- data/Gemfile.lock +2 -2
- data/dbms_buffers.gemspec +1 -1
- data/lib/dbms_buffers.rb +1 -0
- data/lib/dbms_buffers/gclock.rb +89 -0
- data/lib/dbms_buffers/version.rb +1 -1
- metadata +5 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ecd30b9102d2ae5019e77d92f2eb4f140c0dadb6dae4fa171d18152f944058e3
|
4
|
+
data.tar.gz: 13859d3f3c085f2f6977cb342a23154f0f253583bd0541efd4366cd0318da084
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fe9527c8764c2840f12a80db1ef358eeb0474f4125e025a1b530ce25588ebb9b70c497be48343d018db960ed80d6b0c085f94a916e8adb8553c2edf7e9602f50
|
7
|
+
data.tar.gz: d5bf0be491d9c3c390afa103de0bc43980d46ee75a98bda3d29465542c237426d53b8061715ab032c01cbf80391d8d82bce3d9b8bd21d732782312d67bc5410c
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -27,7 +27,7 @@ GEM
|
|
27
27
|
ast (~> 2.4.0)
|
28
28
|
psych (3.1.0)
|
29
29
|
rainbow (3.0.0)
|
30
|
-
rake (
|
30
|
+
rake (13.0.3)
|
31
31
|
reek (5.5.0)
|
32
32
|
codeclimate-engine-rb (~> 0.4.0)
|
33
33
|
kwalify (~> 0.7.0)
|
@@ -69,7 +69,7 @@ PLATFORMS
|
|
69
69
|
DEPENDENCIES
|
70
70
|
bundler (~> 2.0)
|
71
71
|
dbms_buffers!
|
72
|
-
rake (~>
|
72
|
+
rake (~> 13.0)
|
73
73
|
reek (~> 5.5.0)
|
74
74
|
rspec (~> 3.0)
|
75
75
|
rubocop (~> 0.78)
|
data/dbms_buffers.gemspec
CHANGED
@@ -27,7 +27,7 @@ Gem::Specification.new do |spec|
|
|
27
27
|
spec.require_paths = ['lib']
|
28
28
|
|
29
29
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
30
|
-
spec.add_development_dependency 'rake', '~>
|
30
|
+
spec.add_development_dependency 'rake', '~> 13.0'
|
31
31
|
spec.add_development_dependency 'reek', '~> 5.5.0'
|
32
32
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
33
33
|
spec.add_development_dependency 'rubocop', '~> 0.78'
|
data/lib/dbms_buffers.rb
CHANGED
@@ -0,0 +1,89 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DbmsBuffers
|
4
|
+
GClockBufferEntry = Struct.new(:value, :clock_value)
|
5
|
+
|
6
|
+
# The generalized clock buffer arranges entries in a logical clock and a single hand.
|
7
|
+
# When the buffer is full and a not-yet-inserted entry needs space,
|
8
|
+
# the hand goes clockwise until it finds an entry with clock_value = 0.
|
9
|
+
# The found entry is evicted, removed from the buffer, and the new values
|
10
|
+
# is inserted with clock_value 1.
|
11
|
+
# All entries the hand passes where clock_value = 1, this value is decremented,
|
12
|
+
# but they are not replaced yet (they have a second chance).
|
13
|
+
# When an element is accessed, its value is incremented by 1.
|
14
|
+
class GClockBuffer
|
15
|
+
attr_reader :pointer, :size
|
16
|
+
|
17
|
+
def initialize(size)
|
18
|
+
@size = size
|
19
|
+
@buffer = []
|
20
|
+
@pointer = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def access(value)
|
24
|
+
try_touch(value) || try_insert_new(value) || try_replace(value)
|
25
|
+
end
|
26
|
+
|
27
|
+
def clock_value_of(value)
|
28
|
+
@buffer[index(value)].clock_value
|
29
|
+
end
|
30
|
+
|
31
|
+
def entries
|
32
|
+
@buffer.clone
|
33
|
+
end
|
34
|
+
|
35
|
+
def contains?(value)
|
36
|
+
@buffer.any? { |entry| value == entry.value }
|
37
|
+
end
|
38
|
+
|
39
|
+
def used
|
40
|
+
@buffer.size
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
# If value is contained in the buffer, it's value is set to 1
|
46
|
+
# and true is returned, otherwise false
|
47
|
+
def try_touch(value)
|
48
|
+
result = contains? value
|
49
|
+
touch(value) if result
|
50
|
+
result
|
51
|
+
end
|
52
|
+
|
53
|
+
# If buffer slots are free, inserts value and returns true.
|
54
|
+
def try_insert_new(value)
|
55
|
+
return false if used == @size
|
56
|
+
|
57
|
+
entry = GClockBufferEntry.new(value, 1)
|
58
|
+
@buffer[@pointer] = entry
|
59
|
+
advance_pointer
|
60
|
+
|
61
|
+
true
|
62
|
+
end
|
63
|
+
|
64
|
+
def try_replace(value)
|
65
|
+
entry = @buffer[@pointer]
|
66
|
+
if entry.clock_value.zero?
|
67
|
+
entry.value = value
|
68
|
+
entry.clock_value = 1
|
69
|
+
return true
|
70
|
+
end
|
71
|
+
|
72
|
+
entry.clock_value -= 1
|
73
|
+
advance_pointer
|
74
|
+
try_replace value
|
75
|
+
end
|
76
|
+
|
77
|
+
def advance_pointer
|
78
|
+
@pointer = (@pointer + 1) % @size
|
79
|
+
end
|
80
|
+
|
81
|
+
def index(value)
|
82
|
+
@buffer.index { |entry| entry.value == value }
|
83
|
+
end
|
84
|
+
|
85
|
+
def touch(value)
|
86
|
+
@buffer.find { |entry| entry.value == value }.clock_value += 1
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
data/lib/dbms_buffers/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dbms_buffers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manuel Dossinger
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -30,14 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '13.0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
40
|
+
version: '13.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: reek
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,6 +104,7 @@ files:
|
|
104
104
|
- dbms_buffers.gemspec
|
105
105
|
- lib/dbms_buffers.rb
|
106
106
|
- lib/dbms_buffers/clock.rb
|
107
|
+
- lib/dbms_buffers/gclock.rb
|
107
108
|
- lib/dbms_buffers/generators.rb
|
108
109
|
- lib/dbms_buffers/lru.rb
|
109
110
|
- lib/dbms_buffers/version.rb
|