Namespaces
Variants

C++ named requirements: LayoutMapping (since C++23)

From cppreference.net
C++ named requirements

LayoutMapping 는 다차원 인덱스를 데이터 핸들 내의 1차원 오프셋으로 매핑하는 방식을 제어합니다. 이는 std:: mdspan 에서 사용됩니다.

목차

요구사항

타입 M 이 다음 조건을 만족하면 LayoutMapping 을 만족합니다: copyable equality_comparable 개념을 모델링해야 하며, 다음이 true 여야 합니다:

**참고:** 제공된 HTML 코드에는 번역이 필요한 일반 텍스트가 포함되어 있지 않습니다. 모든 내용이 C++ 코드( 태그 내부), HTML 태그/속성, 또는 번역이 금지된 C++ 특정 용어(std::is_nothrow_move_constructible_v 등)로 구성되어 있습니다. 따라서 원본 형식을 완전히 보존한 채로 출력합니다.

그리고, 다음 유형과 값이 주어졌을 때 아래 표에 표시된 표현식들은 유효하며 표시된 의미를 갖습니다:

범례

유형 정의
M 레이아웃 매핑 클래스
정의
m (const 한정이 가능한) M 타입의 값
i , j m. extents ( ) 의 다차원 인덱스인 (const 한정이 가능한) 정수 팩
r typename M​ :: ​extents_type 의 (const 한정이 가능한) 랭크 인덱스
d_r sizeof... ( d_r ) == M​ :: ​extents_type​ :: ​rank ( ) true 인 (const 한정이 가능한) 정수 팩으로, r 랭크 인덱스의 요소는 1 이고 다른 모든 요소는 0

멤버 타입

이름 유형 요구사항
M::extents_type 클래스 템플릿 std:: extents 의 특수화
M::index_type typename M :: extents_type :: index_type
M::rank_type typename M :: extents_type :: rank_type
M::layout_type 레이아웃 매핑 정책 MP (단, typename MP :: template mapping < E > M 인 경우)
단일 extents 유형 E 에 대해
LayoutMappingPolicy 를 만족하며, M MP 의 매핑 유형인 경우

멤버 함수와 연산자

Expression Return type Semantics
m. extents ( ) const typename M​ :: ​extents_type & 연관된 다차원 인덱스 공간에 대한 상수 참조를 반환합니다
m ( i... ) typename M​ :: ​index_type
  • 음수가 아닌 정수 o 를 반환하며, 이는 o < std:: numeric_limits < typename M​ :: ​index_type > :: ​max ( ) o <= std:: numeric_limits < std:: size_t > :: ​max ( ) 모두 true 여야 합니다.
  • 해당 표현식은 m ( static_cast < typename M :: index_type > ( i ) ... ) 와 동등합니다.
m. required_span_size ( ) typename M​ :: ​index_type
  • 다차원 인덱스 공간 m. extents ( ) 의 크기가 0이 아닌 경우, 모든 i 에 대한 m ( i... ) 의 최댓값에 1을 더한 값을 반환합니다.
  • 그렇지 않은 경우, 0 을 반환합니다.
m. is_unique ( ) bool 모든 i j 에 대해 ( i ! = j || ... ) true 인 경우에만 m ( i... ) ! = m ( j... ) true 일 때만 true 를 반환합니다. [note 1]
m. is_exhaustive ( ) bool true 를 반환하는 경우는 오직 범위 [ 0 , m. required_span_size ( ) ) 내의 모든 k 에 대해 m ( i... ) k 와 동일한 i 가 존재할 때만입니다. [note 2]
m. is_strided ( ) bool true 를 반환하는 경우는 m. extents ( ) 의 모든 차원 인덱스 r 에 대해 정수 s_r 가 존재하고, ( i + d_r ) m. extents ( ) 내의 다차원 인덱스인 모든 i 에 대해 m ( ( i + d_r ) ... ) - m ( i... ) s_r 과 동일한 경우에만 해당됩니다. [note 3]
m. stride ( r ) typename M​ :: ​index_type
  • 전제 조건은 m. is_strided ( ) true 인 것입니다.
  • 위의 m. is_strided ( ) 에 정의된 대로 랭크 인덱스 r 에서의 스트라이드 s_r 을 반환합니다.
