= BinData Changelog

== Version 3.0.0 (2026-07-13)

* Ruby 2.x now has its own separate branch.
* Namespacing now uses Ruby modules, rather than prefixes.
* Added class names to dynamically generated ints and bits.
* Forward keyword arguments.  Thanks to Simon Coffey.

== Version 2.5.1 (2025-04-11)

* Added changelog link to gemspec. Thanks to Mark Young.
* Support Ruby 3.4.

== Version 2.5.0 (2024-02-16)

* Removed experimental :check_offset and :adjust_offset parameters.
* Ruby 2.5 is now required.
* Allow for nested tracing.
* Skip :until_valid is now fast for :asserted_value.
* Added Section - a way to transform the data stream.
* Added transforms for brotli, lz4, xor, zlib, zstd.
* Updated to current minitest
* Fixed typos.  Thanks to Patrick Linnane.

== Version 2.4.15 (2023-02-07)

* Added ruby 2.4.0 requirement to gemspec.  Thanks to theldoria.
* Added github CI action.  Thanks to Peter Goldstein.
* Convert file from latin1 to UTF-8.  Thanks to Cédric Boutillier.
* Move license from dual license to solely BSD-2-Clause.
* Remove unnecessary files from gem.  Requested by Orien Madgwick.
* Allow multiple calls to auto_call_delayed_io.  Thanks to dwelch-r7.

== Version 2.4.14 (2022-10-31)

* Use Comparable#clamp instead of manual calculations.
* Update tests to new minitest requirements.
* Adjust tests due to changes in ruby 3.1

== Version 2.4.13 (2022-10-16)

* Relax over-strict parameter naming requirements.  Requested by
  vinayak3qilabs.

== Version 2.4.12 (2022-10-03)

* Do not include DelayedIO objects when :onlyif is false.

== Version 2.4.11 (2022-09-27)

* Make DelayedIO work with :onlyif.  Reported by Spencer McIntyre.

== Version 2.4.10 (2021-05-18)

* Improve speed of dynamic object creation.  Reported by Charlie Ablett.

== Version 2.4.9 (2021-04-22)

* Change example from Fixnum to Integer.  Thanks to Tim Chambers.
* Now works with frozen string literals.  Requested by Jeremy Evans.

== Version 2.4.8 (2020-07-21)

* Bug fix array self assignment.  Thanks to Spencer McIntyre.
* Bug fix Stringz max_length.  Thanks to cdelafuente-r7.

== Version 2.4.7 (2020-03-31)

* Fix choice assignment inside arrays.  Reported by Spencer McIntyre.

== Version 2.4.6 (2020-02-27)

* More encoding fixes.  Thanks to Aaron Patterson.

== Version 2.4.5 (2020-02-21)

* Small typo fixes to examples.
* Fix encoding issue for ruby 2.7.  Thanks to Aaron Patterson.
* Quieter test output.

== Version 2.4.4 (2018-10-03)

* Display a hint when endian is omitted.  Requested by Tails.
* Add thread safety to Integer/BitField creation.  Requested by jbpeirce.
* Ensure windows sockets are unseekable.  Thanks to Brent Cook.

== Version 2.4.3 (2018-03-10)

* Add Uint8Arrays.  Requested by masarakki.

== Version 2.4.2 (2018-01-31)

* Allow boolean values as parameters.  Requested by Patrik Wenger.

== Version 2.4.1 (2017-08-30)

* Fix crash with String :length invoking :rel_offset.  Reported by Claudius
  Coenen.

== Version 2.4.0 (2017-04-09)

* Reworked internal sanitizing API.
* Fix bit-based integers inside buffers.  Reported by Claudius Coenen.

== Version 2.3.5 (2017-01-19)

* Enforce Integer#nbits > 0.  Reported by Keenan Tims.
* Fix auto_call_delayed_io crash.  Reported by Michael Petter.

== Version 2.3.4 (2016-10-17)

* Memoize dynamic methods for primitives.  Thanks to hiroeorz.

== Version 2.3.3 (2016-09-07)

* Fix bug #80.  Thanks to Michael Petter.
* Add Buffer#raw_num_bytes.

== Version 2.3.2 (2016-09-02)

* IO#num_bytes_remaining now works inside Buffers.
* Added ability to skip to arbitrary byte patterns.  Requested by Stefan Kolb.

== Version 2.3.1 (2016-06-17)

* Improve list of reserved words.  Thanks to Claudius Coenen.
* Fix virtual fields to be bit aligned.  Thanks to hopesea.

== Version 2.3.0 (2016-03-25)

