YSTest: NPL::ContextNode类 参考

YSTest PreAlpha_b900_20201012 The YSLib Test Project

类 | Public 类型 | Public 成员函数 | 静态 Public 成员函数 | Public 属性 | Private 类型 | Private 属性 | 相关函数 | 所有成员列表
NPL::ContextNode类 参考

上下文节点。 更多...

`#include <NPLA.h>`

类 NPL::ContextNode 继承关系图:
[图例]
NPL::ContextNode 的协作图:
[图例]

## 类

class | ReducerSequence
| 动作序列类型：蕴含当前上下文的续延。 更多...
class | ReductionGuard
| 规约守卫：暂存当前动作序列。 更多...

## Public 类型

using | ExceptionHandler = function< void(std::exception_ptr)>
| 异常处理器类型。 更多...

## Public 成员函数

| ContextNode (pmr::memory_resource &)
| 构造：使用指定的存储资源。 更多...
| ContextNode (const ContextNode &, shared_ptr< Environment > &&)
| 构造：使用对象副本和环境指针。 更多...
| ContextNode (const ContextNode &)
| 复制构造。 更多...
| ContextNode (ContextNode &&) ynothrow
| 转移构造。 更多...
virtual | ~ContextNode ()
| 虚析构：顺序移除当前序列中的动作。 更多...
| DefDeCopyMoveAssignment (ContextNode) DefPred(const ynothrow
| 判断当前动作序列非空。 更多...
!current | empty ()) DefGetter(const ynothrow
!current Environment::BindingMap | GetRecordRef ().GetMapRef()) DefGetter(const ynothrow
!current Environment::BindingMap const ReducerSequence current | DefGetter (const ynothrow -> decltype(std::declval< Reducer >().target_type()), auto, CurrentActionType, IsAlive() ? current.front().target_type() :ystdex::type_id< void >()) DefGetter(const ynothrow
!current Environment::BindingMap const ReducerSequence current pmr::memory_resource memory_rsrc | DefGetter (const ynothrow, Environment &, RecordRef, *p_record) DefGetter(const ynothrow
| 取环境记录引用。 更多...
template<typename _type >
!current Environment::BindingMap const ReducerSequence current pmr::memory_resource memory_rsrc const shared_ptr< Environment > p_record YB_ATTR_nodiscard YB_PURE _type * | AccessCurrentAs ()
| 访问指定类型的当前动作目标。 更多...
ReductionStatus | ApplyTail ()
| 转移并应用作为尾动作的当前动作，并设置 LastStatus 。 更多...
YB_FLATTEN PDefH(ReductionStatus, Rewrite, Reducer reduce) ImplRet(SetupCurrent(std | PDefH (void, SaveExceptionHandler,) ImplExpr(SetupFront(std
| 重写项。 更多...
template<typename... _tParams>
void | SetupFront (_tParams &&... args)
| 在当前动作序列中添加动作以重规约。 更多...
| PDefH (void, Shift, ReducerSequence &rs, ReducerSequence::const_iterator i) ynothrow ImplExpr(rs.splice_after(rs.cbefore_begin()
| 转移当第二参数指定的位置之前的当前动作序列的动作到第一参数。 更多...
current | cbefore_begin ()
current i | PDefH (ReducerSequence, Switch,) ynothrowv ImplRet(Switch(ReducerSequence(get_allocator()))) PDefH(ReducerSequence
| 切换当前动作序列。 更多...
current i ReducerSequence acts ynothrowv | ImplRet (ystdex::exchange(current, std::move(acts))) shared_ptr< Environment > SwitchEnvironment(const shared_ptr< Environment > &)
| 切换环境。 更多...
| PDefH (shared_ptr< Environment >, SwitchEnvironmentUnchecked, const shared_ptr< Environment > &p_env) ynothrowv ImplRet(YAssertNonnull(p_env)
| ystdex::exchange (p_record, p_env)) YB_ATTR_nodiscard YB_PURE PDefH(shared_ptr< Environment >
const ynothrow | ImplRet (p_record) PDefH(void
| 顺序移除当前动作序列中的所有动作。 更多...
const ynothrow ynothrow | ImplExpr (current.clear()) YB_ATTR_nodiscard YB_PURE PDefH(EnvironmentReference

## 静态 Public 成员函数

static YB_NORETURN void | DefaultHandleException (std::exception_ptr)
| 默认本机异常处理例程：重新抛出并转换 bad_any_cast 异常为类型错误。 更多...
static YB_ATTR_nodiscard Environment::NameResolution | DefaultResolve (shared_ptr< Environment >, string_view)
| 默认的名称解析算法。 更多...

## Public 属性

function< Environment::NameResolution(shared_ptr< Environment >, string_view)> | Resolve {DefaultResolve}
| 解析名称：处理保留名称并查找名称。 更多...
Reducer | TailAction {}
| 尾动作。 更多...
ExceptionHandler | HandleException {DefaultHandleException}
| 本机异常处理例程。 更多...
ReductionStatus | LastStatus = ReductionStatus::Neutral
| 最后一次规约状态。 更多...
YSLib::Logger | Trace {}
| 上下文日志追踪。 更多...
| Alive
!current Environment::BindingMap | BindingsRef
!current Environment::BindingMap const ReducerSequence | Current
!current Environment::BindingMap const ReducerSequence current pmr::memory_resource | MemoryResourceRef
!current Environment::BindingMap const ReducerSequence current pmr::memory_resource memory_rsrc const shared_ptr< Environment > | RecordPtr
| current
current i | Switch
| ShareRecord
const ynothrow | UnwindCurrent
const ynothrow ynothrow | WeakenRecord

## Private 类型

using | ReducerSequenceBase = YSLib::forward_list< Reducer >

## Private 属性

lref< pmr::memory_resource > | memory_rsrc
| 内部存储资源。 更多...
shared_ptr< Environment > | p_record
| 环境记录指针。 更多...
ReducerSequence | current {ReducerSequence::allocator_type(&memory_rsrc.get())}
| 上下文中的当前动作：已被激活的规约操作调用后等待规约的动作序列。 更多...
ReducerSequenceBase | stashed {current.get_allocator()}
| 空动作序列缓存。 更多...
ReducerSequence | stacked {current.get_allocator()}
| 被调用以先入后出顺序保存的上下文的动作序列。 更多...

## 相关函数

(请注意: 这些不是成员函数.)
template<typename... _tParams>
shared_ptr< Environment > | SwitchToFreshEnvironment (ContextNode &ctx, _tParams &&... args)
| 切换到参数指定的新创建的环境。 更多...

## 详细描述

上下文节点。

自从
  build 782

在文件 NPLA.h 第 2384 行定义.

## 成员类型定义说明

## ◆ ExceptionHandler

using NPL::ContextNode::ExceptionHandler = function<void(std::exception_ptr)>

异常处理器类型。

自从
  build 895

在文件 NPLA.h 第 2391 行定义.

## ◆ ReducerSequenceBase

using NPL::ContextNode::ReducerSequenceBase = YSLib::forward_list<Reducer>

private

警告
  非虚析构。

自从
  build 892

在文件 NPLA.h 第 2399 行定义.

## 构造及析构函数说明

## ◆ ContextNode() [1/4]

NPL::ContextNode::ContextNode | ( | pmr::memory_resource & | rsrc | ) |

构造：使用指定的存储资源。

自从
  build 845

在文件 NPLA.cpp 第 1043 行定义.

## ◆ ContextNode() [2/4]

NPL::ContextNode::ContextNode | ( | const ContextNode & | ctx,
|  | shared_ptr< Environment > && | p_rec
| ) |  |

构造：使用对象副本和环境指针。

异常

  std::invalid_argument | 参数指针为空。

参见
  Environment::ThrowForInvalidValue

自从
  build 788

使用参数指定的对象的部分的子对象值初始化。 第二参数被检查后转移构造记录指针。 遍、非缓存动作和日志追踪对象被复制。

在文件 NPLA.cpp 第 1046 行定义.

引用了 NPL::Environment::ThrowForInvalidValue().

函数调用图:

## ◆ ContextNode() [3/4]

NPL::ContextNode::ContextNode | ( | const ContextNode & | ctx | ) |

复制构造。

自从
  build 892

使用参数指定的对象的部分的子对象值初始化。 内存资源、记录指针、遍、非缓存动作、日志追踪对象和规约状态被复制。

在文件 NPLA.cpp 第 1056 行定义.

## ◆ ContextNode() [4/4]

NPL::ContextNode::ContextNode | ( | ContextNode && | ctx | ) |

转移构造。

后置条件
  `p_record->Bindings.empty()` 。

自从
  build 811

在文件 NPLA.cpp 第 1061 行定义.

引用了 NPL::swap().

函数调用图:

## ◆ ~ContextNode()

NPL::ContextNode::~ContextNode | ( |  | ) |

virtual

虚析构：顺序移除当前序列中的动作。

参见
  UnwindCurrent

自从
  build 842

在文件 NPLA.cpp 第 1066 行定义.

引用了 UnwindCurrent.

## 成员函数说明

## ◆ AccessCurrentAs()

template<typename _type >

!current Environment::BindingMap const ReducerSequence current pmr::memory_resource memory_rsrc const shared_ptr<Environment> p_record YB_ATTR_nodiscard YB_PURE _type* NPL::ContextNode::AccessCurrentAs | ( |  | ) |

inline

访问指定类型的当前动作目标。

自从
  build 892

待办事项:
  添加 const 重载。

在文件 NPLA.h 第 2679 行定义.

## ◆ ApplyTail()

ReductionStatus NPL::ContextNode::ApplyTail | ( |  | ) |

转移并应用作为尾动作的当前动作，并设置 LastStatus 。

注解
  非强异常安全：当动作调用抛出异常，不恢复已转移的动作。
  不无效化作序列中第一个动作以外的元素。

前置条件
  断言：`IsAlive()` 。

参见
  TailAction
  HandleException
  LastStatus

自从
  build 810

转移当前动作序列的第一个动作，然后调用。 调用前的转移允许调用 SetupCurrent 或 SetupFront 等设置新的尾调用。 此时，不需要处理已被转移的即已激活的动作。

在文件 NPLA.cpp 第 1072 行定义.

引用了 CatchExpr, current, HandleException, LastStatus, stashed, TailAction, TryExpr , 以及 NPL::YAssert().

函数调用图:

## ◆ cbefore_begin()

current NPL::ContextNode::cbefore_begin | ( |  | ) |

## ◆ DefaultHandleException()

void NPL::ContextNode::DefaultHandleException | ( | std::exception_ptr | p | ) |

static

默认本机异常处理例程：重新抛出并转换 bad_any_cast 异常为类型错误。

前置条件
  断言：参数非空。

异常

  嵌套 | TypeError ：类型不匹配，由 Reduce 抛出的 bad_any_cast 转换。

自从
  build 895

在文件 NPLA.cpp 第 1086 行定义.

引用了 CatchExpr, platform::p, TryExpr , 以及 YAssertNonnull.

## ◆ DefaultResolve()

Environment::NameResolution NPL::ContextNode::DefaultResolve | ( | shared_ptr< Environment > | p_env,
|  | string_view | id
| ) |  |

static

默认的名称解析算法。

前置条件
  断言：第二参数的数据指针非空。

异常

  InvalidReference | 访问共享重定向环境失败。

参见
  Environment::LookupName
  Environment::Parent
  NPL_NPLA_CheckParentEnvironment
  Resolve

自从
  build 894

按默认环境解析规则解析名称。 局部解析失败时，重定向解析 Parent 储存的对象作为父环境的引用值。 不在其它条件下重定向。不重定向到其它目标。 重定向的候选目标是到有限个不同的环境。 支持的重定向项的宿主值的类型包括： EnvironmentList ：环境列表； EnvironmentReference 可能具有共享所有权的重定向环境； shared_ptr<Environment> 具有共享所有权的重定向环境。 若重定向可能具有共享所有权的失败，则表示资源访问错误，如构成循环引用； 发现环境的循环引用视为失败，抛出异常；其它情形行为未定义。 以上支持的宿主值类型被依次尝试访问。若成功，则使用此宿主值类型访问环境。 对列表，使用 DFS （深度优先搜索）依次递归检查其元素。 循环重定向不终止。

在文件 NPLA.cpp 第 1095 行定义.

引用了 platform::bool, NPL::A1::Internals::cur, ystdex::cpp2014::exchange(), NPL::EnvironmentReference::Lock, platform::p, ystdex::retry_on_cond(), ystdex::type_id(), NPL::YAssert(), YAssertNonnull , 以及 YB_FLATTEN.

函数调用图:

## ◆ DefDeCopyMoveAssignment()

NPL::ContextNode::DefDeCopyMoveAssignment | ( | ContextNode |  | ) | const

判断当前动作序列非空。

自从
  build 892

## ◆ DefGetter() [1/2]

!current Environment::BindingMap const ReducerSequence current NPL::ContextNode::DefGetter | ( | const ynothrow -> | decltypestd::declval< Reducer >().target_type(),
|  | auto | ,
|  | CurrentActionType | ,
|  | IsAlive() ? current.front().target_type() :ystdex::type_id< void >() |
| ) |  | const

自从
  build 845

## ◆ DefGetter() [2/2]

!current Environment::BindingMap const ReducerSequence current pmr::memory_resource memory_rsrc NPL::ContextNode::DefGetter | ( | const | ynothrow,
|  | Environment & | ,
|  | RecordRef | ,
|  | * | p_record
| ) |  | const

取环境记录引用。

自从
  build 788

取环境记录指针的引用。

自从
  build 894

## ◆ empty()

!current NPL::ContextNode::empty | ( |  | ) | const

自从
  build 788

## ◆ GetRecordRef()

!current Environment::BindingMap NPL::ContextNode::GetRecordRef | ( |  | ) | const

被这些函数引用 NPL::c_str(), NPL::EmplaceLeaf(), NPL::A1::Forms::LoadModule_SHBuild(), NPL::A1::Forms::LoadModule_std_environments(), NPL::A1::Forms::LoadModule_std_io(), NPL::A1::Forms::LoadModule_std_strings() , 以及 NPL::A1::Forms::LoadModule_std_system().

这是这个函数的调用关系图:

## ◆ ImplExpr()

const ynothrow ynothrow NPL::ContextNode::ImplExpr | ( | current. | clear() | ) |

自从
  build 894

## ◆ ImplRet() [1/2]

const ynothrow NPL::ContextNode::ImplRet | ( | p_record |  | ) |

顺序移除当前动作序列中的所有动作。

自从
  build 892

## ◆ ImplRet() [2/2]

current i ReducerSequence acts ynothrowv NPL::ContextNode::ImplRet | ( | ystdex::exchange(current, std::move(acts)) |  | ) | const &

切换环境。

自从
  build 872

异常

  std::invalid_argument | 参数指针为空。

参见
  SwitchEnvironmentUnchecked

## ◆ PDefH() [1/4]

current i NPL::ContextNode::PDefH | ( | ReducerSequence | ,
|  | Switch |
| ) |  |

切换当前动作序列。

自从
  build 893

交换当前动作序列并返回旧的值。

前置条件
  参数的分配器和当前动作的分配器相等。

## ◆ PDefH() [2/4]

NPL::ContextNode::PDefH | ( | shared_ptr< Environment > | ,
|  | SwitchEnvironmentUnchecked | ,
|  | const shared_ptr< Environment > & | p_env
| ) |  |

前置条件
  断言：参数指针非空。

## ◆ PDefH() [3/4]

YB_FLATTEN PDefH (ReductionStatus, Rewrite, Reducer reduce) ImplRet(SetupCurrent(std NPL::ContextNode::PDefH | ( | void | ,
|  | SaveExceptionHandler |
| ) |  |

inline

重写项。

后置条件
  `IsAlive()` 。

异常

  std::bad_function_call | Reducer 参数为空。

注解
  不处理重规约。

参见
  ApplyTail

前置条件
  间接断言：`!IsAlive`() 。

参见
  RewriteLoop
  SetupCurrent

自从
  build 810

调用 SetupCurrent 设置当前动作，然后返回调用 RewriteLoop 的结果。

重写项循环。

前置条件
  断言：`IsAlive()` 。

自从
  build 895

调用 IsAlive 判断状态，当可规约时调用 ApplyTail 迭代规约重写。 因为递归重写平摊到单一的循环 CheckReducible 不用于判断是否需要继续重写循环。 每次调用当前动作的结果同步到 TailResult 。 返回值为最后一次当前动作调用结果。

保存异常处理器的恢复例程到当前动作序列。

参见
  HandleException
  SetupFront

自从
  build 895

设置当前动作以重规约。

前置条件
  断言：`!IsAlive`() 。
  动作转移无异常抛出。

自从
  build 887

在文件 NPLA.h 第 2776 行定义.

## ◆ PDefH() [4/4]

NPL::ContextNode::PDefH | ( | void | ,
|  | Shift | ,
|  | ReducerSequence & | rs,
|  | ReducerSequence::const_iterator | i
| ) |  |

转移当第二参数指定的位置之前的当前动作序列的动作到第一参数。

自从
  build 895

## ◆ SetupFront()

template<typename... _tParams>

void NPL::ContextNode::SetupFront | ( | _tParams &&... | args | ) |

inline

在当前动作序列中添加动作以重规约。

前置条件
  动作转移无异常抛出。

自从
  build 892

在文件 NPLA.h 第 2805 行定义.

引用了 CHRLib::args, NPL::ToReducer() , 以及 yforward.

被这些函数引用 NPL::A1::Internals::PDefH() , 以及 NPL::RelaySwitched().

函数调用图:
这是这个函数的调用关系图:

## ◆ ystdex::exchange()

NPL::ContextNode::ystdex::exchange | ( | p_record | ,
|  | p_env |
| ) |  |

自从
  build 894

## 友元及相关函数文档

## ◆ SwitchToFreshEnvironment()

template<typename... _tParams>

shared_ptr< Environment > SwitchToFreshEnvironment | ( | ContextNode & | ctx,
|  | _tParams &&... | args
| ) |  |

related

切换到参数指定的新创建的环境。

自从
  build 896

在文件 NPLA.h 第 2942 行定义.

引用了 NPL::AllocateEnvironment(), CHRLib::args , 以及 yforward.

函数调用图:

## 类成员变量说明

## ◆ Alive

NPL::ContextNode::Alive

在文件 NPLA.h 第 2646 行定义.

## ◆ BindingsRef

!current Environment::BindingMap NPL::ContextNode::BindingsRef

在文件 NPLA.h 第 2649 行定义.

## ◆ current [1/2]

ReducerSequence NPL::ContextNode::current {ReducerSequence::allocator_type(&memory_rsrc.get())}

private

上下文中的当前动作：已被激活的规约操作调用后等待规约的动作序列。

自从
  build 892

注解
  为便于确保资源释放和异常安全，不使用 ystdex::one_shot 。

在文件 NPLA.h 第 2565 行定义.

被这些函数引用 ApplyTail().

## ◆ Current

!current Environment::BindingMap const ReducerSequence NPL::ContextNode::Current

在文件 NPLA.h 第 2651 行定义.

## ◆ current [2/2]

NPL::ContextNode::current

在文件 NPLA.h 第 2825 行定义.

## ◆ HandleException

ExceptionHandler NPL::ContextNode::HandleException {DefaultHandleException}

本机异常处理例程。

参见
  ApplyTail

自从
  build 895

在文件 NPLA.h 第 2590 行定义.

被这些函数引用 ApplyTail().

## ◆ LastStatus

ReductionStatus NPL::ContextNode::LastStatus = ReductionStatus::Neutral

最后一次规约状态。

参见
  ApplyTail

自从
  build 813

在文件 NPLA.h 第 2596 行定义.

被这些函数引用 ApplyTail().

## ◆ memory_rsrc

lref<pmr::memory_resource> NPL::ContextNode::memory_rsrc

private

内部存储资源。

自从
  build 845

在文件 NPLA.h 第 2512 行定义.

## ◆ MemoryResourceRef

!current Environment::BindingMap const ReducerSequence current pmr::memory_resource NPL::ContextNode::MemoryResourceRef

在文件 NPLA.h 第 2658 行定义.

## ◆ p_record

shared_ptr<Environment> NPL::ContextNode::p_record

private

初始值:
{YSLib::allocate_shared<Environment>(
Environment::allocator_type(&memory_rsrc.get()))}

环境记录指针。

不变性
  p_record 。

自从
  build 788

在文件 NPLA.h 第 2518 行定义.

## ◆ RecordPtr

!current Environment::BindingMap const ReducerSequence current pmr::memory_resource memory_rsrc const shared_ptr<Environment> NPL::ContextNode::RecordPtr

在文件 NPLA.h 第 2669 行定义.

## ◆ Resolve

function<Environment::NameResolution(shared_ptr<Environment>, string_view)> NPL::ContextNode::Resolve {DefaultResolve}

解析名称：处理保留名称并查找名称。

返回
  查找到的名称，或查找失败时的空值。

前置条件
  实现断言：第一参数和第二参数的数据指针非空。

异常

  NPLException | 对实现异常中立的未指定派生类型的异常。

注解
  失败时若抛出异常，条件由实现定义。

参见
  LookupName
  NameResolution
  Environment::Parent

自从
  build 894

解析指定环境中的名称。 值指定的实现可被改变，应符合以下描述中的要求。 被解析的环境可能被重定向：解析失败时，尝试提供能进一步解析名称的环境。 重定向通常在局部解析失败时进行，也可对特定保留名称进行。 重定向的目标通常是父环境。 实现名称解析的一般步骤包括： 局部解析：对被处理的上下文查找名称，若成功则返回； 否则，若支持重定向，尝试重定向解析：在重定向后的环境中重新查找名称； 否则，名称解析失败。 名称解析失败时默认返回空值和未指定的环境引用值。对特定的失败，实现可约定抛出异常。 只有和名称解析的相关保留名称需被处理。其它保留名称被忽略。 是否支持重定向由实现指定。若实现支持重定向，应指定确定重定向的目标的规则。 除非实现另行指定，保留名称为空集；否则，保留名称的集合由实现指定。 解析名称重定向上下文时，可能找到被重定向的环境或被解析的对象的循环引用。 不保证检查对反复进入同一重定向环境的循环重定向的环境引用或被解析对象的循环引用。 调用名称解析接口需注意绑定中的状态不引起循环重定向。 若引起循环重定向，除非实现另行指定，行为未定义。 若循环重定向的行为被实现定义，则实现应能确定循环重定向存在； 此后，名称解析最终应失败或不终止。 若使用被解析的对象的循环引用，可在对象语言中引起未定义行为。

在文件 NPLA.h 第 2555 行定义.

## ◆ ShareRecord

NPL::ContextNode::ShareRecord

在文件 NPLA.h 第 2861 行定义.

被这些函数引用 NPL::c_str(), NPL::A1::Forms::LockCurrentEnvironment() , 以及 NPL::A1::SetupTraceDepth().

## ◆ stacked

ReducerSequence NPL::ContextNode::stacked {current.get_allocator()}

private

被调用以先入后出顺序保存的上下文的动作序列。

参见
  MakeCurrentActionGuard

在文件 NPLA.h 第 2576 行定义.

## ◆ stashed

ReducerSequenceBase NPL::ContextNode::stashed {current.get_allocator()}

private

空动作序列缓存。

参见
  ApplyTail
  SetupFront

在文件 NPLA.h 第 2571 行定义.

被这些函数引用 ApplyTail().

## ◆ Switch

current i NPL::ContextNode::Switch

在文件 NPLA.h 第 2837 行定义.

## ◆ TailAction

Reducer NPL::ContextNode::TailAction {}

尾动作。

自从
  build 895

在文件 NPLA.h 第 2584 行定义.

被这些函数引用 ApplyTail() , 以及 NPL::A1::ContextState::RewriteGuarded().

## ◆ Trace

YSLib::Logger NPL::ContextNode::Trace {}

上下文日志追踪。

自从
  build 803

在文件 NPLA.h 第 2601 行定义.

## ◆ UnwindCurrent

const ynothrow NPL::ContextNode::UnwindCurrent

在文件 NPLA.h 第 2868 行定义.

被这些函数引用 NPL::A1::ContextState::RewriteGuarded() , 以及 ~ContextNode().

## ◆ WeakenRecord

const ynothrow ynothrow NPL::ContextNode::WeakenRecord

在文件 NPLA.h 第 2873 行定义.

被这些函数引用 NPL::c_str() , 以及 NPL::A1::Forms::GetCurrentEnvironment().

该类的文档由以下文件生成:

- NPLA.h
- NPLA.cpp

NPL::Environment::allocator_type
BindingMap::allocator_type allocator_type
分配器类型。
Definition: NPLA.h:2022
NPL::ContextNode::memory_rsrc
lref< pmr::memory_resource > memory_rsrc
内部存储资源。
Definition: NPLA.h:2512