C++ named requirements: LayoutMapping (since C++23)
LayoutMapping 는 다차원 인덱스를 데이터 핸들 내의 1차원 오프셋으로 매핑하는 방식을 제어합니다. 이는 std:: mdspan 에서 사용됩니다.
목차 |
요구사항
타입
M
이 다음 조건을 만족하면
LayoutMapping
을 만족합니다:
copyable
와
equality_comparable
개념을 모델링해야 하며, 다음이
true
여야 합니다:
- std:: is_nothrow_move_constructible_v < M >
- std:: is_nothrow_move_assignable_v < M >
- std:: is_nothrow_swappable_v < M >
태그 내부), 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 |
|
| m. required_span_size ( ) | typename M :: index_type |
|
| 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_always_unique ( ) | bool |
|
| M :: is_always_exhaustive ( ) | bool |
|
| M :: is_always_strided ( ) | bool |
|
- ↑ 매핑은 조건이 충족되더라도 false 를 반환할 수 있습니다. 특정 레이아웃의 경우 레이아웃이 고유한지 효율적으로 판단하는 것이 불가능할 수 있습니다.
- ↑ 위와 동일하지만, exhaustive 레이아웃의 경우입니다.
- ↑ 위와 동일하지만, strided 레이아웃의 경우입니다.
- ↑ 매핑은 조건이 충족되더라도 false 를 반환할 수 있습니다. 특정 레이아웃 매핑의 경우 모든 인스턴스가 고유한지 판단하는 것이 불가능할 수 있습니다.
- ↑ 위와 동일하지만, exhaustive 인스턴스의 경우입니다.
- ↑ 위와 동일하지만, strided 인스턴스의 경우입니다.
개념
제약 조건은 std::layout_stride::mapping 아래에서 사용될 때, 다음의 설명 전용 개념이 정의됩니다.
|
template
<
class
M
>
concept
/*레이아웃-매핑-유사*/
=
requires
|
( 설명 전용* ) | |
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 멤버 클래스 템플릿)
|