cavis/libnd4j/include/helpers/BitwiseUtils.h

130 lines
3.2 KiB
C++

/*******************************************************************************
* Copyright (c) 2015-2018 Skymind, Inc.
*
* This program and the accompanying materials are made available under the
* terms of the Apache License, Version 2.0 which is available at
* https://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.
*
* SPDX-License-Identifier: Apache-2.0
******************************************************************************/
//
// Created by raver119 on 10.11.2017.
//
#ifndef LIBND4J_BITWISEUTILS_H
#define LIBND4J_BITWISEUTILS_H
#include <vector>
#include <array/ByteOrder.h>
#include <op_boilerplate.h>
#include <pointercast.h>
#include <climits>
namespace nd4j {
class ND4J_EXPORT BitwiseUtils {
public:
/**
* This method returns first non-zero bit index
* @param holder
* @return
*/
static int valueBit(int holder);
/**
* This method returns vector representation of bits.
*
* PLEASE NOTE: Result is ALWAYS left-to-right
*/
static std::vector<int> valueBits(int holder);
/**
* This method returns TRUE if it's called on Big-Endian system, and false otherwise
*/
static bool isBE();
/**
* This method returns enum
* @return
*/
static nd4j::ByteOrder asByteOrder();
/**
* This method swaps bytes: LE vs BE
* @tparam T
* @param v
* @return
*/
template <typename T>
static FORCEINLINE T swap_bytes(T v) {
static_assert (CHAR_BIT == 8, "CHAR_BIT != 8");
union S {
T v;
unsigned char u8[sizeof(T)];
S(T val) {
v = val;
}
};
S source(v);
S dest(v);
for (size_t k = 0; k < sizeof(T); k++)
dest.u8[k] = source.u8[sizeof(T) - k - 1];
return dest.v;
}
/**
* This method flips bits in given value
*
* @tparam T
* @param v
* @return
*/
static int FORCEINLINE flip_bits(int v) {
return ~v;
}
static int8_t FORCEINLINE flip_bits(int8_t v) {
return ~v;
}
static int16_t FORCEINLINE flip_bits(int16_t v) {
return ~v;
}
static uint8_t FORCEINLINE flip_bits(uint8_t v) {
return ~v;
}
static uint16_t FORCEINLINE flip_bits(uint16_t v) {
return ~v;
}
static uint32_t FORCEINLINE flip_bits(uint32_t v) {
return ~v;
}
static uint64_t FORCEINLINE flip_bits(uint64_t v) {
return ~v;
}
static Nd4jLong FORCEINLINE flip_bits(Nd4jLong v) {
return ~v;
}
};
}
#endif //LIBND4J_BITWISEUTILS_H