aboutsummaryrefslogtreecommitdiffstats
path: root/chilbert/Operations.hpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2018-08-19 18:22:26 +0200
committerDavid Robillard <d@drobilla.net>2018-09-29 14:50:07 +0200
commitac65326242af579d6e1a7bd71730f1c78c8bde9b (patch)
treeae5225c4b9856b3e5d454378d00867d9b0c53d26 /chilbert/Operations.hpp
parent7567f77828ff9661f85eabe3b4cfb1876b307d42 (diff)
downloadchilbert-ac65326242af579d6e1a7bd71730f1c78c8bde9b.tar.gz
chilbert-ac65326242af579d6e1a7bd71730f1c78c8bde9b.tar.bz2
chilbert-ac65326242af579d6e1a7bd71730f1c78c8bde9b.zip
Reorganize headers to make a clear public/private distinction
Diffstat (limited to 'chilbert/Operations.hpp')
-rw-r--r--chilbert/Operations.hpp166
1 files changed, 0 insertions, 166 deletions
diff --git a/chilbert/Operations.hpp b/chilbert/Operations.hpp
deleted file mode 100644
index 24474cc..0000000
--- a/chilbert/Operations.hpp
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- Copyright (C) 2018 David Robillard <d@drobilla.net>
- Copyright (C) 2006-2007 Chris Hamilton <chamilton@cs.dal.ca>
-
- This program is free software: you can redistribute it and/or modify it under
- the terms of the GNU General Public License as published by the Free Software
- Foundation, either version 2 of the License, or (at your option) any later
- version.
-
- This program is distributed in the hope that it will be useful, but WITHOUT
- ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
- FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
- details.
-
- You should have received a copy of the GNU General Public License along with
- this program. If not, see <https://www.gnu.org/licenses/>.
-*/
-
-#ifndef CHILBERT_OPERATIONS_HPP
-#define CHILBERT_OPERATIONS_HPP
-
-#include "chilbert/Operators.hpp"
-#include "chilbert/Traits.hpp"
-
-#include <cassert>
-#include <climits>
-#include <cstddef>
-#include <cstdint>
-#include <type_traits>
-
-namespace chilbert {
-
-/// Reset all bits in `field`
-template <typename T>
-std::enable_if_t<std::is_integral<T>::value>
-reset_bits(T& field)
-{
- field = static_cast<T>(0);
-}
-
-/// Reset all bits in `field`
-template <typename T>
-std::enable_if_t<is_bitvec_v<T>>
-reset_bits(T& field)
-{
- field.reset();
-}
-
-/// Return the `index`th bit in `field`
-template <typename T>
-std::enable_if_t<std::is_integral<T>::value, bool>
-test_bit(const T& field, const size_t index)
-{
- assert(size_t(index) < sizeof(field) * CHAR_BIT);
- return field & (T{1} << index);
-}
-
-/// Return the `index`th bit in `field`
-template <typename T>
-std::enable_if_t<is_bitvec_v<T>, bool>
-test_bit(const T& field, const size_t index)
-{
- return field.test(index);
-}
-
-/// Set the `index`th bit in `field`
-template <typename T>
-std::enable_if_t<std::is_integral<T>::value>
-set_bit(T& field, const size_t index)
-{
- assert(size_t(index) < sizeof(field) * CHAR_BIT);
- field |= (T{1} << index);
- assert(test_bit(field, index));
-}
-
-/// Set the `index`th bit in `field` to `value`
-template <typename T>
-std::enable_if_t<std::is_integral<T>::value>
-set_bit(T& field, const size_t index, const bool value)
-{
- assert(size_t(index) < sizeof(field) * CHAR_BIT);
- field ^= (-T{value} ^ field) & (T{1U} << index);
- assert(test_bit(field, index) == value);
-}
-
-/// Set the `index`th bit in `field`
-template <typename T>
-std::enable_if_t<is_bitvec_v<T>>
-set_bit(T& field, const size_t index)
-{
- field.set(index);
-}
-
-/// Set the `index`th bit in `field` to `value`
-template <typename T>
-std::enable_if_t<is_bitvec_v<T>>
-set_bit(T& field, const size_t index, const bool value)
-{
- field.set(index, value);
-}
-
-/// Return 1 + the index of the least significant 1-bit of `field`, or zero
-template <typename T>
-int pop_count(const T& field);
-
-template <>
-int
-pop_count<unsigned long>(const unsigned long& field)
-{
- return __builtin_popcountl(field);
-}
-
-template <>
-int
-pop_count<unsigned long long>(const unsigned long long& field)
-{
- return __builtin_popcountll(field);
-}
-
-/// Return 1 + the index of the least significant 1-bit of `field`, or zero
-template <typename T>
-int find_first(const T field);
-
-template <>
-int
-find_first<unsigned long>(const unsigned long field)
-{
- return __builtin_ffsl(static_cast<long>(field));
-}
-
-template <>
-int
-find_first<unsigned long long>(const unsigned long long field)
-{
- return __builtin_ffsll(static_cast<long long>(field));
-}
-
-/// Calculates the Gray Code of `value` in place
-template <typename T>
-std::enable_if_t<is_bitvec_v<T>> gray_code(T& value);
-
-/// Implementation of grayCode for any integral type
-template <typename T>
-std::enable_if_t<std::is_integral<T>::value>
-gray_code(T& value)
-{
- value ^= (value >> 1);
-}
-
-/// Calculates the inverse Gray Code of `value` in place
-template <typename T>
-std::enable_if_t<is_bitvec_v<T>> gray_code_inv(T& value);
-
-/// Implementation of gray_code_inv for any integral type
-template <typename T>
-std::enable_if_t<std::is_integral<T>::value>
-gray_code_inv(T& value)
-{
- for (T shift = 1; shift < sizeof(T) * CHAR_BIT; shift <<= 1) {
- value ^= (value >> shift);
- }
-}
-
-} // namespace chilbert
-
-#endif