diff --git a/spot/misc/Makefile.am b/spot/misc/Makefile.am
index 7f2aa835f..e509dbe87 100644
--- a/spot/misc/Makefile.am
+++ b/spot/misc/Makefile.am
@@ -1,6 +1,6 @@
## -*- coding: utf-8 -*-
-## Copyright (C) 2011-2014, 2016-2018, 2020 Laboratoire de Recherche
-## et Développement de l'Epita (LRDE).
+## Copyright (C) 2011-2014, 2016-2018, 2020-2021 Laboratoire de
+## Recherche et Développement de l'Epita (LRDE).
## Copyright (C) 2003, 2004, 2005, 2006 Laboratoire d'Informatique de
## Paris 6 (LIP6), département Systèmes Répartis Coopératifs (SRC),
## Université Pierre et Marie Curie.
@@ -63,7 +63,6 @@ libmisc_la_SOURCES = \
bareword.cc \
bitset.cc \
bitvect.cc \
- clz.cc \
escape.cc \
formater.cc \
intvcomp.cc \
diff --git a/spot/misc/clz.cc b/spot/misc/clz.cc
deleted file mode 100644
index 6b2173501..000000000
--- a/spot/misc/clz.cc
+++ /dev/null
@@ -1,115 +0,0 @@
-// -*- coding: utf-8 -*-
-// Copyright (C) 2018 Laboratoire de Recherche et Développement
-// de l'Epita (LRDE).
-//
-// This file is part of Spot, a model checking library.
-//
-// Spot 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 3 of the License, or
-// (at your option) any later version.
-//
-// Spot 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 .
-
-#include "config.h"
-#include
-
-namespace spot
-{
- // use gcc and clang built-in functions
- // both compilers use the same function names, and define __GNUC__
-#if __GNUC__
- template
- struct _clz;
-
- template<>
- struct _clz
- {
- unsigned
- operator()(unsigned n) const noexcept
- {
- return __builtin_clz(n);
- }
- };
-
- template<>
- struct _clz
- {
- unsigned long
- operator()(unsigned long n) const noexcept
- {
- return __builtin_clzl(n);
- }
- };
-
- template<>
- struct _clz
- {
- unsigned long long
- operator()(unsigned long long n) const noexcept
- {
- return __builtin_clzll(n);
- }
- };
-
- size_t
- clz(unsigned n)
- {
- return _clz()(n);
- }
-
- size_t
- clz(unsigned long n)
- {
- return _clz()(n);
- }
-
- size_t
- clz(unsigned long long n)
- {
- return _clz()(n);
- }
-#else
- size_t
- clz(unsigned n)
- {
- size_t res = CHAR_BIT*sizeof(size_t);
- while (n)
- {
- --res;
- n >>= 1;
- }
- return res;
- }
-
- size_t
- clz(unsigned long n)
- {
- size_t res = CHAR_BIT*sizeof(unsigned long);
- while (n)
- {
- --res;
- n >>= 1;
- }
- return res;
- }
-
- size_t
- clz(unsigned long long n)
- {
- size_t res = CHAR_BIT*sizeof(unsigned long long);
- while (n)
- {
- --res;
- n >>= 1;
- }
- return res;
- }
-#endif
-}
diff --git a/spot/misc/clz.hh b/spot/misc/clz.hh
index 5b3d674c7..648b6615c 100644
--- a/spot/misc/clz.hh
+++ b/spot/misc/clz.hh
@@ -1,5 +1,5 @@
// -*- coding: utf-8 -*-
-// Copyright (C) 2018 Laboratoire de Recherche et Développement
+// Copyright (C) 2018, 2021 Laboratoire de Recherche et Développement
// de l'Epita (LRDE).
//
// This file is part of Spot, a model checking library.
@@ -25,9 +25,36 @@
namespace spot
{
- SPOT_API size_t clz(unsigned n);
+ template::value>>
+ inline constexpr unsigned clz(Type n) noexcept
+ {
+ unsigned res = CHAR_BIT * sizeof(Type);
+ while (n)
+ {
+ --res;
+ n >>= 1;
+ }
+ return res;
+ }
- SPOT_API size_t clz(unsigned long n);
+#if __GNUC__
+ template<>
+ inline constexpr unsigned clz(unsigned n) noexcept
+ {
+ return __builtin_clz(n);
+ }
- SPOT_API size_t clz(unsigned long long n);
+ template<>
+ inline constexpr unsigned clz(unsigned long n) noexcept
+ {
+ return __builtin_clzl(n);
+ }
+
+ template<>
+ inline constexpr unsigned clz(unsigned long long n) noexcept
+ {
+ return __builtin_clzll(n);
+ }
+#endif
}