* Add :to_abs_offset to Skip.
* Added backwards seeking via multi pass I/O.  See DelayedIO.
* Removed #offset, which was deprecated in 2.1.0.
* Removed :adjust_offset.  See NEWS.rdoc for details.

== Version 2.2.0 (2016-01-30)

* Warn if String has :value but no :read_length.  Requested by Michael
  Genereux.
* Prevent running under Ruby 2.1.0p0 due to ruby bug 44525.
* Added #to_hex convenience method.  Thanks to Gregory Romé.
* Added namespacing via search_prefix. Requested by sumofparts.

== Version 2.1.0 (2014-04-16)

* Performance improvements.
* Removed deprecated parameters.
* Code refactored to use Ruby 1.9 features.
* #eval_parameters can now call private methods.  Requested by Ole Rasmussen.
* Can now determine state of :onlyif fields.  Requested by Ole Rasmussen.
* Renamed #offset to #abs_offset for clarity.  #offset is now deprecated.
* Support :byte_align for fields in structs.  Requested by Igor Yamolov.
* Added bit fields with dynamic length.  Requested by Jacob Dam.
* Added "endian :big_and_little" option which creates :big and :little
  versions of the class.  Thanks to Jacob Lukas for the prototype.

== Version 2.0.0 (2014-02-02)

* Ruby 1.8 now has its own separate branch.
* Struct now uses symbols for field names instead of strings.
* Added signed bitfields.  Requested by redood.
* Virtual fields can now have names.
* Bug fixes.

== Version 1.8.0 (2014-01-06)

* Allow custom types to have endian, not just numerics.
* Added missing field to TCP example.  Thanks to Bertrand Paquet.
* Made tests compatible with JRuby.  Thanks to Charles Oliver Nutter.
* Support travis ci for those that use it.  Thanks to Charles Oliver Nutter.
* Added Buffer for easier handling of nested streams.
* Added Virtual field.

== Version 1.6.0 (2013-09-02)

* Added license to .gemspec
* Moved test suite from RSpec to Minitest.
* Added :assert and :asserted_value.
* :check_value has been deprecated. Use :assert instead.

== Version 1.5.1 (2013-08-16)

* Rework build system and include .gemspec.  Requested by Simon Shortman.
* Fixed bug when Choice#clear didn't clear everything.  Thanks to Simon
  Shortman for the bug report.
* Moved BinData::VERSION into its own file.  Thanks to John Van Enk.

== Version 1.5.0 (2013-05-21)

* Moved to github.
* Updated to Ruby 2.0
* Arrays now accept BinData object factories for :type (feature request by
  Matt Dainty).
* Dynamically generated BinData objects can use the :name parameter to
  register themselves.
* Remove functionality that has been deprecated for two years.

== Version 1.4.5 (2012-07-24)

* Added the :pad_front option for padding to occur at the front of a String.
  (suggested by Eduardo Mourão).

== Version 1.4.4 (2012-06-21)

* Fixed bug where user defined boolean primitive wouldn't set its
  value to false (reported by Frank Roland).
* Fixed infinite looping bug caused by nested Choices.
* Renamed String parameter :pad_char to :pad_byte.
* Updated manual.

== Version 1.4.3 (2011-10-01)

* Exceptions no longer ignored inside lambdas when reading until eof 
  in an array (thanks John Labovitz).
* Fixed interaction bug between choices and records (reported by
  Refrigerator Johnny).

== Version 1.4.2 (2011-08-06)

* \=~ now works for strings.

== Version 1.4.1 (2011-06-20)

* Added :default option for Choices.
* Added count_bytes_remaining keyword.
* Increased speed of lazy evaluation.

== Version 1.4.0 (2011-06-14)

* Record#snapshot now returns fields in order.
* Removed the need to call #register_self in subclasses.
* Wrapper is now deprecated.  Use subclassing instead.
* Updated license to mimic changes to the Ruby License.
* Refactoring to reduce memory usage.

== Version 1.3.1 (2011-01-25)

* Fixed file permissions problem.

== Version 1.3.0 (2011-01-25)

