summaryrefslogtreecommitdiff
path: root/trunk/qpid/ruby/lib/qpid/datatypes.rb
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/qpid/ruby/lib/qpid/datatypes.rb')
-rw-r--r--trunk/qpid/ruby/lib/qpid/datatypes.rb353
1 files changed, 0 insertions, 353 deletions
diff --git a/trunk/qpid/ruby/lib/qpid/datatypes.rb b/trunk/qpid/ruby/lib/qpid/datatypes.rb
deleted file mode 100644
index 418388c73a..0000000000
--- a/trunk/qpid/ruby/lib/qpid/datatypes.rb
+++ /dev/null
@@ -1,353 +0,0 @@
-#
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-#
-
-module Qpid
-
- def self.struct(type, *args)
- # FIXME: This is fragile; the last arg could be a hash,
- # without being hte keywords
- kwargs = {}
- kwargs = args.pop if args.any? && args[-1].is_a?(Hash)
-
- if args.size > type.fields.size
- raise TypeError,
- "%s() takes at most %d arguments (%d given)" %
- [type.name, type.fields.size, args.size]
- end
-
- attrs = type.fields.inject({}) do |attrs, field|
- if args.any?
- attrs[field.name] = args.shift
- if kwargs.key?(field.name)
- raise TypeError,
- "%s() got multiple values for keyword argument '%s'" %
- [type.name, field.name]
- end
- elsif kwargs.key?(field.name)
- attrs[field.name] = kwargs.delete(field.name)
- else
- attrs[field.name] = field.default
- end
- attrs
- end
-
- unless kwargs.empty?
- unexpected = kwargs.keys[0]
- raise TypeError,
- "%s() got an unexpected keyword argument '%s'" %
- [type.name, unexpected]
- end
-
- attrs[:st_type] = type
- attrs[:id] = nil
-
- name = "Qpid_" + type.name.to_s.capitalize
- unless ::Struct.const_defined?(name)
- vars = type.fields.collect { |f| f.name } << :st_type << :id
- ::Struct.new(name, *vars)
- end
- st = ::Struct.const_get(name)
-
- result = st.new
- attrs.each { |k, v| result[k] = v }
- return result
- end
-
- class Message
-
- attr_accessor :headers, :body, :id
-
- def initialize(*args)
- @body = nil
- @headers = nil
-
- @body = args.pop unless args.empty?
- @headers = args unless args.empty?
-
- @id = nil
- end
-
- def has(name)
- return ! get(name).nil?
- end
-
- def get(name)
- if @headers
- name = name.to_sym
- @headers.find { |h| h.st_type.name == name }
- end
- end
-
- def set(header)
- @headers ||= []
- if h = @headers.find { |h| h.st_type == header.st_type }
- ind = @headers.index(h)
- @headers[ind] = header
- else
- @headers << header
- end
- end
-
- def clear(name)
- if @headers
- name = name.to_sym
- @headers.delete_if { |h| h.st_type.name == name }
- end
- end
-
- # FIXME: Not sure what to do here
- # Ruby doesn't have a notion of a evaluable string representation
- # def __repr__(self):
- # args = []
- # if self.headers:
- # args.extend(map(repr, self.headers))
- # if self.body:
- # args.append(repr(self.body))
- # if self.id is not None:
- # args.append("id=%s" % self.id)
- # return "Message(%s)" % ", ".join(args)
- # end
- end
-
- class ::Object
-
- def to_serial
- Qpid::Serial.new(self)
- end
- end
-
- class Serial
-
- include Comparable
-
- attr_accessor :value
-
- def initialize(value)
- @value = value & 0xFFFFFFFF
- end
-
- def hash
- @value.hash
- end
-
- def to_serial
- self
- end
-
- def eql?(other)
- other = other.to_serial
- value.eql?(other.value)
- end
-
- def <=>(other)
- return 1 if other.nil?
-
- other = other.to_serial
-
- delta = (value - other.value) & 0xFFFFFFFF
- neg = delta & 0x80000000
- mag = delta & 0x7FFFFFFF
-
- return (neg>0) ? -mag : mag
- end
-
- def +(other)
- result = other.to_serial
- result.value += value
- return result
- end
-
- def -(other)
- result = other.to_serial
- result.value = value - result.value
- return result
- end
-
- def succ
- Serial.new(value + 1)
- end
-
- # FIXME: Not sure what to do here
- # Ruby doesn't have a notion of a evaluable string representation
- # def __repr__(self):
- # return "serial(%s)" % self.value
- # end
-
- def to_s
- value.to_s
- end
-
- end
-
- # The Python class datatypes.Range is emulated by the standard
- # Range class with a few additions
- class ::Range
-
- alias :lower :begin
- alias :upper :end
-
- def touches(r)
- # XXX: are we doing more checks than we need?
- return (r.include?(lower - 1) ||
- r.include?(upper + 1) ||
- include?(r.lower - 1) ||
- include?(r.upper + 1) ||
- r.include?(lower) ||
- r.include?(upper) ||
- include?(r.lower) ||
- include?(r.upper))
- end
-
- def span(r)
- Range.new([lower, r.lower].min, [upper, r.upper].max)
- end
-
- def intersect(r)
- l = [lower, r.lower].max
- u = [upper, r.upper].min
- return l > u ? nil : Range.new(l, u)
- end
-
- end
-
- class RangedSet
-
- include Enumerable
-
- attr_accessor :ranges
-
- def initialize(*args)
- @ranges = []
- args.each { |n| add(n) }
- end
-
- def each(&block)
- ranges.each { |r| yield(r) }
- end
-
- def include?(n)
- if (n.is_a?(Range))
- super(n)
- else
- ranges.find { |r| r.include?(n) }
- end
- end
-
- def add_range(range)
- ranges.delete_if do |r|
- if range.touches(r)
- range = range.span(r)
- true
- else
- false
- end
- end
- ranges << range
- end
-
- def add(lower, upper = nil)
- upper = lower if upper.nil?
- add_range(Range.new(lower, upper))
- end
-
- def to_s
- repr = ranges.sort { |a,b| b.lower <=> a.lower }.
- map { |r| r.to_s }.join(",")
- "<RangedSet: {#{repr}}"
- end
- end
-
- class Future
- def initialize(initial=nil, exception=Exception)
- @value = initial
- @error = nil
- @set = Util::Event.new
- @exception = exception
- end
-
- def error(error)
- @error = error
- @set.set
- end
-
- def set(value)
- @value = value
- @set.set
- end
-
- def get(timeout=nil)
- @set.wait(timeout)
- unless @error.nil?
- raise @exception.new(@error)
- end
- @value
- end
- end
-
- class UUID
- include Comparable
-
- attr_accessor :bytes
-
- def initialize(bytes)
- @bytes = bytes
- end
-
- def <=>(other)
- if other.respond_to?(:bytes)
- return bytes <=> other.bytes
- else
- raise NotImplementedError
- end
- end
-
- def to_s
- UUID::format(bytes)
- end
-
- # FIXME: Not sure what to do here
- # Ruby doesn't have a notion of a evaluable string representation
- # def __repr__(self):
- # return "UUID(%r)" % str(self)
- # end
-
- def self.random_uuid
- bytes = (1..16).collect { |i| rand(256) }
-
- # From RFC4122, the version bits are set to 0100
- bytes[7] &= 0x0F
- bytes[7] |= 0x40
-
- # From RFC4122, the top two bits of byte 8 get set to 01
- bytes[8] &= 0x3F
- bytes[8] |= 0x80
- return bytes.pack("C16")
- end
-
- def self.uuid4
- UUID.new(random_uuid)
- end
-
- def self.format(s)
- # Python format !LHHHHL
- # big-endian, ulong, ushort x 4, ulong
- "%08x-%04x-%04x-%04x-%04x%08x" % s.unpack("NnnnnN")
- end
- end
-end