victory 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 00bcbcbc7b4fc5a87806420fd5be8e30e7719ce1212b6b674e08d9ace7e72fdd
4
- data.tar.gz: 31ee4514bcb2997b72aee5ea38eec75630ad0181c870ee79d3d16dab0e41d709
3
+ metadata.gz: e93ae56ddafc7ac1417ad10315adf6f567d22ee164b8edc5f248eed2c090cf27
4
+ data.tar.gz: 28f25fa29c6dd9a68e512a917c113c8e078ae4c7838bc3f21274567551e7a550
5
5
  SHA512:
6
- metadata.gz: 2c141a43232ac8012bf7add4eb505c19f6e4dd378b7fb808319646cf1e45d6156bf2f3b47529cf73aa7cbdb8eb464264783b015b95a1f01c33efe1e3bd09c352
7
- data.tar.gz: 29c366ee9083993a489f6263a630ac16e8e3dd4d0c653bebce97ce996adfeda2faed40deacbd7b495f89387a791bf8a8881ff73afc2c5762815e5270e52f88be
6
+ metadata.gz: 84ae4f944daad2fc7a053425a9c73cb230d41f7ff5846692fff6869e47e7d7461a6459041de6934ed5284aa2b324b9f5d4db1481ace28dfa5994903dc7a21124
7
+ data.tar.gz: 0e6b5adec80cc7268b6b35a72cba740d977e2fa2dd90b33d159cdfad394ab2ed8645438e6b3668f1aa2310ae7907516c14896026358b6314b74be4c01a175dc1
data/Rakefile CHANGED
@@ -11,12 +11,10 @@ require "rake/extensiontask"
11
11
 
12
12
  task :build => :compile
13
13
 
14
- Rake::ExtensionTask.new('algorithms/string') { |ext| ext.name = "CString" }
15
- Rake::ExtensionTask.new('containers/deque') { |ext| ext.name = "CDeque" }
16
- Rake::ExtensionTask.new('containers/bst') { |ext| ext.name = "CBst" }
17
- Rake::ExtensionTask.new('containers/rbtree_map') { |ext| ext.name = "CRBTreeMap" }
18
- Rake::ExtensionTask.new('containers/splaytree_map') { |ext| ext.name = "CSplayTreeMap" }
19
- Rake::ExtensionTask.new('containers/xor_list') { |ext| ext.name = 'XORList' }
14
+ require_relative 'extensions'
15
+ extensions.each do |extension|
16
+ Rake::ExtensionTask.new(extension.path) { |ext| ext.name = extension.name }
17
+ end
20
18
 
21
19
  require 'rspec/core/rake_task'
22
20
 
data/USAGE.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  In this markdown you will see the usage of all the datastructures and algorithms available through the standard library and this gem.
4
4
 
5
+ For them to work you firstly need to require the library with `require 'victory'`.
6
+
5
7
  # Data Structures
6
8
 
