/*
 * Utils.h
 *
 *  Created on: 29 мая 2015 г.
 *      Author: esaulenko
 */

#ifndef UTILS_H_
#define UTILS_H_


#include <cstdint>
#include "IO.h"


uint32_t constexpr BIT (uint32_t n)
{	return 1UL << n;	}

uint64_t constexpr BIT64 (uint32_t n)
{	return 1ULL << n;	}

template <typename T1, typename T2> uint32_t MAX (T1 a, T2 b)
{
	if (a > b)		return a;
	else			return b;
}

template <typename T1, typename T2> uint32_t MIN (T1 a, T2 b)
{
	if (a > b)		return b;
	else			return a;
}




#define countof(array)		(sizeof(array)/sizeof(array[0]))



// установка/снятие бита

template <typename T> void BSET (T &x, uint32_t bitNo)		///< установить бит
{	x |= BIT64 (bitNo);		}

template <typename T> void BCLR (T &x, uint32_t bitNo)		///< стереть бит
{	x &= ~BIT64 (bitNo);	}

///< определить (стереть (Value=0) или установить(Value=1)) бит
template <typename T> void BDEF (T &x, uint32_t bitNo, uint32_t Value)
{
	if (Value) 		BSET (x, bitNo);
	else			BCLR (x, bitNo);
}



// возвращает номер старшего бита
constexpr int8_t bitmask2offset (uint32_t val)
{
	return (int8_t) ( (val > 1) ? ( bitmask2offset (val/2) + 1 ) : 0 );
}



// управление последовательностями
// использовать в CoreFunc->RunSequence()
#define SEQ(x,y)			CIO::x, CSettings::y-CSettings::seqOFFSET




#endif /* UTILS_H_ */
