text: #ifndef smlcpp_smlex_hpp
  #define smlcpp_smlex_hpp
  
  import "operator.hpp";
  
  namespace sml
  {
  	//size_t type alias--varies based on target word size
  #if defined(_M_X64)
  	using size_t = unsigned __int64;
  #else
  	using size_t = unsigned __int32;
  #endif
  
  	//64-bit type aliases
  	using uint64_t = unsigned __int64;
  	using  int64_t =   signed __int64;
  
  	//32-bit type aliases
  	using uint32_t = unsigned __int32;
  	using  int32_t =   signed __int32;
  
  	//16-bit type aliases
  	using uint16_t = unsigned __int16;
  	using  int16_t =   signed __int16;
  
  	//8-bit type alises
  	using uint8_t = unsigned __int8;
  	using  int8_t =   signed __int8;
  }
  
  #if not defined(OPERATOR_V) and not defined(OPERATOR_C)
  
  #define OPERATOR_V(n, s, x)                                                     \
  inline constexpr sml::s##nt##n##_t operator"" _##x##n(sml::size_t i) noexcept   \
  {                                                                               \
  	return static_cast<sml::s##nt##n##_t>(i);                                   \
  }                                                                               \
  
  #define OPERATOR_C(n)        \
  		OPERATOR_V(n, ui, u) \
  		OPERATOR_V(n, i, i)  \
  
  OPERATOR_C(8)
  OPERATOR_C(16)
  OPERATOR_C(32)
  OPERATOR_C(64)
  
  #undef OPERATOR_V
  #undef OPERATOR_C
  
  #endif
  
  //specialized size_t size integer literal
  inline constexpr sml::size_t operator"" _uz(sml::size_t n) noexcept
  {
  	return static_cast<sml::size_t>(n);
  }
  
  #endif