* BinData objects can now assign values when instantiating.
* Improved support for bit-based alignment.
* Updated reference manual.
* Added examples for declaring recursive structures.
* Objects deriving from BinData::Base should no longer override #initialize.
* Added BinData::Base(#new, #initialize_instance) to speed up
  instantiation of multiple objects.
* Updated specs to rspec-1.3.0
* BinData::Struct.hide now expects symbols instead of strings.

== Version 1.2.2 (2010-12-14)

* Added Base.bindata_name method.
* Removed Base#done_read to reduce memory usage and cpu usage.
* Derived classes should now use do_read et al, instead of _do_read.
* Added predefinition of record fields to improve speed.
* Made compatible with ruby 1.9.2.  Thanks to Andrew Watts.

== Version 1.2.1 (2010-07-20)

* Updated specs to be compatible with ruby 1.9.1

== Version 1.2.0 (2010-07-09)

* Deprecated Base#register. Use #register_self or #register_subclasses instead.
* Syntax improvement.  Array, Structs and Choices can now use blocks to
  specify fields.
* Reduced startup time (suggestion courtesy of Mike Ryan).

== Version 1.1.0 (2009-11-24)

* Allow anonymous fields in Records and Primitives.
* Add the ability to skip over unused data.
* Allow Records, Primitives and Wrappers to be derived from.
* Classes for integers are now defined on demand.

== Version 1.0.0 (2009-09-13)

* Is now compatible with Ruby 1.9
* Added reference manual.
* Added #rel_offset to Base.
* Removed support for deprecated functionality.

== Version 0.11.1 (2009-08-28)

* Allow wrapped types to work with struct's :onlyif parameter
* Use Array#index instead of #find_index for compatibility with Ruby 1.8.6
  (patch courtesy of Joe Rozner).

== Version 0.11.0 (2009-06-28)

* Sanitizing code was refactored for speed.
* Arbitrary sized integers and bit fields are now automatically instantiated.
* Add ability to wrap existing types and override their parameters.

== Version 0.10.0 (2009-04-17)

* Arbitrary byte sized integers are now supported (e.g. 24bit, 808bit).
* Renamed String :trim_value parameter to :trim_padding.
* BinData::Array now behaves more like Ruby's Array.
* Added debug_name
* Added ability to trace reading
* Primitives now behave as their value.  Calling #value is no longer needed.
* Renamed #to_s -> #to_binary_s to avoid confusion with Ruby's #to_s.
* Added #assign as the generic way to assign values to objects.
* Added :copy_on_change parameter to Choice.
* Implement #offset for all objects.
* Renamed Single -> BasePrimitive.
* Renamed SingleValue -> Primitive.
* Renamed MultiValue -> Record.
* The :onlyif parameter now only applies to fields inside Structs.
* LazyEvaluator can now supply arguments when invoking methods

== Version 0.9.3 (2008-12-03)

* Arrays can now :read_until => :eof
* TCPSocket and UDPSocket can now be used as input streams (patch courtesy
  of Peter Suschlik).
* Added 128 bit integers.
* Significant memory usage reduction.
* Added custom mandatory and default parameters for user defined MultiValues.

== Version 0.9.2 (2008-07-18)

* Added lazy instantiation to allow recursive definitions.
* Array elements can be appended at any position.
* Deprecated the :readwrite parameter.
* Removed feature where Struct fields names could be nil.
* Reworked sanitizing system.

== Version 0.9.1 (2008-06-15)

* Implemented bit fields.
* Added :onlyif parameter to Base for specifying optional fields.
* Fixed IO offset bug with SingleValues.

== Version 0.9.0 (2008-06-02)

* Added :adjust_offset option to automatically seek to a given offset.
* Modified #read to accept strings as well as IO streams.
* Choice now accepts sparse arrays and hashes as :choice.
* Added BinData::Rest to help with debugging.
* Major internal restructuring - memory usage is much better.
* Improved documentation.

== Version 0.8.1 (2008-01-14)

* Reduced memory consumption.
* Increased execution speed.
* Deprecated BinData::Base.parameters.
* Fixed spec syntax (thanks to David Goodlad).

== Version 0.8.0 (2007-10-14)

* Add reserved field names to Struct.
* Prevent warnings about method redefinition.
* Allow Struct to masquerade as one of its fields.
* Renamed String param :initial_length to :read_length.
* BinData::Array now behaves more like the internal Ruby array.

== Version 0.7.0 (2007-08-26)

* Arrays now support terminating conditions as well as fixed length reads.
* Updated specs to new rspec syntax (0.9).
* Added scoped resolution of variables in lambdas.
* Added ability to append elements to arrays.

== Version 0.6.0 (2007-03-28)

* Added 64 bit integers.
* Added floating point numbers.
* Added endian keyword to Struct to reduce the amount of typing needed.

== Version 0.5.1 (2007-03-21)

* Updated documentation.
* Struct now raises an error if a field name shadows an existing method.

== Version 0.5.0 (2007-03-14)

* Initial public release.
