October3d55/M/LowEntryExtStdLib/Source/LowEntryExtendedStandardLib.../Public/Classes/LowEntryBitDataReader.h

315 lines
11 KiB
C
Raw Normal View History

2025-03-10 09:43:27 +08:00
// Copyright Low Entry. Apache License, Version 2.0.
#pragma once
#include "CoreMinimal.h"
#include "LowEntryLong.h"
#include "LowEntryDouble.h"
#include "LowEntryBitDataReader.generated.h"
UCLASS(BlueprintType)
class LOWENTRYEXTENDEDSTANDARDLIBRARY_API ULowEntryBitDataReader : public UObject
{
GENERATED_UCLASS_BODY()
private:
const static uint8 mask[9];
public:
static ULowEntryBitDataReader* Create(const TArray<uint8>& Bytes, int32 Index = 0, int32 Length = 0x7FFFFFFF);
static ULowEntryBitDataReader* CreateClone(const TArray<uint8>& Bytes, const int32 Position, const uint8 CurrentByte, const int32 CurrentBytePosition);
int32 GetAndIncreasePosition(const int32 Increasement);
int32 MaxElementsRemaining(const int32 MinimumSizePerElement);
protected:
bool GetRawBit();
uint8 GetRawByte();
uint8 GetPartialRawByte(int32 Bits);
int32 GetUinteger();
public:
UPROPERTY()
TArray<uint8> Bytes;
UPROPERTY()
int32 Position = 0;
UPROPERTY()
uint8 CurrentByte = 0;
UPROPERTY()
int32 CurrentBytePosition = 0;
/**
* Clones the clone of this BitDataReader.
*
* Allows you to easily read and revert the position (by cloning, reading data with the clone, and then throwing the clone away).
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader (Meta)", Meta = (DisplayName = "Get Clone"))
ULowEntryBitDataReader* GetClone();
/**
* Returns the current position.
*
* Because this data writer works with bits, this blueprint will only work correctly till 268.435.455 bytes (256 MB).
*/
UFUNCTION(BlueprintPure, Category = "Low Entry|Extended Standard Library|Bit Data|Reader (Meta)", Meta = (DisplayName = "Get Position"))
int32 GetPosition();
/**
* Sets the current position.
*
* Because this data writer works with bits, this blueprint will only work correctly till 268.435.455 bytes (256 MB).
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader (Meta)", Meta = (DisplayName = "Set Position"))
void SetPosition(const int32 Position_);
/**
* Sets the current position to 0.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader (Meta)", Meta = (DisplayName = "Reset"))
void Reset();
/**
* Causes Remaining to return 0.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader (Meta)", Meta = (DisplayName = "Empty"))
void Empty();
/**
* Returns the amount of bytes left.
*/
UFUNCTION(BlueprintPure, Category = "Low Entry|Extended Standard Library|Bit Data|Reader (Meta)", Meta = (DisplayName = "Get Remaining"))
int32 Remaining();
/**
* Gets a bit.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Bit"))
bool GetBit();
/**
* Gets a byte, will only retrieve a certain amount of bits to form the byte.
*
* The bitcount can be anything between 0 and 8, values higher or lower will be clamped to 0 to 8.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Byte (Least Significant Bits Only)"))
uint8 GetByteLeastSignificantBits(const int32 BitCount);
/**
* Gets a byte, will only retrieve a certain amount of bits to form the byte.
*
* The bitcount can be anything between 0 and 8, values higher or lower will be clamped to 0 to 8.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Byte (Most Significant Bits Only)"))
uint8 GetByteMostSignificantBits(const int32 BitCount);
/**
* Gets an integer, will only retrieve a certain amount of bits to form the integer.
*
* The bitcount can be anything between 0 and 32, values higher or lower will be clamped to 0 to 32.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Integer (Least Significant Bits Only)"))
int32 GetIntegerLeastSignificantBits(const int32 BitCount);
/**
* Gets an integer, will only retrieve a certain amount of bits to form the integer.
*
* The bitcount can be anything between 0 and 32, values higher or lower will be clamped to 0 to 32.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Integer (Most Significant Bits Only)"))
int32 GetIntegerMostSignificantBits(int32 BitCount);
/**
* Gets a byte.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Byte"))
uint8 GetByte();
/**
* Gets an integer.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Integer"))
int32 GetInteger();
/**
* Gets a positive integer.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Positive Integer 1"))
int32 GetPositiveInteger1();
/**
* Gets a positive integer.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Positive Integer 2"))
int32 GetPositiveInteger2();
/**
* Gets a positive integer.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Positive Integer 3"))
int32 GetPositiveInteger3();
/**
* Gets a long (int64).
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Long", Keywords = "int64 integer64"))
int64 GetLong();
/**
* Gets a long (bytes).
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Long (bytes)"))
ULowEntryLong* GetLongBytes();
/**
* Gets a float.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Float"))
float GetFloat();
/**
* Gets a double.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Double"))
double GetDouble();
/**
* Gets a double (bytes).
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Double (bytes)"))
ULowEntryDouble* GetDoubleBytes();
/**
* Gets a boolean, this does the same as getting a bit.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Boolean"))
bool GetBoolean();
/**
* Gets a String (UTF-8).
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get String (Utf 8)"))
FString GetStringUtf8();
/**
* Gets a bit array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Bit Array"))
TArray<bool> GetBitArray();
/**
* Gets a byte array, will only retrieve a certain amount of bits to form every byte.
*
* The bitcount can be anything between 0 and 8, values higher or lower will be clamped to 0 to 8.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Byte Array (Least Significant Bits Only)"))
TArray<uint8> GetByteArrayLeastSignificantBits(const int32 BitCount);
/**
* Gets a byte array, will only retrieve a certain amount of bits to form every byte.
*
* The bitcount can be anything between 0 and 8, values higher or lower will be clamped to 0 to 8.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Byte Array (Most Significant Bits Only)"))
TArray<uint8> GetByteArrayMostSignificantBits(const int32 BitCount);
/**
* Gets an integer array, will only retrieve a certain amount of bits to form every integer.
*
* The bitcount can be anything between 0 and 32, values higher or lower will be clamped to 0 to 32.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Integer Array (Least Significant Bits Only)"))
TArray<int32> GetIntegerArrayLeastSignificantBits(const int32 BitCount);
/**
* Gets an integer array, will only retrieve a certain amount of bits to form every integer.
*
* The bitcount can be anything between 0 and 32, values higher or lower will be clamped to 0 to 32.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Integer Array (Most Significant Bits Only)"))
TArray<int32> GetIntegerArrayMostSignificantBits(const int32 BitCount);
/**
* Gets a byte array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Byte Array"))
TArray<uint8> GetByteArray();
/**
* Gets an integer array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Integer Array"))
TArray<int32> GetIntegerArray();
/**
* Gets a positive integer array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Positive Integer 1 Array"))
TArray<int32> GetPositiveInteger1Array();
/**
* Gets a positive integer array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Positive Integer 2 Array"))
TArray<int32> GetPositiveInteger2Array();
/**
* Gets a positive integer array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Positive Integer 3 Array"))
TArray<int32> GetPositiveInteger3Array();
/**
* Gets a long (int64) array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Long Array", Keywords = "int64 integer64"))
TArray<int64> GetLongArray();
/**
* Gets a long (bytes) array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Long (bytes) Array"))
TArray<ULowEntryLong*> GetLongBytesArray();
/**
* Gets a float array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Float Array"))
TArray<float> GetFloatArray();
/**
* Gets a double array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Double Array"))
TArray<double> GetDoubleArray();
/**
* Gets a double (byte) array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Double (bytes) Array"))
TArray<ULowEntryDouble*> GetDoubleBytesArray();
/**
* Gets a boolean array, this does the same as getting a bit array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get Boolean Array"))
TArray<bool> GetBooleanArray();
/**
* Gets a String (UTF-8) array.
*/
UFUNCTION(BlueprintCallable, Category = "Low Entry|Extended Standard Library|Bit Data|Reader", Meta = (DisplayName = "Get String (Utf 8) Array"))
TArray<FString> GetStringUtf8Array();
int32 SafeMultiply(const int32 A, const int32 B);
};