7
9
  * [Ranges and Loops](#ranges)
@@ -15,6 +17,7 @@ In this markdown you will see the usage of all the datastructures and algorithms
15
17
  * [Tuple](#tuple)
16
18
  * [Graph](#graph)
17
19
  * [IOHelpers](#io-helpers)
20
+ * [Concurrent Structures](#concurrent)
18
21
 
19
22
  <a name="ranges" />
20
23
 
@@ -205,6 +208,156 @@ t[2]
205
208
  # => 2
206
209
  ```
207
210
 
211
+ <a name="bitset" />
212
+
213
+ ## Bitset
214
+
215
+ From [Bitset](https://github.com/ericboesch/bitset):
216
+
217
+ You create a bitset like this:
218
+
219
+ >> Bitset.new(8)
220
+ => 00000000
221
+
222
+ Here we created an 8-bit bitset. All bits are initialized to 0.
223
+
224
+ We can also create a bitset based on a string of ones and zeros.
225
+
226
+ >> Bitset.from_s('00010001')
227
+ => 00010001
228
+
229
+ or from an array. Falsey values (false and nil) are converted to
230
+ zeroes; all other values, including 0 and "", are converted to ones.
231
+
232
+ >> Bitset.new [false, nil, 3, 0]
233
+ => 0011
234
+
235
+ To input an array of ones and zeroes:
236
+
237
+ >> Bitset.new([0,1,1,0].map(&:positive?))
238
+ => 0110
239
+
240
+ Obviously you can also set and clear bits...
241
+
242
+ >> bitset = Bitset.new(8)
243
+ => 00000000
244
+
245
+ >> bitset[3] = true
246
+ => 00010000
247
+
248
+ >> bitset[3] = false
249
+ => 00000000
250
+
251
+ >> bitset.set(1, 3, 5, 7)
252
+ => 01010101
253
+
254
+ >> bitset.clear(1, 5)
255
+ => 00010001
256
+
257
+ Arrays of Integers can also be passed to #clear and #set (c/o brendon9x).
258
+
259
+ The point of a bitset is to be, effectively, an array of single bits. It should
260
+ support basic set and bitwise operations. So, let's look at a few of those.
261
+
262
+ >> a = Bitset.from_s('00001111')
263
+ => 00001111
264
+
265
+ >> b = Bitset.from_s('01010101')
266
+ => 01010101
267
+
268
+ >> a & b
269
+ => 00000101
270
+
271
+ >> a | b
272
+ => 01011111
273
+
274
+ >> b - a
275
+ => 01010000
276
+
277
+ >> a ^ b
278
+ => 01011010
279
+
280
+ >> ~a
281
+ => 11110000
282
+
283
+ >> a.hamming(b)
284
+ => 4
285
+
286
+ >> a.cardinality
287
+ => 4
288
+
289
+ >> a.reverse
290
+ => 11110000
291
+
292
+ # Tell whether all of the given bit numbers are set
293
+ >> a.set? 6
294
+ => true
295
+
296
+ # Return a new Bitset composed of bits #1, #3, #5, #4, and #1
297
+ # again. Unlike Array#values_at, this function currently only
298
+ # accepts an array of Fixnums as its argument.
299
+ >> a.values_at [1,3,5,4,1]
300
+ => 00110
301
+
302
+ # Tell whether all of the given bit numbers are clear
303
+ >> a.clear? 1,3,5
304
+ => false
305
+
306
+ # Tell whether all bits are clear
307
+ >> a.empty?
308
+ => false
309
+
310
+ # Pass all bits to the block
311
+ >> b.each { |v| puts v }
312
+ => false
313
+ true
314
+ false
315
+ ...
316
+
317
+ # Pass the positions of all set bits to the block
318
+ >> b.each_set { |bit| puts bit }
319
+ => 1
320
+ 3
321
+ 5
322
+ 7
323
+
324
+ # Return an array of the positions of all set bits
325
+ >> b.each_set # AKA b.to_a
326
+ => [1, 3, 5, 7]
327
+
328
+ # b.each_set(index) == b.each_set[index], but faster.
329
+ >> b.each_set(-3) # Negative index wraps around.
330
+ => 3
331
+
332
+ # b.each_set(index, len) == b.each_set[index, len], but faster.
333
+ >> b.each_set(2,2) # Block is also allowed
334
+ => [5,7]
335
+
336
+
337
+ # The following methods modify a Bitset in place very quickly:
338
+ >> a.intersect!(b) # like a &= b
339
+ >> a.union!(b) # like a |= b
340
+ >> a.difference!(b) # like a -= b
341
+ >> a.xor!(b) # like a ^= b
342
+ >> a.reset! # Zeroes all bits
343
+
344
+ # Above, "like" does not mean "identical to." a |= b creates a new
345
+ # Bitset object. a.union!(b) changes an existing object which
346
+ # affects all variables that point to the same object.
347
+
348
+ # Attempting to apply bitwise binary operators or their in-place
349
+ # equivalents between bitsets of different sizes will raise an
350
+ # ArgumentError.
351
+
352
+ >> b.to_binary_array
353
+ => [0, 1, 0, 1, 0, 1, 0, 1]
354
+
355
+ # b.dup and b.clone are also available.
356
+
357
+ # Marshal.dump and Marshal.load are also supported. If you want to
358
+ # save a few bytes and don't need Marshal.load to work, you can
359
+ # use #pack and Bitset.unpack instead.
360
+
208
361
  <a name="graph" />
209
362
 
210
363
  ## Graph
@@ -285,6 +438,114 @@ Writer.string(a, line_sep: "\n", col_sep: ' ', mapper: ->(x) {"0,#{x}"})
285
438
  Writer.file("b", a, line_sep: "\n", col_sep: ' ', mapper: ->x {"0,#{x}"})
286
439
  ```
287
440
 
441
+ <a name="concurrent" />
442
+
443
+ ## Concurrent Structures
444
+
445
+ They are included from [concurrent-ruby](https://github.com/ruby-concurrency/concurrent-ruby). To use them:
446
+ ```ruby
447
+ Containers::Concurrent::Array
448
+ include Containers
449
+ Concurrent::Array
450
+ ```
451
+ From [Concurrent Ruby Features](https://github.com/ruby-concurrency/concurrent-ruby#features--documentation):
452
+
453
+ ### General-purpose Concurrency Abstractions
454
+
455
+ * [Async](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Async.html):
456
+ A mixin module that provides simple asynchronous behavior to a class. Loosely based on Erlang's
457
+ [gen_server](http://www.erlang.org/doc/man/gen_server.html).
458
+ * [ScheduledTask](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ScheduledTask.html):
459
+ Like a Future scheduled for a specific future time.
460
+ * [TimerTask](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/TimerTask.html):
461
+ A Thread that periodically wakes up to perform work at regular intervals.
462
+ * [Promises](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Promises.html):
463
+ Unified implementation of futures and promises which combines features of previous `Future`,
464
+ `Promise`, `IVar`, `Event`, `dataflow`, `Delay`, and (partially) `TimerTask` into a single
465
+ framework. It extensively uses the new synchronization layer to make all the features
466
+ **non-blocking** and **lock-free**, with the exception of obviously blocking operations like
467
+ `#wait`, `#value`. It also offers better performance.
468
+
469
+ ### Thread-safe Value Objects, Structures, and Collections
470
+
471
+ Collection classes that were originally part of the (deprecated) `thread_safe` gem:
472
+
473
+ * [Array](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Array.html) A thread-safe
474
+ subclass of Ruby's standard [Array](http://ruby-doc.org/core-2.2.0/Array.html).
475
+ * [Hash](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Hash.html) A thread-safe
476
+ subclass of Ruby's standard [Hash](http://ruby-doc.org/core-2.2.0/Hash.html).
477
+ * [Set](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Set.html) A thread-safe
478
+ subclass of Ruby's standard [Set](http://ruby-doc.org/stdlib-2.4.0/libdoc/set/rdoc/Set.html).
479
+ * [Map](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Map.html) A hash-like object
480
+ that should have much better performance characteristics, especially under high concurrency,
481
+ than `Concurrent::Hash`.
482
+ * [Tuple](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Tuple.html) A fixed size
483
+ array with volatile (synchronized, thread safe) getters/setters.
484
+
485
+ Value objects inspired by other languages:
486
+
487
+ * [Maybe](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Maybe.html) A thread-safe,
488
+ immutable object representing an optional value, based on
489
+ [Haskell Data.Maybe](https://hackage.haskell.org/package/base-4.2.0.1/docs/Data-Maybe.html).
490
+
491
+ Structure classes derived from Ruby's [Struct](http://ruby-doc.org/core-2.2.0/Struct.html):
492
+
493
+ * [ImmutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ImmutableStruct.html)
494
+ Immutable struct where values are set at construction and cannot be changed later.
495
+ * [MutableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/MutableStruct.html)
496
+ Synchronized, mutable struct where values can be safely changed at any time.
497
+ * [SettableStruct](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/SettableStruct.html)
498
+ Synchronized, write-once struct where values can be set at most once, either at construction
499
+ or any time thereafter.
500
+
501
+ Thread-safe variables:
502
+
503
+ * [Agent](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Agent.html): A way to
504
+ manage shared, mutable, *asynchronous*, independent state. Based on Clojure's
505
+ [Agent](http://clojure.org/agents).
506
+ * [Atom](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Atom.html): A way to manage
507
+ shared, mutable, *synchronous*, independent state. Based on Clojure's
508
+ [Atom](http://clojure.org/atoms).
509
+ * [AtomicBoolean](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicBoolean.html)
510
+ A boolean value that can be updated atomically.
511
+ * [AtomicFixnum](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicFixnum.html)
512
+ A numeric value that can be updated atomically.
513
+ * [AtomicReference](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicReference.html)
514
+ An object reference that may be updated atomically.
515
+ * [Exchanger](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Exchanger.html)
516
+ A synchronization point at which threads can pair and swap elements within pairs. Based on
517
+ Java's [Exchanger](http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Exchanger.html).
518
+ * [MVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/MVar.html) A synchronized
519
+ single element container. Based on Haskell's
520
+ [MVar](https://hackage.haskell.org/package/base-4.8.1.0/docs/Control-Concurrent-MVar.html) and
521
+ Scala's [MVar](http://docs.typelevel.org/api/scalaz/nightly/index.html#scalaz.concurrent.MVar$).
522
+ * [ThreadLocalVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ThreadLocalVar.html)
523
+ A variable where the value is different for each thread.
524
+ * [TVar](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/TVar.html) A transactional
525
+ variable implementing software transactional memory (STM). Based on Clojure's
526
+ [Ref](http://clojure.org/refs).
527
+
528
+ ### Java-inspired ThreadPools and Other Executors
529
+
530
+ * See the [thread pool](http://ruby-concurrency.github.io/concurrent-ruby/master/file.thread_pools.html)
531
+ overview, which also contains a list of other Executors available.
532
+
533
+ ### Thread Synchronization Classes and Algorithms
534
+
535
+ * [CountDownLatch](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/CountDownLatch.html)
536
+ A synchronization object that allows one thread to wait on multiple other threads.
537
+ * [CyclicBarrier](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/CyclicBarrier.html)
538
+ A synchronization aid that allows a set of threads to all wait for each other to reach a common barrier point.
539
+ * [Event](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Event.html) Old school
540
+ kernel-style event.
541
+ * [ReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ReadWriteLock.html)
542
+ A lock that supports multiple readers but only one writer.
543
+ * [ReentrantReadWriteLock](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/ReentrantReadWriteLock.html)
544
+ A read/write lock with reentrant and upgrade features.
545
+ * [Semaphore](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/Semaphore.html)
546
+ A counting-based locking mechanism that uses permits.
547
+ * [AtomicMarkableReference](http://ruby-concurrency.github.io/concurrent-ruby/master/Concurrent/AtomicMarkableReference.html)
548
+
288
549
  # Other useful links
289
550
 
290
551
  * https://github.com/kumar91gopi/Algorithms-and-Data-Structures-in-Ruby/
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Tyler McMullen
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.