[exec.simple.counting.mem]

# 33 Execution control library [[exec]](./#exec)

## 33.14 Execution scope utilities [[exec.scope]](exec.scope#exec.simple.counting.mem)

### 33.14.2 Counting Scopes [[exec.counting.scopes]](exec.counting.scopes#exec.simple.counting.mem)

#### 33.14.2.2 Simple Counting Scope [[exec.scope.simple.counting]](exec.scope.simple.counting#exec.simple.counting.mem)

#### 33.14.2.2.3 Members [exec.simple.counting.mem]

[ð](#lib:get_token,execution::simple_counting_scope)

`token get_token() noexcept;
`

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8018)

*Returns*: An object t of type simple_counting_scope​::​token such thatt.*scope* == this is true[.](#1.sentence-1)

[ð](#lib:close,execution::simple_counting_scope)

`void close() noexcept;
`

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8030)

*Effects*: If *state* is

- [(2.1)](#2.1)

*unused*, then changes *state* to *unused-and-closed*;

- [(2.2)](#2.2)

*open*, then changes *state* to *closed*;

- [(2.3)](#2.3)

*open-and-joining*,
then changes *state* to *closed-and-joining*;

- [(2.4)](#2.4)

otherwise, no effects[.](#2.sentence-1)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8045)

*Postconditions*: Any subsequent call to *try-associate*() on *this returns false[.](#3.sentence-1)

[ð](#lib:join,execution::simple_counting_scope)

`[sender](exec.snd.concepts#concept:sender "33.9.3 Sender concepts [exec.snd.concepts]") auto join() noexcept;
`

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8057)

*Returns*: *make-sender*(*scope-join-t*(), this)[.](#4.sentence-1)

[ð](#lib:try-associate,execution::simple_counting_scope)

`bool try-associate() noexcept;
`

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8068)

*Effects*: If *count* is equal to max_associations, then no effects[.](#5.sentence-1)

Otherwise, if *state* is

- [(5.1)](#5.1)

*unused*,
then increments *count* and changes *state* to *open*;

- [(5.2)](#5.2)

*open* or *open-and-joining*,
then increments *count*;

- [(5.3)](#5.3)

otherwise, no effects[.](#5.sentence-2)

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8083)

*Returns*: true if *count* was incremented, false otherwise[.](#6.sentence-1)

[ð](#lib:disassociate,execution::simple_counting_scope)

`void disassociate() noexcept;
`

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8094)

*Preconditions*: *count* is greater than zero[.](#7.sentence-1)

[8](#8)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8098)

*Effects*: Decrements *count*[.](#8.sentence-1)

If *count* is zero after decrementing and*state* is *open-and-joining* or *closed-and-joining*,
changes *state* to *joined* and
calls *complete*() on all objects registered with *this[.](#8.sentence-2)

[*Note [1](#note-1)*:

Calling *complete*() on any registered object
can cause *this to be destroyed[.](#8.sentence-3)

â *end note*]

[ð](#lib:start-join-sender,execution::simple_counting_scope)

`template<class State>
  bool start-join-sender(State& st) noexcept;
`

[9](#9)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/exec.tex#L8118)

*Effects*: If *state* is

- [(9.1)](#9.1)

*unused*, *unused-and-closed*, or *joined*, then
changes *state* to *joined* and returns true;

- [(9.2)](#9.2)

*open* or *open-and-joining*, then
changes *state* to *open-and-joining*,
registers st with *this and returns false;

- [(9.3)](#9.3)

*closed* or *closed-and-joining*, then
changes *state* to *closed-and-joining*,
registers st with *this and returns false[.](#9.sentence-1)
