|  | #pragma once | 
|  | #include <cstdint> | 
|  |  | 
|  | #include <c10/macros/Macros.h> | 
|  |  | 
|  | namespace c10 { | 
|  |  | 
|  | /** | 
|  | * bits1x8 is an uninterpreted dtype of a tensor with 1 bit (packed to byte | 
|  | * boundary), without any semantics defined. | 
|  | */ | 
|  | struct alignas(1) bits1x8 { | 
|  | using underlying = uint8_t; | 
|  | uint8_t val_; | 
|  | bits1x8() = default; | 
|  | C10_HOST_DEVICE explicit bits1x8(uint8_t val) : val_(val) {} | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * bits2x4 is an uninterpreted dtype of a tensor with 2 bits (packed to byte | 
|  | * boundary), without any semantics defined. | 
|  | */ | 
|  | struct alignas(1) bits2x4 { | 
|  | using underlying = uint8_t; | 
|  | uint8_t val_; | 
|  | bits2x4() = default; | 
|  | C10_HOST_DEVICE explicit bits2x4(uint8_t val) : val_(val) {} | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * bits4x2 is an uninterpreted dtype of a tensor with 4 bits (packed to byte | 
|  | * boundary), without any semantics defined. | 
|  | */ | 
|  | struct alignas(1) bits4x2 { | 
|  | using underlying = uint8_t; | 
|  | uint8_t val_; | 
|  | bits4x2() = default; | 
|  | C10_HOST_DEVICE explicit bits4x2(uint8_t val) : val_(val) {} | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * bits8 is an uninterpreted dtype of a tensor with 8 bits, without any | 
|  | * semantics defined. | 
|  | */ | 
|  | struct alignas(1) bits8 { | 
|  | uint8_t val_; | 
|  | bits8() = default; | 
|  | C10_HOST_DEVICE explicit bits8(uint8_t val) : val_(val) {} | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * bits16 is an uninterpreted dtype of a tensor with 16 bits, without any | 
|  | * semantics defined. | 
|  | */ | 
|  | struct alignas(2) bits16 { | 
|  | uint16_t val_; | 
|  | bits16() = default; | 
|  | C10_HOST_DEVICE explicit bits16(uint16_t val) : val_(val) {} | 
|  | }; | 
|  |  | 
|  | } // namespace c10 |