Browse Source

!Compile: header and meta::naming rework in the rest of lib

doc
Christos Houtouridis 5 years ago
parent
commit
1ac1e0bf73
25 changed files with 203 additions and 373 deletions
  1. +17
    -17
      include/utl/com/_1wire.h
  2. +1
    -1
      include/utl/com/_1wire_id.h
  3. +2
    -2
      include/utl/com/_1wire_uart.h
  4. +12
    -12
      include/utl/com/i2c.h
  5. +2
    -2
      include/utl/com/i2c_bb.h
  6. +10
    -10
      include/utl/com/spi.h
  7. +15
    -15
      include/utl/com/spi_bb.h
  8. +1
    -1
      include/utl/container/array.h
  9. +1
    -1
      include/utl/container/id.h
  10. +1
    -1
      include/utl/core/crtp.h
  11. +8
    -12
      include/utl/core/impl.h
  12. +18
    -8
      include/utl/core/types.h
  13. +74
    -9
      include/utl/core/version.h
  14. +27
    -27
      include/utl/dev/dev_iterators.h
  15. +3
    -3
      include/utl/dev/idx_dev.h
  16. +3
    -3
      include/utl/dev/in_dev.h
  17. +3
    -3
      include/utl/dev/inbuf_dev.h
  18. +0
    -48
      include/utl/meta/bool.h
  19. +0
    -70
      include/utl/meta/detect.h
  20. +0
    -59
      include/utl/meta/if.h
  21. +0
    -63
      include/utl/meta/invoke.h
  22. +1
    -3
      test/main.cpp
  23. +1
    -1
      test/tests/test_1w_impl.cpp
  24. +1
    -1
      test/tests/test_i2c_impl.cpp
  25. +2
    -1
      test/tests/test_spi_impl.cpp

+ 17
- 17
include/utl/com/_1wire.h View File

