template <typename, typename> struct pixel; \
template <typename, typename> struct planar_pixel_reference; \
template <typename, typename> struct planar_pixel_iterator; \
template <typename> class memory_based_step_iterator; \
template <typename> class point2; \
template <typename> class memory_based_2d_locator; \
template <typename> class image_view; \
template <typename, bool, typename> class image; \
using CS##B##_pixel_t = pixel<CM, LAYOUT>; \
using CS##B##c_pixel_t = pixel<CM, LAYOUT> const; \
using CS##B##_ref_t = pixel<CM, LAYOUT>&; \
using CS##B##c_ref_t = pixel<CM, LAYOUT> const&; \
using CS##B##_ptr_t = CS##B##_pixel_t*; \
using CS##B##c_ptr_t = CS##B##c_pixel_t*; \
using CS##B##_step_ptr_t = memory_based_step_iterator<CS##B##_ptr_t>; \
using CS##B##c_step_ptr_t = memory_based_step_iterator<CS##B##c_ptr_t>; \
using CS##B##_loc_t \
= memory_based_2d_locator<memory_based_step_iterator<CS##B##_ptr_t>>; \
using CS##B##c_loc_t \
= memory_based_2d_locator<memory_based_step_iterator<CS##B##c_ptr_t>>; \
using CS##B##_step_loc_t \
= memory_based_2d_locator<memory_based_step_iterator<CS##B##_step_ptr_t>>; \
using CS##B##c_step_loc_t \
= memory_based_2d_locator<memory_based_step_iterator<CS##B##c_step_ptr_t>>; \
using CS##B##_view_t = image_view<CS##B##_loc_t>; \
using CS##B##c_view_t = image_view<CS##B##c_loc_t>; \
using CS##B##_step_view_t = image_view<CS##B##_step_loc_t>; \
using CS##B##c_step_view_t = image_view<CS##B##c_step_loc_t>; \
using CS##B##_image_t = image<CS##B##_pixel_t, false, std::allocator<unsigned char>>;