Skip to content

Commit

Permalink
Implement runtime support for non-exhaustive enums in Java
Browse files Browse the repository at this point in the history
  • Loading branch information
Mingun committed Aug 19, 2024
1 parent 20af3ac commit 65dc95f
Showing 1 changed file with 56 additions and 0 deletions.
56 changes: 56 additions & 0 deletions src/main/java/io/kaitai/struct/IKaitaiEnum.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/**
* Copyright 2015-2024 Kaitai Project: MIT license
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/

package io.kaitai.struct;

/**
* Interface, implemented by every enum class generated by Kaitai Struct compiler.
*
* @since 0.11
*/
public interface IKaitaiEnum {
/**
* Base class for all unknown variants of Kaitai-generated enums.
*
* If you want to determine is the variant that you have is known or not,
* you can use {@code <variant> instanceof IKaitaiEnum.Unknown}.
*
* The descendants of this class have value semantic, like enums: their
* {@code equals} method compares inner long values of the same class (so
* {@code Unknown} values of different Kaitai enums are not equal) and
* {@code hashCode} method returns {@code Long.hashCode(this.id())}.
*/
public abstract class Unknown implements IKaitaiEnum {
protected final long id;
protected Unknown(long id) { this.id = id; }

@Override
public int hashCode() { return Long.hashCode(id); }

@Override
public long id() { return id; }
}

/** Returns the underlying number which represents this enum variant. */
public long id();
}

0 comments on commit 65dc95f

Please sign in to comment.