@@ -21,10 +21,10 @@
#ifndef __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/meta/meta.h>
namespace utl {
@@ -681,27 +681,27 @@ namespace _1wire_i_det {
//! Primary template to catch any non 1-wire interface types
template <typename _Tp, typename =void>
struct is_1wire_ : false_ {};
struct is_1wire_ : meta::false_ {};
//! template to catch a proper 1-wire interface type
template <typename _Tp>
struct is_1wire_ <_Tp,
void_t <
meta::void_t <
// typename _Tp::Speed,
// 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
> : true_ {};
> : meta::true_ {};
} // namespace _1wire_i_det
/*!


+ 1
- 1
include/utl/com/_1wire_id.h View File

@@ -21,7 +21,7 @@
#ifndef __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>
namespace utl {


+ 2
- 2
include/utl/com/_1wire_uart.h View File

@@ -29,8 +29,8 @@
#ifndef __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>
namespace utl {


+ 12
- 12
include/utl/com/i2c.h View File

@@ -21,9 +21,9 @@
#ifndef _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 {
@@ -254,21 +254,21 @@ namespace utl {
//! Primary template to catch any non I2C interface types
template <typename _Tp, typename =void>
struct is_i2c_ : false_ { };
struct is_i2c_ : meta::false_ { };
//! template to catch a proper I2C interface type
template <typename _Tp>
struct is_i2c_ <_Tp,
void_t <
meta::void_t <
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


+ 2
- 2
include/utl/com/i2c_bb.h View File

@@ -22,8 +22,8 @@
#ifndef __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>


+ 10
- 10
include/utl/com/spi.h View File

@@ -21,9 +21,9 @@
#ifndef _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 {
@@ -302,19 +302,19 @@ namespace utl {
//! Primary template to catch any non SPI interface types
template <typename _Tp, typename =void>
struct is_spi_ : false_ {};
struct is_spi_ : meta::false_ {};
//! template to catch a proper SPI interface type
template <typename _Tp>
struct is_spi_ <
_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


+ 15
- 15
include/utl/com/spi_bb.h View File

@@ -22,10 +22,10 @@
#ifndef __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/meta/meta.h>
namespace utl {
@@ -75,9 +75,9 @@ namespace utl {
//! \name SPI implementation specific functions
//!@{
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
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 () {
return !static_cast<bool>(C);
}
@@ -113,9 +113,9 @@ namespace utl {
byte_t _tx_data (byte_t out) { return _tx_data_impl (out); }
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>
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
@@ -134,7 +134,7 @@ namespace utl {
*/
template <typename impl_t, spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder>
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) {
byte_t in {};
SCLK (clkL_);
@@ -158,7 +158,7 @@ namespace utl {
*/
template <typename impl_t, spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder>
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) {
byte_t in {};
SCLK (clkL_);
@@ -207,9 +207,9 @@ namespace utl {
//! \name SPI implementation specific functions
//!@{
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
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 () {
return !static_cast<bool>(C);
}
@@ -241,9 +241,9 @@ namespace utl {
byte_t _tx_data (byte_t out) final { return _tx_data_impl (out); }
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>
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
@@ -262,7 +262,7 @@ namespace utl {
*/
template <spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder>
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) {
byte_t in {};
SCLK (clkL_);
@@ -286,7 +286,7 @@ namespace utl {
*/
template <spi::cpol CPOL, spi::cpha CPHA, spi::bitOrder BitOrder>
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) {
byte_t in {};
SCLK (clkL_);


+ 1
- 1
include/utl/container/array.h View File

@@ -21,7 +21,7 @@
#ifndef __utl_container_array_h__
#define __utl_container_array_h__
#include <utl/impl/impl.h>
#include <utl/core/impl.h>
#include <algorithm>
namespace utl {


+ 1
- 1
include/utl/container/id.h View File

@@ -22,7 +22,7 @@
#ifndef __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 <algorithm>


+ 1
- 1
include/utl/core/crtp.h View File

@@ -21,7 +21,7 @@
#ifndef __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


+ 8
- 12
include/utl/core/impl.h View File

@@ -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
*
@@ -18,17 +18,13 @@
* 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__ */

+ 18
- 8
include/utl/core/types.h View File

@@ -1,5 +1,5 @@
/*!
* \file /utl/impl/types.h
* \file /utl/core/types.h
* \brief Basic type alias support
*
* Copyright (C) 2018 Christos Choutouridis
@@ -18,15 +18,25 @@
* 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__ */

+ 74
- 9
include/utl/core/version.h View File

@@ -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
*
@@ -18,23 +18,88 @@
* 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
//! 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_MINOR 0
#define UTL_VERSION_PATCH 0
#define UTL_VERSION_PATCH 1
#define UTL_VERSION_VALUE ( (UTL_VERSION_MAJOR * 10000) \
+ (UTL_VERSION_MINOR * 100) \
+ 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"
#endif
#endif /* __utl_impl_version_h__ */
//!@}
#endif /* #ifndef __utl_core_version_h__ */

+ 27
- 27
include/utl/dev/dev_iterators.h View File

@@ -278,23 +278,23 @@ namespace utl {
//! Primary template to catch any non SPI interface types
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 <typename _Tp>
struct is_outdev_it_ <
_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
>
>
> : true_ {};
> : meta::true_ {};
}
/*!
* Value meta-programming function for SPI interface checking
@@ -525,23 +525,23 @@ namespace utl {
//! Primary template to catch any non SPI interface types
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 <typename _Tp>
struct is_indev_it_ <
_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
>
>
> : true_ {};
> : meta::true_ {};
}
/*!
* Value meta-programming function for SPI interface checking
@@ -821,23 +821,23 @@ namespace utl {
//! Primary template to catch any non SPI interface types
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 <typename _Tp>
struct is_idxdev_it_ <
_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
>
>
> : true_ {};
> : meta::true_ {};
}
/*!
* Value meta-programming function for SPI interface checking


+ 3
- 3
include/utl/dev/idx_dev.h View File

@@ -22,10 +22,10 @@
#ifndef __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/meta/meta.h>
namespace utl {


+ 3
- 3
include/utl/dev/in_dev.h View File

@@ -21,10 +21,10 @@
#ifndef __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/meta/meta.h>
namespace utl {


+ 3
- 3
include/utl/dev/inbuf_dev.h View File

@@ -22,10 +22,10 @@
#ifndef __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/meta/meta.h>
namespace utl {


+ 0
- 48
include/utl/meta/bool.h View File

@@ -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__ */

+ 0
- 70
include/utl/meta/detect.h View File

@@ -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__ */

+ 0
- 59
include/utl/meta/if.h View File

@@ -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__ */

+ 0
- 63
include/utl/meta/invoke.h View File

@@ -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__ */

+ 1
- 3
test/main.cpp View File

@@ -18,12 +18,10 @@
* 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) {
std::cout << "Running tests from main.cpp\n";
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}


+ 1
- 1
test/tests/test_1w_impl.cpp View File

@@ -17,7 +17,7 @@
* 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>
/*!


+ 1
- 1
test/tests/test_i2c_impl.cpp View File

@@ -17,7 +17,7 @@
* 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>
/*!


+ 2
- 1
test/tests/test_spi_impl.cpp View File

@@ -17,9 +17,10 @@
* 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>
/*!
* \warning
* This is not right way of testing communication interfaces. We have to


Loading…
Cancel
Save