M :: is_always_unique ( ) bool
  • m. is_unique ( ) 가 모든 가능한 M 타입 객체 m 에 대해 true 인 경우에만 true 를 반환합니다. [참고 4]
  • 반환값은 항상 상수 표현식입니다.
M :: is_always_exhaustive ( ) bool
  • M 타입의 모든 가능한 객체 m 에 대해 m. is_exhaustive ( ) true 인 경우에만 true 를 반환합니다. [각주 5]
  • 반환값은 항상 상수 표현식입니다.
M :: is_always_strided ( ) bool
  • true 를 반환하는 경우는 m. is_strided ( ) true 인 경우로, 이는 M 타입의 모든 가능한 객체 m 에 대해서만 해당됩니다. [참고 6]
  • 반환값은 항상 상수 표현식입니다.
  1. 매핑은 조건이 충족되더라도 false 를 반환할 수 있습니다. 특정 레이아웃의 경우 레이아웃이 고유한지 효율적으로 판단하는 것이 불가능할 수 있습니다.
  2. 위와 동일하지만, exhaustive 레이아웃의 경우입니다.
  3. 위와 동일하지만, strided 레이아웃의 경우입니다.
  4. 매핑은 조건이 충족되더라도 false 를 반환할 수 있습니다. 특정 레이아웃 매핑의 경우 모든 인스턴스가 고유한지 판단하는 것이 불가능할 수 있습니다.
  5. 위와 동일하지만, exhaustive 인스턴스의 경우입니다.
  6. 위와 동일하지만, strided 인스턴스의 경우입니다.

개념

제약 조건은 std::layout_stride::mapping 아래에서 사용될 때, 다음의 설명 전용 개념이 정의됩니다.

template < class M >

concept /*레이아웃-매핑-유사*/ = requires
{
requires /*익스텐트-여부*/ < typename M :: extents_type > ;
{ M :: is_always_strided ( ) } - > std:: same_as < bool > ;
{ M :: is_always_exhaustive ( ) } - > std:: same_as < bool > ;
{ M :: is_always_unique ( ) } - > std:: same_as < bool > ;
std:: bool_constant < M :: is_always_strided ( ) > :: value ;
std:: bool_constant < M :: is_always_exhaustive ( ) > :: value ;
std:: bool_constant < M :: is_always_unique ( ) > :: value ;

} ;
( 설명 전용* )

LayoutMapping 요구사항의 최소 사용성 제약 조건을 정의합니다. 이 개념은 위의 술어 매핑 특성 함수들이 존재하며, 상수 표현식이고, 반환 타입이 bool 인지 확인합니다.

/*is-extents*/ < E > true 인 경우에만, 그리고 그 경우에 E std::extents 의 특수화(specialization)일 때입니다.

표준 라이브러리

다음 표준 라이브러리 타입들은 LayoutMapping 요구사항을 충족합니다:

layout_left 의 레이아웃 매핑
( std::layout_left 의 public 멤버 클래스 템플릿)
layout_right 의 레이아웃 매핑
( std::layout_right 의 public 멤버 클래스 템플릿)
layout_stride 의 레이아웃 매핑
( std::layout_stride 의 public 멤버 클래스 템플릿)
layout_left_padded 의 레이아웃 매핑
( std::layout_left_padded<PaddingValue> 의 public 멤버 클래스 템플릿)
layout_right_padded 의 레이아웃 매핑
( std::layout_right_padded<PaddingValue> 의 public 멤버 클래스 템플릿)

참고 항목