@@ -21,10 +21,10 @@ | |||||
#ifndef __utl_com_1wire_h__ | #ifndef __utl_com_1wire_h__ | ||||
#define __utl_com_1wire_h__ | #define __utl_com_1wire_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/com/_1wire_id.h> | #include <utl/com/_1wire_id.h> | ||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -681,27 +681,27 @@ namespace _1wire_i_det { | |||||
//! Primary template to catch any non 1-wire interface types | //! Primary template to catch any non 1-wire interface types | ||||
template <typename _Tp, typename =void> | template <typename _Tp, typename =void> | ||||
struct is_1wire_ : false_ {}; | |||||
struct is_1wire_ : meta::false_ {}; | |||||
//! template to catch a proper 1-wire interface type | //! template to catch a proper 1-wire interface type | ||||
template <typename _Tp> | template <typename _Tp> | ||||
struct is_1wire_ <_Tp, | struct is_1wire_ <_Tp, | ||||
void_t < | |||||
meta::void_t < | |||||
// typename _Tp::Speed, | // typename _Tp::Speed, | ||||
// typename _Tp::Command, | // typename _Tp::Command, | ||||
use_if_same_t <try_reset_t <_Tp>, bool>, | |||||
use_if_same_t <try_rx1_t <_Tp>, byte_t>, | |||||
//use_if_same_t <try_rx2_t <_Tp>, size_t>, | |||||
use_if_same_t <try_tx1_t <_Tp>, byte_t>, | |||||
//use_if_same_t <try_tx2_t <_Tp>, size_t>, | |||||
use_if_same_t <try_match_t<_Tp>, void>, | |||||
use_if_same_t <try_match_n_ovdr_t<_Tp>, void>, | |||||
use_if_same_t <try_skip_t<_Tp>, void>, | |||||
use_if_same_t <try_skip_n_ovdr_t<_Tp>, void>, | |||||
use_if_same_t <try_first_t <_Tp>, _1wire_id_t>, | |||||
use_if_same_t <try_next_t <_Tp>, _1wire_id_t> | |||||
meta::use_if_same_t <try_reset_t <_Tp>, bool>, | |||||
meta::use_if_same_t <try_rx1_t <_Tp>, byte_t>, | |||||
//meta::use_if_same_t <try_rx2_t <_Tp>, size_t>, | |||||
meta::use_if_same_t <try_tx1_t <_Tp>, byte_t>, | |||||
//meta::use_if_same_t <try_tx2_t <_Tp>, size_t>, | |||||
meta::use_if_same_t <try_match_t<_Tp>, void>, | |||||
meta::use_if_same_t <try_match_n_ovdr_t<_Tp>, void>, | |||||
meta::use_if_same_t <try_skip_t<_Tp>, void>, | |||||
meta::use_if_same_t <try_skip_n_ovdr_t<_Tp>, void>, | |||||
meta::use_if_same_t <try_first_t <_Tp>, _1wire_id_t>, | |||||
meta::use_if_same_t <try_next_t <_Tp>, _1wire_id_t> | |||||
> //!^ SFINAE may apply | > //!^ SFINAE may apply | ||||
> : true_ {}; | |||||
> : meta::true_ {}; | |||||
} // namespace _1wire_i_det | } // namespace _1wire_i_det | ||||
/*! | /*! | ||||
@@ -21,7 +21,7 @@ | |||||
#ifndef __utl_com_1wire_id_h__ | #ifndef __utl_com_1wire_id_h__ | ||||
#define __utl_com_1wire_id_h__ | #define __utl_com_1wire_id_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/container/id.h> | #include <utl/container/id.h> | ||||
namespace utl { | namespace utl { | ||||
@@ -29,8 +29,8 @@ | |||||
#ifndef __utl_com_1wire_uart_h__ | #ifndef __utl_com_1wire_uart_h__ | ||||
#define __utl_com_1wire_uart_h__ | #define __utl_com_1wire_uart_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/com/_1wire.h> | #include <utl/com/_1wire.h> | ||||
namespace utl { | namespace utl { | ||||
@@ -21,9 +21,9 @@ | |||||
#ifndef _utl_com_i2c_h__ | #ifndef _utl_com_i2c_h__ | ||||
#define _utl_com_i2c_h__ | #define _utl_com_i2c_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -254,21 +254,21 @@ namespace utl { | |||||
//! Primary template to catch any non I2C interface types | //! Primary template to catch any non I2C interface types | ||||
template <typename _Tp, typename =void> | template <typename _Tp, typename =void> | ||||
struct is_i2c_ : false_ { }; | |||||
struct is_i2c_ : meta::false_ { }; | |||||
//! template to catch a proper I2C interface type | //! template to catch a proper I2C interface type | ||||
template <typename _Tp> | template <typename _Tp> | ||||
struct is_i2c_ <_Tp, | struct is_i2c_ <_Tp, | ||||
void_t < | |||||
meta::void_t < | |||||
typename _Tp::Sequence, | typename _Tp::Sequence, | ||||
use_if_same_t <uint32_t,try_cclk_t <_Tp>>, | |||||
use_if_same_t <void, try_clk_t <_Tp>>, | |||||
use_if_same_t <void, try_start_t <_Tp>>, | |||||
use_if_same_t <void, try_stop_t <_Tp>>, | |||||
use_if_same_t <byte_t, try_rx_data_t <_Tp>>, | |||||
use_if_same_t <bool, try_tx_data_t <_Tp>> | |||||
meta::use_if_same_t <uint32_t,try_cclk_t <_Tp>>, | |||||
meta::use_if_same_t <void, try_clk_t <_Tp>>, | |||||
meta::use_if_same_t <void, try_start_t <_Tp>>, | |||||
meta::use_if_same_t <void, try_stop_t <_Tp>>, | |||||
meta::use_if_same_t <byte_t, try_rx_data_t <_Tp>>, | |||||
meta::use_if_same_t <bool, try_tx_data_t <_Tp>> | |||||
> | > | ||||
> : true_ { }; | |||||
> : meta::true_ { }; | |||||
} | } | ||||
/*! | /*! | ||||
* Value meta-programming function alias for I2C interface checking | * Value meta-programming function alias for I2C interface checking | ||||
@@ -22,8 +22,8 @@ | |||||
#ifndef __utl_com_i2c_bb_h__ | #ifndef __utl_com_i2c_bb_h__ | ||||
#define __utl_com_i2c_bb_h__ | #define __utl_com_i2c_bb_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/com/i2c.h> | #include <utl/com/i2c.h> | ||||
@@ -21,9 +21,9 @@ | |||||
#ifndef _utl_com_spi_h__ | #ifndef _utl_com_spi_h__ | ||||
#define _utl_com_spi_h__ | #define _utl_com_spi_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -302,19 +302,19 @@ namespace utl { | |||||
//! Primary template to catch any non SPI interface types | //! Primary template to catch any non SPI interface types | ||||
template <typename _Tp, typename =void> | template <typename _Tp, typename =void> | ||||
struct is_spi_ : false_ {}; | |||||
struct is_spi_ : meta::false_ {}; | |||||
//! template to catch a proper SPI interface type | //! template to catch a proper SPI interface type | ||||
template <typename _Tp> | template <typename _Tp> | ||||
struct is_spi_ < | struct is_spi_ < | ||||
_Tp, | _Tp, | ||||
void_t < | |||||
use_if_same_t <try_cclock_t<_Tp>, uint32_t>, | |||||
use_if_same_t <try_clock_t<_Tp>, void>, | |||||
use_if_same_t <try_tx_t<_Tp>, byte_t>, | |||||
use_if_same_t <try_rx_t<_Tp>, byte_t> | |||||
meta::void_t < | |||||
meta::use_if_same_t <try_cclock_t<_Tp>, uint32_t>, | |||||
meta::use_if_same_t <try_clock_t<_Tp>, void>, | |||||
meta::use_if_same_t <try_tx_t<_Tp>, byte_t>, | |||||
meta::use_if_same_t <try_rx_t<_Tp>, byte_t> | |||||
> | > | ||||
> : true_ {}; | |||||
> : meta::true_ {}; | |||||
} | } | ||||
/*! | /*! | ||||
* Value meta-programming function for SPI interface checking | * Value meta-programming function for SPI interface checking | ||||
@@ -22,10 +22,10 @@ | |||||
#ifndef __utl_com_spi_bb_h__ | #ifndef __utl_com_spi_bb_h__ | ||||
#define __utl_com_spi_bb_h__ | #define __utl_com_spi_bb_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/com/spi.h> | #include <utl/com/spi.h> | ||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -75,9 +75,9 @@ namespace utl { | |||||
//! \name SPI implementation specific functions | //! \name SPI implementation specific functions | ||||
//!@{ | //!@{ | ||||
template <spi::bitOrder B =BitOrder> constexpr | template <spi::bitOrder B =BitOrder> constexpr | ||||
use_if_t <(B == spi::bitOrder::LSB_First), void> shift (byte_t& b) { b <<=1; } | |||||
meta::use_if_t <(B == spi::bitOrder::LSB_First), void> shift (byte_t& b) { b <<=1; } | |||||
template <spi::bitOrder B =BitOrder> constexpr | template <spi::bitOrder B =BitOrder> constexpr | ||||
use_if_t <(B == spi::bitOrder::MSB_First), void> shift (byte_t& b) { b >>=1; } | |||||
meta::use_if_t <(B == spi::bitOrder::MSB_First), void> shift (byte_t& b) { b >>=1; } | |||||
template <spi::cpol C =CPOL> static constexpr bool clkHigh () { | template <spi::cpol C =CPOL> static constexpr bool clkHigh () { | ||||
return !static_cast<bool>(C); | return !static_cast<bool>(C); | ||||
} | } | ||||
@@ -113,9 +113,9 @@ namespace utl { | |||||
byte_t _tx_data (byte_t out) { return _tx_data_impl (out); } | byte_t _tx_data (byte_t out) { return _tx_data_impl (out); } | ||||
template <spi::cpha C =CPHA> | template <spi::cpha C =CPHA> | ||||
use_if_t <(C == spi::cpha::LOW), byte_t> _tx_data_impl (byte_t out); | |||||
meta::use_if_t <(C == spi::cpha::LOW), byte_t> _tx_data_impl (byte_t out); | |||||
template <spi::cpha C =CPHA> | template <spi::cpha C =CPHA> | ||||
use_if_t <(C == spi::cpha::HIGH), byte_t> _tx_data_impl (byte_t out); | |||||
meta::use_if_t <(C == spi::cpha::HIGH), byte_t> _tx_data_impl (byte_t out); | |||||
//!@} | //!@} | ||||
//! Data members | //! Data members | ||||
@@ -134,7 +134,7 @@ namespace utl { | |||||
*/ | */ | ||||
template <typename impl_t, spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | template <typename impl_t, spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | ||||
template <spi::cpha C> | template <spi::cpha C> | ||||
use_if_t <(C == spi::cpha::LOW), byte_t> | |||||
meta::use_if_t <(C == spi::cpha::LOW), byte_t> | |||||
spi_bb_i<impl_t, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | spi_bb_i<impl_t, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | ||||
byte_t in {}; | byte_t in {}; | ||||
SCLK (clkL_); | SCLK (clkL_); | ||||
@@ -158,7 +158,7 @@ namespace utl { | |||||
*/ | */ | ||||
template <typename impl_t, spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | template <typename impl_t, spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | ||||
template <spi::cpha C> | template <spi::cpha C> | ||||
use_if_t <(C == spi::cpha::HIGH), byte_t> | |||||
meta::use_if_t <(C == spi::cpha::HIGH), byte_t> | |||||
spi_bb_i<impl_t, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | spi_bb_i<impl_t, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | ||||
byte_t in {}; | byte_t in {}; | ||||
SCLK (clkL_); | SCLK (clkL_); | ||||
@@ -207,9 +207,9 @@ namespace utl { | |||||
//! \name SPI implementation specific functions | //! \name SPI implementation specific functions | ||||
//!@{ | //!@{ | ||||
template <spi::bitOrder B =BitOrder> constexpr | template <spi::bitOrder B =BitOrder> constexpr | ||||
use_if_t <(B == spi::bitOrder::LSB_First), void> shift (byte_t& b) { b <<=1; } | |||||
meta::use_if_t <(B == spi::bitOrder::LSB_First), void> shift (byte_t& b) { b <<=1; } | |||||
template <spi::bitOrder B =BitOrder> constexpr | template <spi::bitOrder B =BitOrder> constexpr | ||||
use_if_t <(B == spi::bitOrder::MSB_First), void> shift (byte_t& b) { b >>=1; } | |||||
meta::use_if_t <(B == spi::bitOrder::MSB_First), void> shift (byte_t& b) { b >>=1; } | |||||
template <spi::cpol C =CPOL> static constexpr bool clkHigh () { | template <spi::cpol C =CPOL> static constexpr bool clkHigh () { | ||||
return !static_cast<bool>(C); | return !static_cast<bool>(C); | ||||
} | } | ||||
@@ -241,9 +241,9 @@ namespace utl { | |||||
byte_t _tx_data (byte_t out) final { return _tx_data_impl (out); } | byte_t _tx_data (byte_t out) final { return _tx_data_impl (out); } | ||||
template <spi::cpha C =CPHA> | template <spi::cpha C =CPHA> | ||||
use_if_t <(C == spi::cpha::LOW), byte_t> _tx_data_impl (byte_t out); | |||||
meta::use_if_t <(C == spi::cpha::LOW), byte_t> _tx_data_impl (byte_t out); | |||||
template <spi::cpha C =CPHA> | template <spi::cpha C =CPHA> | ||||
use_if_t <(C == spi::cpha::HIGH), byte_t> _tx_data_impl (byte_t out); | |||||
meta::use_if_t <(C == spi::cpha::HIGH), byte_t> _tx_data_impl (byte_t out); | |||||
//!@} | //!@} | ||||
//! Data members | //! Data members | ||||
@@ -262,7 +262,7 @@ namespace utl { | |||||
*/ | */ | ||||
template <spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | template <spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | ||||
template <spi::cpha C> | template <spi::cpha C> | ||||
use_if_t <(C == spi::cpha::LOW), byte_t> | |||||
meta::use_if_t <(C == spi::cpha::LOW), byte_t> | |||||
spi_bb_i<virtual_tag, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | spi_bb_i<virtual_tag, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | ||||
byte_t in {}; | byte_t in {}; | ||||
SCLK (clkL_); | SCLK (clkL_); | ||||
@@ -286,7 +286,7 @@ namespace utl { | |||||
*/ | */ | ||||
template <spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | template <spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder> | ||||
template <spi::cpha C> | template <spi::cpha C> | ||||
use_if_t <(C == spi::cpha::HIGH), byte_t> | |||||
meta::use_if_t <(C == spi::cpha::HIGH), byte_t> | |||||
spi_bb_i<virtual_tag, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | spi_bb_i<virtual_tag, CPOL, CPHA, BitOrder>::_tx_data_impl (byte_t out) { | ||||
byte_t in {}; | byte_t in {}; | ||||
SCLK (clkL_); | SCLK (clkL_); | ||||
@@ -21,7 +21,7 @@ | |||||
#ifndef __utl_container_array_h__ | #ifndef __utl_container_array_h__ | ||||
#define __utl_container_array_h__ | #define __utl_container_array_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/core/impl.h> | |||||
#include <algorithm> | #include <algorithm> | ||||
namespace utl { | namespace utl { | ||||
@@ -22,7 +22,7 @@ | |||||
#ifndef __utl_container_id_h__ | #ifndef __utl_container_id_h__ | ||||
#define __utl_container_id_h__ | #define __utl_container_id_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/container/array.h> | #include <utl/container/array.h> | ||||
#include <algorithm> | #include <algorithm> | ||||
@@ -21,7 +21,7 @@ | |||||
#ifndef __utl_impl_crtp_h__ | #ifndef __utl_impl_crtp_h__ | ||||
#define __utl_impl_crtp_h__ | #define __utl_impl_crtp_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/core/impl.h> | |||||
/*! | /*! | ||||
* \defgroup crtp CRTP idiom support header | * \defgroup crtp CRTP idiom support header | ||||
@@ -1,6 +1,6 @@ | |||||
/*! | /*! | ||||
* \file /utl/impl/impl.h | |||||
* \brief Implementation detail main header | |||||
* \file /utl/core/impl.h | |||||
* \brief Implementation detail main forward header | |||||
* | * | ||||
* Copyright (C) 2018 Christos Choutouridis | * Copyright (C) 2018 Christos Choutouridis | ||||
* | * | ||||
@@ -18,17 +18,13 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#ifndef __utl_impl_impl_h__ | |||||
#define __utl_impl_impl_h__ | |||||
#ifndef __utl_core_impl_h__ | |||||
#define __utl_core_impl_h__ | |||||
// Include implementation details once | |||||
#include <utl/impl/version.h> | |||||
#include <utl/impl/concepts.h> | |||||
#include <utl/impl/types.h> | |||||
// FWD include implementation details once | |||||
#include <utl/core/version.h> | |||||
#include <utl/core/types.h> | |||||
// STL dependency | |||||
#include <type_traits> | |||||
#endif /* __utl_impl_impl_h__ */ | |||||
#endif /* __utl_core_impl_h__ */ |
@@ -1,5 +1,5 @@ | |||||
/*! | /*! | ||||
* \file /utl/impl/types.h | |||||
* \file /utl/core/types.h | |||||
* \brief Basic type alias support | * \brief Basic type alias support | ||||
* | * | ||||
* Copyright (C) 2018 Christos Choutouridis | * Copyright (C) 2018 Christos Choutouridis | ||||
@@ -18,15 +18,25 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#ifndef __utl_impl_types_h__ | |||||
#define __utl_impl_types_h__ | |||||
#ifndef __utl_core_types_h__ | |||||
#define __utl_core_types_h__ | |||||
#include <stdint.h> | |||||
#include <cstddef> | |||||
#include <cstdint> | |||||
namespace utl { | |||||
//! @{ \name byte and word types | |||||
using byte_t = uint8_t; //!< 8 bits wide | |||||
using word_t = uint16_t; //!< 16 bits wide | |||||
using dword_t = uint32_t; //!< 32 bits wide | |||||
//! @} | |||||
typedef uint8_t byte_t; /*!< 8 bits wide */ | |||||
typedef uint16_t word_t; /*!< 16 bits wide */ | |||||
typedef uint32_t dword_t; /*!< 32 bits wide */ | |||||
//! @{ \name size and index | |||||
using size_t = std::size_t; | |||||
using index_t = size_t; //!< index_t and size_t mend to be interchangeable | |||||
using ptrdiff_t= std::ptrdiff_t; | |||||
//! @} | |||||
} | |||||
#endif /* __utl_impl_types_h__ */ | |||||
#endif /* __utl_core_types_h__ */ |
@@ -1,6 +1,6 @@ | |||||
/*! | /*! | ||||
* \file /utl/impl/version.h | |||||
* \brief version and cpp version check | |||||
* \file /utl/core/version.h | |||||
* \brief version and cpp version checks | |||||
* | * | ||||
* Copyright (C) 2018 Christos Choutouridis | * Copyright (C) 2018 Christos Choutouridis | ||||
* | * | ||||
@@ -18,23 +18,88 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#ifndef __utl_impl_version_h__ | |||||
#define __utl_impl_version_h__ | |||||
#ifndef __utl_core_version_h__ | |||||
#define __utl_core_version_h__ | |||||
//!\defgroup version version | //!\defgroup version version | ||||
//! Definitions of the utl version | //! Definitions of the utl version | ||||
//!\ingroup impl | |||||
//!@{ | |||||
#define UTL_VERSION "0.0.0" | |||||
//! utl version | |||||
#define UTL_VERSION "0.0.1" | |||||
#define UTL_VERSION_MAJOR 0 | #define UTL_VERSION_MAJOR 0 | ||||
#define UTL_VERSION_MINOR 0 | #define UTL_VERSION_MINOR 0 | ||||
#define UTL_VERSION_PATCH 0 | |||||
#define UTL_VERSION_PATCH 1 | |||||
#define UTL_VERSION_VALUE ( (UTL_VERSION_MAJOR * 10000) \ | #define UTL_VERSION_VALUE ( (UTL_VERSION_MAJOR * 10000) \ | ||||
+ (UTL_VERSION_MINOR * 100) \ | + (UTL_VERSION_MINOR * 100) \ | ||||
+ UTL_VERSION_PATCH) | + UTL_VERSION_PATCH) | ||||
#if __cplusplus < 201103L | |||||
//! C++ versions | |||||
#define CXX_VER __cplusplus | |||||
#define CXX_VER_STD_11 201103L | |||||
#define CXX_VER_STD_14 201402L | |||||
#define CXX_VER_STD_17 201703L | |||||
//#include <type_traits> | |||||
//! Check for variable templates | |||||
#ifndef CXX_VARIABLE_TEMPLATES | |||||
#ifdef __cpp_variable_templates | |||||
#define CXX_VARIABLE_TEMPLATES __cpp_variable_templates | |||||
#else | |||||
#define CXX_VARIABLE_TEMPLATES (CXX_VER >= CXX_VER_STD_14) | |||||
#endif | |||||
#endif | |||||
//! Check integer sequence | |||||
#ifndef CXX_INTEGER_SEQUENCE | |||||
#ifdef __cpp_lib_integer_sequence | |||||
#define CXX_INTEGER_SEQUENCE __cpp_lib_integer_sequence | |||||
#else | |||||
#define CXX_INTEGER_SEQUENCE (CXX_VER >= CXX_VER_STD_14) | |||||
#endif | |||||
#endif | |||||
//! Check concepts | |||||
#ifndef CXX_CONCEPTS | |||||
#ifdef __cpp_concepts | |||||
#define CXX_CONCEPTS __cpp_concepts | |||||
#else | |||||
#define CXX_CONCEPTS 0 | |||||
#endif | |||||
#endif | |||||
//! Check for inline variables | |||||
#ifndef CXX_INLINE_VARIABLES | |||||
#ifdef __cpp_inline_variables | |||||
#define CXX_INLINE_VARIABLES __cpp_inline_variables | |||||
#else | |||||
#define CXX_INLINE_VARIABLES (CXX_VER >= CXX_VER_STD_17) | |||||
#endif | |||||
#endif | |||||
#ifndef CXX_FOLD_EXPRESSIONS | |||||
#ifdef __cpp_fold_expressions | |||||
#define CXX_FOLD_EXPRESSIONS __cpp_fold_expressions | |||||
#else | |||||
#define CXX_FOLD_EXPRESSIONS (CXX_VER >= CXX_VER_STD_17) | |||||
#endif | |||||
#endif | |||||
/* | |||||
* Workaround inspection | |||||
*/ | |||||
#if defined(__GNUC__) && (__GNUC__ < 5) | |||||
// https://wg21.link/cwg1558 | |||||
#define UTL_WORKAROUND_CWG_1558 | |||||
#endif | |||||
//! Base library requirement | |||||
#if __cplusplus < CXX_VER_STD_11 | |||||
#error "uTL requires C++11" | #error "uTL requires C++11" | ||||
#endif | #endif | ||||
#endif /* __utl_impl_version_h__ */ | |||||
//!@} | |||||
#endif /* #ifndef __utl_core_version_h__ */ |
@@ -278,23 +278,23 @@ namespace utl { | |||||
//! Primary template to catch any non SPI interface types | //! Primary template to catch any non SPI interface types | ||||
template <typename _Tp, typename =void> | template <typename _Tp, typename =void> | ||||
struct is_outdev_it_ : false_ {}; | |||||
struct is_outdev_it_ : meta::false_ {}; | |||||
//! template to catch a proper SPI interface type | //! template to catch a proper SPI interface type | ||||
template <typename _Tp> | template <typename _Tp> | ||||
struct is_outdev_it_ < | struct is_outdev_it_ < | ||||
_Tp, | _Tp, | ||||
void_t < | |||||
typename T::value_type, | |||||
typename T::difference_type, | |||||
typename T::pointer, | |||||
typename T::reference, | |||||
use_if_same_t < | |||||
typename T::iterator_category, | |||||
meta::void_t < | |||||
typename _Tp::value_type, | |||||
typename _Tp::difference_type, | |||||
typename _Tp::pointer, | |||||
typename _Tp::reference, | |||||
meta::use_if_same_t < | |||||
typename _Tp::iterator_category, | |||||
std::output_iterator_tag | std::output_iterator_tag | ||||
> | > | ||||
> | > | ||||
> : true_ {}; | |||||
> : meta::true_ {}; | |||||
} | } | ||||
/*! | /*! | ||||
* Value meta-programming function for SPI interface checking | * Value meta-programming function for SPI interface checking | ||||
@@ -525,23 +525,23 @@ namespace utl { | |||||
//! Primary template to catch any non SPI interface types | //! Primary template to catch any non SPI interface types | ||||
template <typename _Tp, typename =void> | template <typename _Tp, typename =void> | ||||
struct is_indev_it_ : false_ {}; | |||||
struct is_indev_it_ : meta::false_ {}; | |||||
//! template to catch a proper SPI interface type | //! template to catch a proper SPI interface type | ||||
template <typename _Tp> | template <typename _Tp> | ||||
struct is_indev_it_ < | struct is_indev_it_ < | ||||
_Tp, | _Tp, | ||||
void_t < | |||||
typename T::value_type, | |||||
typename T::difference_type, | |||||
typename T::pointer, | |||||
typename T::reference, | |||||
use_if_same_t < | |||||
typename T::iterator_category, | |||||
meta::void_t < | |||||
typename _Tp::value_type, | |||||
typename _Tp::difference_type, | |||||
typename _Tp::pointer, | |||||
typename _Tp::reference, | |||||
meta::use_if_same_t < | |||||
typename _Tp::iterator_category, | |||||
std::input_iterator_tag | std::input_iterator_tag | ||||
> | > | ||||
> | > | ||||
> : true_ {}; | |||||
> : meta::true_ {}; | |||||
} | } | ||||
/*! | /*! | ||||
* Value meta-programming function for SPI interface checking | * Value meta-programming function for SPI interface checking | ||||
@@ -821,23 +821,23 @@ namespace utl { | |||||
//! Primary template to catch any non SPI interface types | //! Primary template to catch any non SPI interface types | ||||
template <typename _Tp, typename =void> | template <typename _Tp, typename =void> | ||||
struct is_idxdev_it_ : false_ {}; | |||||
struct is_idxdev_it_ : meta::false_ {}; | |||||
//! template to catch a proper SPI interface type | //! template to catch a proper SPI interface type | ||||
template <typename _Tp> | template <typename _Tp> | ||||
struct is_idxdev_it_ < | struct is_idxdev_it_ < | ||||
_Tp, | _Tp, | ||||
void_t < | |||||
typename T::value_type, | |||||
typename T::difference_type, | |||||
typename T::pointer, | |||||
typename T::reference, | |||||
use_if_same_t < | |||||
typename T::iterator_category, | |||||
meta::void_t < | |||||
typename _Tp::value_type, | |||||
typename _Tp::difference_type, | |||||
typename _Tp::pointer, | |||||
typename _Tp::reference, | |||||
meta::use_if_same_t < | |||||
typename _Tp::iterator_category, | |||||
std::input_iterator_tag | std::input_iterator_tag | ||||
> | > | ||||
> | > | ||||
> : true_ {}; | |||||
> : meta::true_ {}; | |||||
} | } | ||||
/*! | /*! | ||||
* Value meta-programming function for SPI interface checking | * Value meta-programming function for SPI interface checking | ||||
@@ -22,10 +22,10 @@ | |||||
#ifndef __utl_dev_idx_dev_h__ | #ifndef __utl_dev_idx_dev_h__ | ||||
#define __utl_dev_idx_dev_h__ | #define __utl_dev_idx_dev_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/dev/dev_iterators.h> | #include <utl/dev/dev_iterators.h> | ||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -21,10 +21,10 @@ | |||||
#ifndef __utl_dev_in_dev_h__ | #ifndef __utl_dev_in_dev_h__ | ||||
#define __utl_dev_in_dev_h__ | #define __utl_dev_in_dev_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/dev/dev_iterators.h> | #include <utl/dev/dev_iterators.h> | ||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -22,10 +22,10 @@ | |||||
#ifndef __utl_dev_inbuf_dev_h__ | #ifndef __utl_dev_inbuf_dev_h__ | ||||
#define __utl_dev_inbuf_dev_h__ | #define __utl_dev_inbuf_dev_h__ | ||||
#include <utl/impl/impl.h> | |||||
#include <utl/helper/crtp.h> | |||||
#include <utl/meta/sfinae.h> | |||||
#include <utl/core/impl.h> | |||||
#include <utl/core/crtp.h> | |||||
#include <utl/dev/dev_iterators.h> | #include <utl/dev/dev_iterators.h> | ||||
#include <utl/meta/meta.h> | |||||
namespace utl { | namespace utl { | ||||
@@ -1,48 +0,0 @@ | |||||
/*! | |||||
* \file bool.h | |||||
* \brief Template meta-programming bool integral constant | |||||
* | |||||
* Copyright (C) 2018 Christos Choutouridis | |||||
* | |||||
* This program is free software: you can redistribute it and/or modify | |||||
* it under the terms of the GNU Lesser General Public License as | |||||
* published by the Free Software Foundation, either version 3 | |||||
* 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 Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
#ifndef __utl_meta_bool_h__ | |||||
#define __utl_meta_bool_h__ | |||||
#include <utl/impl/impl.h> | |||||
#include <utl/meta/integral.h> | |||||
/*! | |||||
* \ingroup meta | |||||
* \defgroup bool | |||||
* boolean constant type support header | |||||
*/ | |||||
//! @{ | |||||
namespace utl { | |||||
//! bool_ type | |||||
template<bool _v> | |||||
using bool_ = integral_<bool, _v>; | |||||
//! The type used as a compile-time boolean with true value. | |||||
typedef bool_<true> true_; | |||||
//! The type used as a compile-time boolean with false value. | |||||
typedef bool_<false> false_; | |||||
} | |||||
//! @} | |||||
#endif /* __utl_meta_bool_h__ */ |
@@ -1,70 +0,0 @@ | |||||
/*! | |||||
* \file utl/meta/detect.h | |||||
* \brief Template meta-programming void helpers | |||||
* | |||||
* Copyright (C) 2018 Christos Choutouridis | |||||
* | |||||
* This program is free software: you can redistribute it and/or modify | |||||
* it under the terms of the GNU Lesser General Public License as | |||||
* published by the Free Software Foundation, either version 3 | |||||
* 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 Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
#ifndef __utl_meta_detect_h__ | |||||
#define __utl_meta_detect_h__ | |||||
#include <utl/impl/impl.h> | |||||
#include <utl/meta/sfinae.h> | |||||
/*! | |||||
* \ingroup meta | |||||
* \defgroup detect | |||||
* Implementation of the detection idiom | |||||
*/ | |||||
//! @{ | |||||
namespace utl { | |||||
//! detection idiom (negative case). | |||||
template <typename _Def, | |||||
typename _AlwaysVoid, | |||||
template<typename...> class _Op, | |||||
typename... _Args> | |||||
struct detector_ { | |||||
using value_ = false_; | |||||
using type = _Def; | |||||
}; | |||||
//! detection idiom (positive case). | |||||
template <typename _Def, | |||||
template<typename...> class _Op, | |||||
typename... _Args> | |||||
struct detector_ <_Def, void_t<_Op<_Args...>>, _Op, _Args...> { | |||||
using value_ = true_; | |||||
using type = _Op<_Args...>; | |||||
}; | |||||
// Detect whether _Op<_Args...> is a valid type, use _Def if not. | |||||
template <typename _Def, | |||||
template<typename...> class _Op, | |||||
typename... _Args> | |||||
using detected_or_ = detector_ <_Def, void, _Op, _Args...>; | |||||
// template alias | |||||
template <typename _Def, | |||||
template<typename...> class _Op, | |||||
typename... _Args> | |||||
using detected_or_t = typename detected_or_<_Def, _Op, _Args...>::type; | |||||
} | |||||
//! @} | |||||
#endif /* __utl_meta_detect_h__ */ |
@@ -1,59 +0,0 @@ | |||||
/*! | |||||
* \file if.h | |||||
* \brief Template meta-programming conditional helpers | |||||
* | |||||
* Copyright (C) 2018 Christos Choutouridis | |||||
* | |||||
* This program is free software: you can redistribute it and/or modify | |||||
* it under the terms of the GNU Lesser General Public License as | |||||
* published by the Free Software Foundation, either version 3 | |||||
* 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 Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
#ifndef __utl_meta_if_h__ | |||||
#define __utl_meta_if_h__ | |||||
#include <utl/impl/impl.h> | |||||
/*! | |||||
* \ingroup meta | |||||
* \defgroup if | |||||
* conditional type support header | |||||
*/ | |||||
//! @{ | |||||
namespace utl { | |||||
//! select _T1 or _T2 based on _Sel | |||||
//! @{ | |||||
template <bool _Sel, typename _T1, typename _T2> | |||||
struct select_ { | |||||
typedef _T1 type; | |||||
}; | |||||
template <typename _T1, typename _T2> | |||||
struct select_ <false, _T1, _T2> { | |||||
typedef _T2 type; | |||||
}; | |||||
//! @} | |||||
//! select _Tp if _Check is true, else SFINAE | |||||
//! @{ | |||||
template <bool _Check, typename _Tp = void> | |||||
struct if_ { | |||||
typedef _Tp type; | |||||
}; | |||||
template<typename _Tp> // Partial specialization for false. | |||||
struct if_ <false, _Tp> { }; | |||||
} | |||||
//! @} | |||||
#endif /* __utl_meta_if_h__ */ |
@@ -1,63 +0,0 @@ | |||||
/*! | |||||
* \file void.h | |||||
* \brief Template meta-programming void helpers | |||||
* | |||||
* Copyright (C) 2018 Christos Choutouridis | |||||
* | |||||
* This program is free software: you can redistribute it and/or modify | |||||
* it under the terms of the GNU Lesser General Public License as | |||||
* published by the Free Software Foundation, either version 3 | |||||
* 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 Lesser General Public License for more details. | |||||
* | |||||
* You should have received a copy of the GNU Lesser General Public License | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | |||||
*/ | |||||
#ifndef __utl_meta_void_h__ | |||||
#define __utl_meta_void_h__ | |||||
#include <utl/impl/impl.h> | |||||
#include <utl/meta/bool.h> | |||||
/*! \ingroup meta | |||||
* \defgroup void | |||||
* void_ support header | |||||
*/ | |||||
//! @{ | |||||
namespace utl { | |||||
/*! | |||||
* Like boost::mpl we made void_ a complete type to allow it to be | |||||
* instantiated so that it can be passed in as an object that can be | |||||
* used to select an overloaded function. | |||||
*/ | |||||
struct void_ { | |||||
typedef void_ type; | |||||
}; | |||||
template<typename _Tp> | |||||
struct is_void_ | |||||
: false_ { }; | |||||
template<> | |||||
struct is_void_ <void_> | |||||
: true_ { }; | |||||
template<typename _Tp> | |||||
struct is_not_void_ | |||||
: true_ { }; | |||||
template<> | |||||
struct is_not_void_<void_> | |||||
: false_ { }; | |||||
} | |||||
//!@} | |||||
#endif /* __utl_meta_void_h__ */ |
@@ -18,12 +18,10 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#include <gtest.h> | |||||
#include <iostream> | |||||
#include <gtest/gtest.h> | |||||
GTEST_API_ int main(int argc, char **argv) { | GTEST_API_ int main(int argc, char **argv) { | ||||
std::cout << "Running tests from main.cpp\n"; | |||||
testing::InitGoogleTest(&argc, argv); | testing::InitGoogleTest(&argc, argv); | ||||
return RUN_ALL_TESTS(); | return RUN_ALL_TESTS(); | ||||
} | } | ||||
@@ -17,7 +17,7 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#include <gtest.h> | |||||
#include <gtest/gtest.h> | |||||
#include <utl/com/_1wire_uart.h> | #include <utl/com/_1wire_uart.h> | ||||
/*! | /*! | ||||
@@ -17,7 +17,7 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#include <gtest.h> | |||||
#include <gtest/gtest.h> | |||||
#include <utl/com/i2c_bb.h> | #include <utl/com/i2c_bb.h> | ||||
/*! | /*! | ||||
@@ -17,9 +17,10 @@ | |||||
* along with this program. If not, see <http://www.gnu.org/licenses/>. | * along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
* | * | ||||
*/ | */ | ||||
#include <gtest.h> | |||||
#include <gtest/gtest.h> | |||||
#include <utl/com/spi_bb.h> | #include <utl/com/spi_bb.h> | ||||
/*! | /*! | ||||
* \warning | * \warning | ||||
* This is not right way of testing communication interfaces. We have to | * This is not right way of testing communication interfaces. We have to | ||||