diff --git a/.github/workflows/listener-build-linux.yml b/.github/workflows/listener-build-linux.yml index 8cd8512d9..f30d8e2f7 100644 --- a/.github/workflows/listener-build-linux.yml +++ b/.github/workflows/listener-build-linux.yml @@ -1,6 +1,11 @@ name: build-listener-linux - -on: [push, pull_request] +on: + push: + paths-ignore: + - "**.md" + pull_request: + paths-ignore: + - "**.md" jobs: build: diff --git a/.github/workflows/listener-build-macosx.yml b/.github/workflows/listener-build-macosx.yml index 7cd4f8eb1..6ef91601b 100644 --- a/.github/workflows/listener-build-macosx.yml +++ b/.github/workflows/listener-build-macosx.yml @@ -1,6 +1,11 @@ name: build-listener-macosx - -on: [push, pull_request] +on: + push: + paths-ignore: + - "**.md" + pull_request: + paths-ignore: + - "**.md" jobs: build: diff --git a/.github/workflows/listener-build-windows.yml b/.github/workflows/listener-build-windows.yml index 6b54908d7..bf2014205 100644 --- a/.github/workflows/listener-build-windows.yml +++ b/.github/workflows/listener-build-windows.yml @@ -1,6 +1,11 @@ name: build-listener-windows - -on: [push, pull_request] +on: + push: + paths-ignore: + - "**.md" + pull_request: + paths-ignore: + - "**.md" jobs: build: diff --git a/.github/workflows/nix.yml b/.github/workflows/nix.yml index e608b9dfb..44f66746f 100644 --- a/.github/workflows/nix.yml +++ b/.github/workflows/nix.yml @@ -1,12 +1,13 @@ # A set of CI jobs for checking the Nix flake. name: "nix" - on: - pull_request: push: - branches: - - master + paths-ignore: + - "**.md" + pull_request: + paths-ignore: + - "**.md" jobs: cancel-previous-runs: @@ -31,7 +32,7 @@ jobs: needs: cancel-previous-runs strategy: matrix: - package: [tidal, tidal-link, tidal-listener, tidal-parse] + package: [tidal, tidal-link, tidal-parse] os: [ubuntu-latest, macos-latest] runs-on: ${{ matrix.os }} steps: diff --git a/BootTidal.hs b/BootTidal.hs index 1157ec015..c2548d2d3 100644 --- a/BootTidal.hs +++ b/BootTidal.hs @@ -29,8 +29,8 @@ let only = (hush >>) resetCycles = streamResetCycles tidal setCycle = streamSetCycle tidal setcps = asap . cps - getcps = streamGetcps tidal - getnow = streamGetnow tidal + getcps = streamGetCPS tidal + getnow = streamGetNow tidal xfade i = transition tidal True (Sound.Tidal.Transition.xfadeIn 4) i xfadeIn i t = transition tidal True (Sound.Tidal.Transition.xfadeIn t) i histpan i t = transition tidal True (Sound.Tidal.Transition.histpan t) i diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ccce647f..47bcc26d2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # TidalCycles log of changes +## 1.9.5 - Sashiko + +## What's Changed +* avoid loading stream module in other modules, so hint wont crash by @polymorphicengine in https://github.com/tidalcycles/Tidal/pull/1019 +* change streamGetnow to factor in the processAhead and also destroy the sessionstate by @polymorphicengine in https://github.com/tidalcycles/Tidal/pull/1025 +* fix minor7sharp9 chord (the 9th wasn't sharp) by @cleary in https://github.com/tidalcycles/Tidal/pull/1036 +* add metatune param, now against 1.9-dev by @ahihi in https://github.com/tidalcycles/Tidal/pull/1046 +* Build fixes for Tidal 1.9 by @mindofmatthew in https://github.com/tidalcycles/Tidal/pull/1052 +* Update link 1.9 dev by @yaxu in https://github.com/tidalcycles/Tidal/pull/1058 +* More build fixes by @mindofmatthew in https://github.com/tidalcycles/Tidal/pull/1062 +* Consolidate site docs into source docs, and some docs editing by @trespaul in https://github.com/tidalcycles/Tidal/pull/1070 +* Fix negative numbers not working for boolean euclids by @geikha in https://github.com/tidalcycles/Tidal/pull/1063 + +## New Contributors +* @ahihi made their first contribution in https://github.com/tidalcycles/Tidal/pull/1046 +* @trespaul made their first contribution in https://github.com/tidalcycles/Tidal/pull/1070 +* @geikha made their first contribution in https://github.com/tidalcycles/Tidal/pull/1063 + +**Full Changelog**: https://github.com/tidalcycles/Tidal/compare/v1.9.4...v1.9.5 + ## 1.9.4 - Stitch ### What's Changed @@ -17,7 +37,7 @@ **Full Changelog**: https://github.com/tidalcycles/Tidal/compare/v1.9.3...v1.9.4 -### 1.9.3 - Kolam +## 1.9.3 - Kolam ### What's Changed * fix for squeezejoin by @yaxu in https://github.com/tidalcycles/Tidal/pull/950 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3a6e5ed6b..edc34eaf5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,9 +20,7 @@ compiler/interpreter. Some resources for learning Haskell can be found here: The main repository is maintained on github: https://github.com/tidalcycles/tidal -**Please note that ongoing development work towards version 2.0 happens on the 'main' -branch. At the time of writing, bugfixes for current releases should target -the '1.9-dev' branch.** +**At the time of writing, current work should target the '1.10-dev' branch. The 2.0-dev branch is for experiments towards version 2.0.** The SuperDirt repository is here: https://github.com/musikinformatik/SuperDirt @@ -85,11 +83,45 @@ firefox dist/hpc/prof/html/tests/hpc_index.html To run up your changes locally, install Tidal with `cabal install`. To remove them again and revert to the latest release, run `ghc-pkg unregister tidal-1.0.0` being sure to match up the version numbers. (note that ghc packaging is in a state of flux at the moment - this command might not actually work..) -# A process for making a release +# Making a Release -We haven't documented a clear process for this, but we'd like to -describe how to.. +*Note: This may be incomplete—before making a release, it's a good idea to reach out to an existing project maintainer to double-check the process.* -* Share with others for testing -* Tag a release -* Distribute via hackage / stackage +First, you'll need to figure out the new version number. Tidal follows the [Haskell Package Versioning Policy](https://pvp.haskell.org/)—basically, for a given version (e.g. `v1.0.0`), only update the last number if you're releasing a minor, non-breaking change (so a bug fix release might be `v1.0.1`). A major release requires editing the first or second numbers (so a major release that substantially adds or changes functionality might be `v1.1.0`, and a release that rearchitects the fundamentals would be `v2.0.0`). Major releases include those that update dependencies to a new major release. It's also a good idea to do a major release for any bugfixes where performers have started using the "bug" for aesthetics. + +## Get Permission +First, you need to do the following: + +* Make sure that you have been given Owner permissions on the tidalcycles GitHub organization or the Tidal repository +* If you don't have one, [create a user account on Hackage](https://hackage.haskell.org/users/register-request). You'll also need to send an email to the Hackage Trustees mailing list to get upload permissions (the email you receive when you create your account will have details about this process). +* Make sure that you've been added to the maintainers group for the tidal package on Hackage + +## Create a Draft Release in GitHub + +* Draft a [new Tidal release](https://github.com/tidalcycles/Tidal/releases) +* The name of the release will be the human-readable nickname (some traditional form of pattern making or something else that strikes your fancy) +* For the tag, you can specify the next version in the form `v0.0.0` and GitHub will automatically tag the most recent commit whenever you publish the release +* The "Generate Release Notes" is an easy way to list all the relevant updates and new contributors. Feel free to edit this further as needed +* **Save this as a draft for now** + +## Update the Repository + +Push any final changes to the code, updating the following files: +* **[tidal.cabal](https://github.com/tidalcycles/Tidal/blob/1.10-dev/tidal.cabal)**: Change the version field + * **Outdated Dependencies:** Run `cabal update` then `cabal outdated` to determine whether any of Tidal's dependencies are out of date, then update those as well +* **[CHANGELOG.md](https://github.com/tidalcycles/Tidal/blob/1.10-dev/CHANGELOG.md)**: Add your new version at the top (you can copy the release notes from your draft GitHub release) +* **[src/Sound/Tidal/Version.hs](https://github.com/tidalcycles/Tidal/blob/1.10-dev/src/Sound/Tidal/Version.hs)**: Update the version string here too. This is the version that's printed to the console when someone starts Tidal. +* **If any of the other packages (e.g. tidal-link) have changed**: Update the respective **.cabal** files for these packages, and then update dependency information in **tidal.cabal** as needed. + +## Test and Package the Repository + +* Run `cabal test` to make sure all the tests pass (see above for details). +* Run `cabal haddock` and watch for errors to test that Cabal can generate the documentation for the package. +* Run `cabal check` to check for any errors with the package metadata. +* Run `cabal sdist` to generate an archive for distribution. + +## Upload and Test Releases + +* [The Hackage upload page](https://hackage.haskell.org/upload) contains instructions and links for uploading a release archive. **Start by uploading a package candidate because a package release can't be changed!** +* To distribute a package candidate for testing, find the download link for the `.tar.gz` bundle on the Hackage page for the package candidate. This candidate version can be installed with the following command: `cabal v1-install [url]` (note that at this time, [the v1 install command is necessary for installing a library from a URL](https://github.com/haskell/cabal/issues/8335)). +* Once everyone is happy with the new version, go ahead and upload the archive as a package release and publish the release on GitHub! \ No newline at end of file diff --git a/src/Sound/Tidal/Chords.hs b/src/Sound/Tidal/Chords.hs index d3c162a30..8131dac48 100644 --- a/src/Sound/Tidal/Chords.hs +++ b/src/Sound/Tidal/Chords.hs @@ -22,7 +22,10 @@ import Data.Maybe import Sound.Tidal.Pattern --- major chords +-- * Chord definitions + +-- ** Major chords + major :: Num a => [a] major = [0,4,7] aug :: Num a => [a] @@ -45,7 +48,9 @@ major13 :: Num a => [a] major13 = [0,4,7,11,14,21] add13 :: Num a => [a] add13 = [0,4,7,21] --- dominant chords + +-- ** Dominant chords + dom7 :: Num a => [a] dom7 = [0,4,7,10] dom9 :: Num a => [a] @@ -66,7 +71,9 @@ eleven :: Num a => [a] eleven = [0,4,7,10,14,17] thirteen :: Num a => [a] thirteen = [0,4,7,10,14,17,21] --- minor chords + +-- ** Minor chords + minor :: Num a => [a] minor = [0,3,7] diminished :: Num a => [a] @@ -97,7 +104,9 @@ minor13 :: Num a => [a] minor13 = [0,3,7,10,14,17,21] minorMajor7 :: Num a => [a] minorMajor7 = [0,3,7,11] --- other chords + +-- ** Other chords + one :: Num a => [a] one = [0] five :: Num a => [a] @@ -112,7 +121,9 @@ sevenSus4 :: Num a => [a] sevenSus4 = [0,5,7,10] nineSus4 :: Num a => [a] nineSus4 = [0,5,7,10,14] --- questionable chords + +-- ** Questionable chords + sevenFlat10 :: Num a => [a] sevenFlat10 = [0,4,7,10,15] nineSharp5 :: Num a => [a] @@ -128,6 +139,8 @@ elevenSharp = [0,4,7,10,14,18] minor11sharp :: Num a => [a] minor11sharp = [0,3,7,10,14,18] +-- * Chord functions + -- | @chordate cs m n@ selects the @n@th "chord" (a chord is a list of Ints) -- from a list of chords @cs@ and transposes it by @m@ -- chordate :: Num b => [[b]] -> b -> Int -> [b] @@ -140,6 +153,22 @@ minor11sharp = [0,3,7,10,14,18] -- enchord :: Num a => [[a]] -> Pattern a -> Pattern Int -> Pattern a -- enchord chords pn pc = flatpat $ (chordate chords) <$> pn <*> pc +{-| + The @chordTable@ function outputs a list of all available chords and their + corresponding notes. For example, its first entry is @("major",[0,4,7])@ which + means that a major triad is formed by the root (0), the major third (4 semitones + above the root), and the perfect fifth (7 semitones above the root). + + As the list is big, you can use the function 'chordL'. + + If you know the notes from a chord, but can’t find the name of it, you can use this Haskell code to do a reverse look up into the table: + + > filter (\(_,x)->x==[0,4,7,10]) chordTable + + This will output @[("dom7",[0,4,7,10])]@ + + (You’ll need to run @import Sound.Tidal.Chords@ before using this function.) +-} chordTable :: Num a => [(String, [a])] chordTable = [("major", major), ("maj", major), @@ -273,9 +302,31 @@ chordTable = [("major", major), ("m11s", minor11sharp) ] +-- | Look up a specific chord: @chordL "minor7"@ returns @(0>1)|[0,3,7,10]@. chordL :: Num a => Pattern String -> Pattern [a] chordL p = (\name -> fromMaybe [] $ lookup name chordTable) <$> p +{-| +Outputs all the available chords: + +@ +major maj M aug plus sharp5 six 6 sixNine six9 sixby9 6by9 major7 maj7 +major9 maj9 add9 major11 maj11 add11 major13 maj13 add13 dom7 dom9 dom11 +dom13 sevenFlat5 7f5 sevenSharp5 7s5 sevenFlat9 7f9 nine eleven 11 thirteen 13 +minor min m diminished dim minorSharp5 msharp5 mS5 minor6 min6 m6 minorSixNine +minor69 min69 minSixNine m69 mSixNine m6by9 minor7flat5 minor7f5 min7flat5 +min7f5 m7flat5 m7f5 minor7 min7 m7 minor7sharp5 minor7s5 min7sharp5 min7s5 +m7sharp5 m7s5 minor7flat9 minor7f9 min7flat9 min7f9 m7flat9 m7f9 minor7sharp9 +minor7s9 min7sharp9 min7s9 m7sharp9 m7s9 diminished7 dim7 minor9 min9 m9 +minor11 min11 m11 minor13 min13 m13 minorMajor7 minMaj7 mmaj7 one 1 five 5 +sus2 sus4 sevenSus2 7sus2 sevenSus4 7sus4 nineSus4 ninesus4 9sus4 sevenFlat10 +7f10 nineSharp5 9sharp5 9s5 minor9sharp5 minor9s5 min9sharp5 min9s5 m9sharp5 +m9s5 sevenSharp5flat9 7s5f9 minor7sharp5flat9 m7sharp5flat9 elevenSharp 11s +minor11sharp m11sharp m11s +@ + +(You’ll need to run @import Sound.Tidal.Chords@ before using this function.) +-} chordList :: String chordList = unwords $ map fst (chordTable :: [(String, [Int])]) @@ -317,6 +368,7 @@ chordToPatSeq f noteP nameP modsP = uncollect $ do let ch = map (+ n) (fromMaybe [0] $ lookup name chordTable) applyModifierPatSeq f (return ch) modsP --- | turns a given pattern of some Num type, a pattern of chord names and a list of patterns of modifiers into a chord pattern +-- | Turns a given pattern of some 'Num' type, a pattern of chord names, and a +-- list of patterns of modifiers into a chord pattern chord :: (Num a, Enum a) => Pattern a -> Pattern String -> [Pattern [Modifier]] -> Pattern a chord = chordToPatSeq id diff --git a/src/Sound/Tidal/Context.hs b/src/Sound/Tidal/Context.hs index 3d78630f5..057f76061 100644 --- a/src/Sound/Tidal/Context.hs +++ b/src/Sound/Tidal/Context.hs @@ -22,7 +22,7 @@ import Prelude hiding ((<*), (*>)) import Data.Ratio as C -import Sound.Tidal.Config as C +import Sound.Tidal.Stream as C import Sound.Tidal.Control as C import Sound.Tidal.Core as C import Sound.Tidal.Params as C @@ -31,7 +31,6 @@ import Sound.Tidal.Pattern as C import Sound.Tidal.Scales as C import Sound.Tidal.Show as C import Sound.Tidal.Simple as C -import Sound.Tidal.Stream as C import Sound.Tidal.Transition as C import Sound.Tidal.UI as C import Sound.Tidal.Version as C diff --git a/src/Sound/Tidal/Control.hs b/src/Sound/Tidal/Control.hs index 578051799..434b87159 100644 --- a/src/Sound/Tidal/Control.hs +++ b/src/Sound/Tidal/Control.hs @@ -29,20 +29,19 @@ import Data.Ratio import Sound.Tidal.Pattern import Sound.Tidal.Core -import Sound.Tidal.StreamTypes (patternTimeID) +import Sound.Tidal.Stream.Types (patternTimeID) import Sound.Tidal.UI import qualified Sound.Tidal.Params as P import Sound.Tidal.Utils -{- | `spin` will "spin" a layer up a pattern the given number of times, -with each successive layer offset in time by an additional `1/n` of a -cycle, and panned by an additional `1/n`. The result is a pattern that -seems to spin around. This function works best on multichannel -systems. +{- | `spin` will "spin" and layer up a pattern the given number of times, +with each successive layer offset in time by an additional @1/n@ of a cycle, +and panned by an additional @1/n@. The result is a pattern that seems to spin +around. This function work well on multichannel systems. -@ -d1 $ slow 3 $ spin 4 $ sound "drum*3 tabla:4 [arpy:2 ~ arpy] [can:2 can:3]" -@ +> d1 $ slow 3 +> $ spin 4 +> $ sound "drum*3 tabla:4 [arpy:2 ~ arpy] [can:2 can:3]" -} spin :: Pattern Int -> ControlPattern -> ControlPattern spin = tParam _spin @@ -57,23 +56,36 @@ _spin copies p = -{- | `chop` granualizes every sample in place as it is played, turning a pattern of samples into a pattern of sample parts. Use an integer value to specify how many granules each sample is chopped into: +{- | `chop` granularises every sample in place as it is played, turning a + pattern of samples into a pattern of sample parts. Can be used to explore + granular synthesis. -@ -d1 $ chop 16 $ sound "arpy arp feel*4 arpy*4" -@ + Use an integer value to specify how many granules each sample is chopped into: -Different values of `chop` can yield very different results, depending -on the samples used: + > d1 $ chop 16 $ sound "arpy arp feel*4 arpy*4" + Different values of @chop@ can yield very different results, depending on the + samples used: -@ -d1 $ chop 16 $ sound (samples "arpy*8" (run 16)) -d1 $ chop 32 $ sound (samples "arpy*8" (run 16)) -d1 $ chop 256 $ sound "bd*4 [sn cp] [hh future]*2 [cp feel]" -@ --} + > d1 $ chop 16 $ sound (samples "arpy*8" (run 16)) + > d1 $ chop 32 $ sound (samples "arpy*8" (run 16)) + > d1 $ chop 256 $ sound "bd*4 [sn cp] [hh future]*2 [cp feel]" + + You can also use @chop@ (or 'striate') with very long samples to cut them into short + chunks and pattern those chunks. The following cuts a sample into 32 parts, and + plays it over 8 cycles: + + > d1 $ loopAt 8 $ chop 32 $ sound "bev" + + The 'loopAt' takes care of changing the speed of sample playback so that the + sample fits in the given number of cycles perfectly. As a result, in the above + the granules line up perfectly, so you can’t really hear that the sample has + been cut into bits. Again, this becomes more apparent when you do further + manipulations of the pattern, for example 'rev' to reverse the order of the cut + up bits: + > d1 $ loopAt 8 $ rev $ chop 32 $ sound "bev" +-} chop :: Pattern Int -> ControlPattern -> ControlPattern chop = tParam _chop @@ -118,28 +130,25 @@ _chop' n p = begin (fromList begins) # end (fromList ends) # p -} -{- | Striate is a kind of granulator, for example: +{-| Striate is a kind of granulator, cutting samples into bits in a similar to +chop, but the resulting bits are organised differently. For example: -@ -d1 $ striate 3 $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ striate 3 $ sound "ho ho:2 ho:3 hc" -This plays the loop the given number of times, but triggering -progressive portions of each sample. So in this case it plays the loop -three times, the first time playing the first third of each sample, -then the second time playing the second third of each sample, etc.. -With the highhat samples in the above example it sounds a bit like -reverb, but it isn't really. +This plays the loop the given number of times, but triggers progressive portions +of each sample. So in this case it plays the loop three times, the first +time playing the first third of each sample, then the second time playing the +second third of each sample, and lastly playing the last third of each sample. +Replacing @striate@ with 'chop' above, one can hear that the ''chop' version +plays the bits from each chopped-up sample in turn, while @striate@ "interlaces" +the cut up bits of samples together. -You can also use striate with very long samples, to cut it into short -chunks and pattern those chunks. This is where things get towards -granular synthesis. The following cuts a sample into 128 parts, plays -it over 8 cycles and manipulates those parts by reversing and rotating -the loops. +You can also use @striate@ with very long samples, to cut them into short +chunks and pattern those chunks. This is where things get towards granular +synthesis. The following cuts a sample into 128 parts, plays it over 8 cycles +and manipulates those parts by reversing and rotating the loops: -@ -d1 $ slow 8 $ striate 128 $ sound "bev" -@ +> d1 $ slow 8 $ striate 128 $ sound "bev" -} striate :: Pattern Int -> ControlPattern -> ControlPattern @@ -157,20 +166,19 @@ mergePlayRange (b,e) cm = Map.insert "begin" (VF ((b*d')+b')) $ Map.insert "end" {-| -The `striateBy` function is a variant of `striate` with an extra -parameter, which specifies the length of each part. The `striateBy` +The @striateBy@ function is a variant of `striate` with an extra +parameter which specifies the length of each part. The @striateBy@ function still scans across the sample over a single cycle, but if each bit is longer, it creates a sort of stuttering effect. For -example the following will cut the bev sample into 32 parts, but each +example the following will cut the @bev@ sample into 32 parts, but each will be 1/16th of a sample long: -@ -d1 $ slow 32 $ striateBy 32 (1/16) $ sound "bev" -@ +> d1 $ slow 32 $ striateBy 32 (1/16) $ sound "bev" -Note that `striate` uses the `begin` and `end` parameters -internally. This means that if you're using `striate` (or `striateBy`) -you probably shouldn't also specify `begin` or `end`. -} +Note that `striate` and @striateBy@ use the `begin` and `end` parameters +internally. This means that you probably shouldn't also specify `begin` or +`end`. +-} striateBy :: Pattern Int -> Pattern Double -> ControlPattern -> ControlPattern striateBy = tParam2 _striateBy @@ -188,10 +196,9 @@ _striateBy n f p = fastcat $ map (offset . fromIntegral) [0 .. n-1] but every other grain is silent. Use an integer value to specify how many granules each sample is chopped into: -@ -d1 $ gap 8 $ sound "jvbass" -d1 $ gap 16 $ sound "[jvbass drum:4]" -@-} +> d1 $ gap 8 $ sound "jvbass" +> d1 $ gap 16 $ sound "[jvbass drum:4]" +-} gap :: Pattern Int -> ControlPattern -> ControlPattern gap = tParam _gap @@ -200,28 +207,56 @@ _gap :: Int -> ControlPattern -> ControlPattern _gap n p = _fast (toRational n) (cat [pure 1, silence]) |>| _chop n p {- | -`weave` applies a function smoothly over an array of different patterns. It uses an `OscPattern` to -apply the function at different levels to each pattern, creating a weaving effect. - -@ -d1 $ weave 3 (shape $ sine1) [sound "bd [sn drum:2*2] bd*2 [sn drum:1]", sound "arpy*8 ~"] -@ + @weave@ applies one control pattern to a list of other control patterns, with + a successive time offset. It uses an `OscPattern` to apply the function at + different levels to each pattern, creating a weaving effect. For example: + + > d1 $ weave 16 (pan sine) + > [ sound "bd sn cp" + > , sound "casio casio:1" + > , sound "[jvbass*2 jvbass:2]/2" + > , sound "hc*4" + > ] + + In the above, the @pan sine@ control pattern is slowed down by the given + number of cycles, in particular 16, and applied to all of the given sound + patterns. What makes this interesting is that the @pan@ control pattern is + successively offset for each of the given sound patterns; because the @pan@ is + closed down by 16 cycles, and there are four patterns, they are ‘spread out’, + i.e. with a gap of four cycles. For this reason, the four patterns seem to + chase after each other around the stereo field. Try listening on headphones to + hear this more clearly. + + You can even have it the other way round, and have the effect parameters chasing + after each other around a sound parameter, like this: + + > d1 $ weave 16 (sound "arpy" >| n (run 8)) + > [ vowel "a e i" + > , vowel "i [i o] o u" + > , vowel "[e o]/3 [i o u]/2" + > , speed "1 2 3" + > ] -} weave :: Time -> ControlPattern -> [ControlPattern] -> ControlPattern weave t p ps = weave' t p (map (#) ps) -{- | `weaveWith` is similar in that it blends functions at the same time at different amounts over a pattern: - -@ -d1 $ weaveWith 3 (sound "bd [sn drum:2*2] bd*2 [sn drum:1]") [density 2, (# speed "0.5"), chop 16] -@ +{-| + @weaveWith@ is similar to the above, but weaves with a list of functions, rather + than a list of controls. For example: + + > d1 $ weaveWith 3 (sound "bd [sn drum:2*2] bd*2 [sn drum:1]") + > [ fast 2 + > , (# speed "0.5") + > , chop 16 + > ] -} weaveWith :: Time -> Pattern a -> [Pattern a -> Pattern a] -> Pattern a weaveWith t p fs | l == 0 = silence | otherwise = _slow t $ stack $ zipWith (\ i f -> (fromIntegral i % l) `rotL` _fast t (f (_slow t p))) [0 :: Int ..] fs where l = fromIntegral $ length fs +-- | An old alias for 'weaveWith'. weave' :: Time -> Pattern a -> [Pattern a -> Pattern a] -> Pattern a weave' = weaveWith @@ -234,9 +269,7 @@ Shifts between the two given patterns, using distortion. Example: -@ -d1 $ interlace (sound "bd sn kurt") (every 3 rev $ sound "bd sn:2") -@ +> d1 $ interlace (sound "bd sn kurt") (every 3 rev $ sound "bd sn:2") -} interlace :: ControlPattern -> ControlPattern -> ControlPattern interlace a b = weave 16 (P.shape (sine * 0.9)) [a, b] @@ -245,9 +278,7 @@ interlace a b = weave 16 (P.shape (sine * 0.9)) [a, b] {- | Just like `striate`, but also loops each sample chunk a number of times specified in the second argument. The primed version is just like `striateBy`, where the loop count is the third argument. For example: -@ -d1 $ striateL' 3 0.125 4 $ sound "feel sn:2" -@ +> d1 $ striateL' 3 0.125 4 $ sound "feel sn:2" Like `striate`, these use the `begin` and `end` parameters internally, as well as the `loop` parameter for these versions. -} @@ -267,6 +298,21 @@ en ns p = stack $ map (\(i, (k, n)) -> _e k n (samples p (pure i))) $ enumerate -} +{-| @slice@ is similar to 'chop' and 'striate', in that it’s used to slice + samples up into bits. The difference is that it allows you to rearrange those + bits as a pattern. + + > d1 $ slice 8 "7 6 5 4 3 2 1 0" + > $ sound "breaks165" + > # legato 1 + + The above slices the sample into eight bits, and then plays them backwards, + equivalent of applying rev $ chop 8. Here’s a more complex example: + + > d1 $ slice 8 "[<0*8 0*2> 3*4 2 4] [4 .. 7]" + > $ sound "breaks165" + > # legato 1 +-} slice :: Pattern Int -> Pattern Int -> ControlPattern -> ControlPattern slice pN pI p = P.begin b # P.end e # p where b = div' <$> pI <* pN @@ -279,6 +325,16 @@ _slice n i p = # P.begin (pure $ fromIntegral i / fromIntegral n) # P.end (pure $ fromIntegral (i+1) / fromIntegral n) +{-| + @randslice@ chops the sample into the given number of pieces and then plays back + a random one each cycle: + + > d1 $ randslice 32 $ sound "bev" + + Use 'fast' to get more than one per cycle: + + > d1 $ fast 4 $ randslice 32 $ sound "bev" +-} randslice :: Pattern Int -> ControlPattern -> ControlPattern randslice = tParam $ \n p -> innerJoin $ (\i -> _slice n i p) <$> _irand n @@ -290,56 +346,80 @@ _splice bits ipat pat = withEvent f (slice (pure bits) ipat pat) # P.unit (pure where d = sz / fromRational (wholeStop ev - wholeStart ev) sz = 1/fromIntegral bits +{-| + @splice@ is similar to 'slice', but the slices are automatically pitched up or down + to fit their ‘slot’. + + > d1 $ splice 8 "[<0*8 0*2> 3*4 2 4] [4 .. 7]" $ sound "breaks165" +-} splice :: Pattern Int -> Pattern Int -> ControlPattern -> Pattern (Map.Map String Value) splice bitpat ipat pat = innerJoin $ (\bits -> _splice bits ipat pat) <$> bitpat -{- | -`loopAt` makes a sample fit the given number of cycles. Internally, it -works by setting the `unit` parameter to "c", changing the playback -speed of the sample with the `speed` parameter, and setting setting -the `density` of the pattern to match. - -@ -d1 $ loopAt 4 $ sound "breaks125" -d1 $ juxBy 0.6 (|* speed "2") $ slowspread (loopAt) [4,6,2,3] $ chop 12 $ sound "fm:14" -@ +{-| + @loopAt@ makes a sample fit the given number of cycles. Internally, it + works by setting the `unit` parameter to @"c"@, changing the playback + speed of the sample with the `speed` parameter, and setting setting + the `density` of the pattern to match. + + > d1 $ loopAt 4 $ sound "breaks125" + + It’s a good idea to use this in conjuction with 'chop', so the break is chopped + into pieces and you don’t have to wait for the whole sample to start/stop. + + > d1 $ loopAt 4 $ chop 32 $ sound "breaks125" + + Like all Tidal functions, you can mess about with this considerably. The below + example shows how you can supply a pattern of cycle counts to @loopAt@: + + > d1 $ juxBy 0.6 (|* speed "2") + > $ slowspread (loopAt) [4,6,2,3] + > $ chop 12 + > $ sound "fm:14" -} loopAt :: Pattern Time -> ControlPattern -> ControlPattern loopAt n p = slow n p |* P.speed (fromRational <$> (1/n)) # P.unit (pure "c") +{-| + @hurry@ is similiar to 'fast' in that it speeds up a pattern, but it also + increases the speed control by the same factor. So, if you’re triggering + samples, the sound gets higher in pitch. For example: + + > d1 $ every 2 (hurry 2) $ sound "bd sn:2 ~ cp" +-} hurry :: Pattern Rational -> ControlPattern -> ControlPattern hurry !x = (|* P.speed (fromRational <$> x)) . fast x -{- | Smash is a combination of `spread` and `striate` - it cuts the samples +{- | @smash@ is a combination of `spread` and `striate` — it cuts the samples into the given number of bits, and then cuts between playing the loop -at different speeds according to the values in the list. - -So this: +at different speeds according to the values in the list. So this: -@ -d1 $ smash 3 [2,3,4] $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ smash 3 [2,3,4] $ sound "ho ho:2 ho:3 hc" -Is a bit like this: +is a bit like this: -@ -d1 $ spread (slow) [2,3,4] $ striate 3 $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ spread (slow) [2,3,4] $ striate 3 $ sound "ho ho:2 ho:3 hc" This is quite dancehall: -@ -d1 $ (spread' slow "1%4 2 1 3" $ spread (striate) [2,3,4,1] $ sound -"sn:2 sid:3 cp sid:4") - # speed "[1 2 1 1]/2" -@ +> d1 $ ( spread' slow "1%4 2 1 3" +> $ spread (striate) [2,3,4,1] +> $ sound "sn:2 sid:3 cp sid:4" +> ) +> # speed "[1 2 1 1]/2" -} smash :: Pattern Int -> [Pattern Time] -> ControlPattern -> Pattern ValueMap smash n xs p = slowcat $ map (`slow` p') xs where p' = striate n p -{- | an altenative form to `smash` is `smash'` which will use `chop` instead of `striate`. +{- | An altenative form of `smash`, which uses `chop` instead of `striate`. + + Compare the following variations: + + > d1 $ smash 6 [2,3,4] $ sound "ho ho:2 ho:3 hc" + > d1 $ smash' 6 [2,3,4] $ sound "ho ho:2 ho:3 hc" + > d1 $ smash 12 [2,3,4] $ s "bev*4" + > d1 $ smash' 12 [2,3,4] $ s "bev*4" -} smash' :: Int -> [Pattern Time] -> ControlPattern -> ControlPattern smash' n xs p = slowcat $ map (`slow` p') xs @@ -347,19 +427,18 @@ smash' n xs p = slowcat $ map (`slow` p') xs {- | Applies a type of delay to a pattern. - It has three parameters, which could be called depth, time and feedback. + It has three parameters, which could be called @depth@, @time@ and @feedback@. + @depth@ is and integer, and @time@ and @feedback@ are floating point numbers. This adds a bit of echo: - @ - d1 $ echo 4 0.2 0.5 $ sound "bd sn" - @ + + > d1 $ echo 4 0.2 0.5 $ sound "bd sn" The above results in 4 echos, each one 50% quieter than the last, with 1/5th of a cycle between them. It is possible to reverse the echo: - @ - d1 $ echo 4 (-0.2) 0.5 $ sound "bd sn" - @ + + > d1 $ echo 4 (-0.2) 0.5 $ sound "bd sn" -} echo :: Pattern Integer -> Pattern Rational -> Pattern Double -> ControlPattern -> ControlPattern echo = tParam3 _echo @@ -368,13 +447,19 @@ _echo :: Integer -> Rational -> Double -> ControlPattern -> ControlPattern _echo count time feedback p = _echoWith count time (|* P.gain (pure $ feedback)) p {- | - Allows to apply a function for each step and overlays the result delayed by the given time. + @echoWith@ is similar to 'echo', but instead of just decreasing volume to + produce echoes, @echoWith@ applies a function each step and overlays the + result delayed by the given time. + + > d1 $ echoWith 2 "1%3" (# vowel "{a e i o u}%2") $ sound "bd sn" + + In this case there are two _overlays_ delayed by 1/3 of a cycle, where each + has the 'vowel' filter applied. - @ - d1 $ echoWith 2 "1%3" (# vowel "{a e i o u}%2") $ sound "bd sn" - @ + > d1 $ echoWith 4 (1/6) (|* speed "1.5") $ sound "arpy arpy:2" - In this case there are two _overlays_ delayed by 1/3 of a cycle, where each has the @vowel@ filter applied. + In the above, three versions are put on top, with each step getting higher in + pitch as @|* speed "1.5"@ is successively applied. -} echoWith :: Pattern Int -> Pattern Time -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a echoWith n t f p = innerJoin $ (\a b -> _echoWith a b f p) <$> n <* t @@ -423,21 +508,22 @@ trigger = triggerWith id -- with the next cycle boundary. For example, this pattern will fade in -- starting with the next cycle after the pattern is evaluated: -- --- @ --- d1 $ qtrigger $ s "hh(5, 8)" # amp envL --- @ +-- > d1 $ qtrigger $ s "hh(5, 8)" # amp envL -- -- Note that the pattern will start playing immediately. The /start/ of the -- pattern aligns with the next cycle boundary, but events will play before -- if the pattern has events at negative timestamps (which most loops do). -- These events can be filtered out, for example: -- --- @ --- d1 $ qtrigger $ filterWhen (>= 0) $ s "hh(5, 8)" --- @ +-- > d1 $ qtrigger $ filterWhen (>= 0) $ s "hh(5, 8)" +-- +-- Alternatively, you can use 'wait' to achieve the same result: +-- +-- > wait 1 1 $ s "bd hh hh hh" qtrigger :: Pattern a -> Pattern a qtrigger = ctrigger +-- | Alias for 'qtrigger'. qt :: Pattern a -> Pattern a qt = qtrigger @@ -456,20 +542,49 @@ rtrigger = triggerWith $ (fromIntegral :: Int -> Rational) . round ftrigger :: Pattern a -> Pattern a ftrigger = triggerWith $ (fromIntegral :: Int -> Rational) . floor --- | (Alias @__mt__@) Mod trigger. Aligns the start of a pattern to the --- next cycle boundary where the cycle is evenly divisible by a given --- number. 'qtrigger' is equivalent to @mtrigger 1@. +{- | (Alias @__mt__@) Mod trigger. Aligns the start of a pattern to the + next cycle boundary where the cycle is evenly divisible by a given + number. 'qtrigger' is equivalent to @mtrigger 1@. + + In the following example, when activating the @d1@ pattern, it will start at the + same time as the next clap, even if it has to wait for 3 cycles. Once activated, + the @arpy@ sound will play on every cycle, just like any other pattern: + + > do + > resetCycles + > d2 $ every 4 (# s "clap") $ s "bd" + + > d1 $ mtrigger 4 $ filterWhen (>=0) $ s "arpy" +-} mtrigger :: Int -> Pattern a -> Pattern a mtrigger n = triggerWith $ fromIntegral . nextMod where nextMod t = n * ceiling (t / (fromIntegral n)) +-- | Alias for 'mtrigger'. mt :: Int -> Pattern a -> Pattern a mt = mtrigger --- | This aligns the start of a pattern to some value relative to the --- time the pattern is evaluated. The provided function maps the evaluation --- time (on the global cycle clock) to a new time, and then @triggerWith@ --- aligns the pattern's start to the time that's returned. +{- | This aligns the start of a pattern to some value relative to the + time the pattern is evaluated. The provided function maps the evaluation + time (on the global cycle clock) to a new time, and then @triggerWith@ + aligns the pattern's start to the time that's returned. + + This is a more flexible triggering function. In fact, all the other trigger + functions are defined based on @triggerWith@. For example, 'trigger' is just + @triggerWith id@. + + In the next example, use @d1@ as a metronome, and play with different values + (from 0 to 1) on the @const@ expression. You’ll notice how the @clap@ is + displaced from the beginning of each cycle to the end, as the number increases: + + > d1 $ s "bd hh!3" + > + > d2 $ triggerWith (const 0.1) $ s "clap" + + This last example is equivalent to this: + + > d2 $ rotR 0.1 $ s "clap" +-} triggerWith :: (Time -> Time) -> Pattern a -> Pattern a triggerWith f pat = pat {query = q} where q st = query (rotR (offset st) pat) st diff --git a/src/Sound/Tidal/Core.hs b/src/Sound/Tidal/Core.hs index ae0b41991..d4b4c8017 100644 --- a/src/Sound/Tidal/Core.hs +++ b/src/Sound/Tidal/Core.hs @@ -29,7 +29,13 @@ import Sound.Tidal.Pattern -- ** Elemental patterns --- | Takes a function from time to values, and turns it into a 'Pattern'. +{-| Takes a function of time to values, and turns it into a 'Pattern'. + Useful for creating continuous patterns such as 'sine' or 'perlin'. + + For example, 'saw' is defined as + + > saw = sig $ \t -> mod' (fromRational t) 1 +-} sig :: (Time -> a) -> Pattern a sig f = Pattern q where q (State (Arc s e) _) @@ -50,13 +56,13 @@ sine2 = sig $ \t -> sin_rat ((pi :: Double) * 2 * fromRational t) -- | @cosine@ - unipolar cosine wave. A pattern of continuous values -- following a cosine with frequency of one cycle, and amplitude from --- 0 to 1. Equivalent to `0.25 ~> sine`. +-- 0 to 1. Equivalent to @0.25 ~> sine@. cosine :: Fractional a => Pattern a cosine = 0.25 `rotR` sine -- | @cosine2@ - bipolar cosine wave. A pattern of continuous values -- following a cosine with frequency of one cycle, and amplitude from --- -1 to 1. Equivalent to `0.25 ~> sine2`. +-- -1 to 1. Equivalent to @0.25 ~> sine2@. cosine2 :: Fractional a => Pattern a cosine2 = 0.25 `rotR` sine2 @@ -230,11 +236,21 @@ a ||< b = union <$> a <<* b -- ** Constructing patterns --- | Turns a list of values into a pattern, playing one of them per cycle. +{-| Turns a list of values into a pattern, playing one of them per cycle. + The following are equivalent: + + > d1 $ n (fromList [0, 1, 2]) # s "superpiano" + > d1 $ n "<0 1 2>" # s "superpiano" +-} fromList :: [a] -> Pattern a fromList = cat . map pure --- | Turns a list of values into a pattern, playing all of them per cycle. +{-| Turns a list of values into a pattern, playing /all/ of them per cycle. + The following are equivalent: + + > d1 $ n (fastFromList [0, 1, 2]) # s "superpiano" + > d1 $ n "[0 1 2]" # s "superpiano" +-} fastFromList :: [a] -> Pattern a fastFromList = fastcat . map pure @@ -245,19 +261,32 @@ listToPat = fastFromList -- | 'fromMaybes; is similar to 'fromList', but allows values to -- be optional using the 'Maybe' type, so that 'Nothing' results in -- gaps in the pattern. +-- The following are equivalent: +-- > d1 $ n (fromMaybes [Just 0, Nothing, Just 2]) # s "superpiano" +-- > d1 $ n "0 ~ 2" # s "superpiano" fromMaybes :: [Maybe a] -> Pattern a fromMaybes = fastcat . map f where f Nothing = silence f (Just x) = pure x --- | A pattern of whole numbers from 0 to the given number, in a single cycle. +{-| A pattern of whole numbers from 0 to the given number, in a single cycle. + Can be used used to @run@ through a folder of samples in order: + + > d1 $ n (run 8) # sound "amencutup" + + The first parameter to run can be given as a pattern: + + > d1 $ n (run "<4 8 4 6>") # sound "amencutup" +-} run :: (Enum a, Num a) => Pattern a -> Pattern a run = (>>= _run) _run :: (Enum a, Num a) => a -> Pattern a _run n = fastFromList [0 .. n-1] --- | From @1@ for the first cycle, successively adds a number until it gets up to @n@ +-- | Similar to 'run', but starts from @1@ for the first cycle, successively +-- adds a number until it gets up to @n@. +-- > d1 $ n (scan 8) # sound "amencutup" scan :: (Enum a, Num a) => Pattern a -> Pattern a scan = (>>= _scan) @@ -267,11 +296,20 @@ _scan n = slowcat $ map _run [1 .. n] -- ** Combining patterns -- | Alternate between cycles of the two given patterns +-- > d1 $ append (sound "bd*2 sn") (sound "arpy jvbass*2") append :: Pattern a -> Pattern a -> Pattern a append a b = cat [a,b] --- | Like 'append', but for a list of patterns. Interlaces them, playing the first cycle from each --- in turn, then the second cycle from each, and so on. +{- | + Like 'append', but for a list of patterns. Interlaces them, playing the + first cycle from each in turn, then the second cycle from each, and so on. It + concatenates a list of patterns into a new pattern; each pattern in the list + will maintain its original duration. For example: + + > d1 $ cat [sound "bd*2 sn", sound "arpy jvbass*2"] + > d1 $ cat [sound "bd*2 sn", sound "arpy jvbass*2", sound "drum*2"] + > d1 $ cat [sound "bd*2 sn", sound "jvbass*3", sound "drum*2", sound "ht mt"] +-} cat :: [Pattern a] -> Pattern a cat [] = silence cat ps = Pattern q @@ -296,14 +334,20 @@ slowappend :: Pattern a -> Pattern a -> Pattern a slowappend = append -- | Like 'append', but twice as fast +-- > d1 $ fastAppend (sound "bd*2 sn") (sound "arpy jvbass*2") fastAppend :: Pattern a -> Pattern a -> Pattern a fastAppend a b = _fast 2 $ append a b fastappend :: Pattern a -> Pattern a -> Pattern a fastappend = fastAppend --- | The same as 'cat', but speeds up the result by the number of --- patterns there are, so the cycles from each are squashed to fit a --- single cycle. +{-| The same as 'cat', but speeds up the result by the number of + patterns there are, so the cycles from each are squashed to fit a + single cycle. + + > d1 $ fastcat [sound "bd*2 sn", sound "arpy jvbass*2"] + > d1 $ fastcat [sound "bd*2 sn", sound "arpy jvbass*2", sound "drum*2"] + > d1 $ fastcat [sound "bd*2 sn", sound "jvbass*3", sound "drum*2", sound "ht mt"] +-} fastCat :: [Pattern a] -> Pattern a fastCat ps = _fast (toTime $ length ps) $ cat ps @@ -311,7 +355,21 @@ fastCat ps = _fast (toTime $ length ps) $ cat ps fastcat :: [Pattern a] -> Pattern a fastcat = fastCat --- | Similar to @fastCat@, but each pattern is given a relative duration +{- | Similar to @fastCat@, but each pattern is given a relative duration. + You provide proportionate sizes of the patterns to each other for when they’re + concatenated into one cycle. The larger the value in the list, the larger + relative size the pattern takes in the final loop. If all values are equal + then this is equivalent to fastcat (e.g. the following two code fragments are + equivalent). + + > d1 $ fastcat [s "bd*4", s "hh27*8", s "superpiano" # n 0] + + > d1 $ timeCat [ (1, s "bd*4") + > , (1, s "hh27*8") + > , (1, s "superpiano" # n 0) + > ] + +-} timeCat :: [(Time, Pattern a)] -> Pattern a timeCat tps = stack $ map (\(s,e,p) -> compressArc (Arc (s/total) (e/total)) p) $ arrange 0 tps where total = sum $ map fst tps @@ -323,13 +381,42 @@ timeCat tps = stack $ map (\(s,e,p) -> compressArc (Arc (s/total) (e/total)) p) timecat :: [(Time, Pattern a)] -> Pattern a timecat = timeCat --- | 'overlay' combines two 'Pattern's into a new pattern, so that --- their events are combined over time. +{- | @overlay@ combines two 'Pattern's into a new pattern, so that their events +are combined over time. For example, the following two lines are equivalent: + +> d1 $ sound (overlay "bd sn:2" "cp*3") +> d1 $ sound "[bd sn:2, cp*3]" + +@overlay@ is equal to '<>', + +> (<>) :: Semigroup a => a -> a -> a + +which can thus be used as an infix operator equivalent of 'overlay': + +> d1 $ sound ("bd sn:2" <> "cp*3") +-} overlay :: Pattern a -> Pattern a -> Pattern a overlay = (<>) --- | 'stack' combines a list of 'Pattern's into a new pattern, so that --- their events are combined over time. +{- | 'stack' combines a list of 'Pattern's into a new pattern, so that their +events are combined over time, i.e., all of the patterns in the list are played +simultaneously. + +> d1 $ stack [ +> sound "bd bd*2", +> sound "hh*2 [sn cp] cp future*4", +> sound "arpy" +| n "0 .. 15" +> ] + +This is particularly useful if you want to apply a function or synth control +pattern to multiple patterns at once: + +> d1 $ whenmod 5 3 (striate 3) $ stack [ +> sound "bd bd*2", +> sound "hh*2 [sn cp] cp future*4", +> sound "arpy" +| n "0 .. 15" +> ] # speed "[[1 0.8], [1.5 2]*2]/3" +-} stack :: [Pattern a] -> Pattern a stack = foldr overlay silence @@ -343,8 +430,28 @@ stack = foldr overlay silence (~>) :: Pattern Time -> Pattern a -> Pattern a (~>) = tParam rotR --- | Slow down a pattern by the factors in the given time pattern, 'squeezing' --- the pattern to fit the slot given in the time pattern +{-| Slow down a pattern by the factors in the given time pattern, "squeezing" + the pattern to fit the slot given in the time pattern. It is the slow analogue + to 'fastSqueeze'. + + If the time pattern only has a single value in a cycle, @slowSqueeze@ becomes equivalent to slow. These are equivalent: + + > d1 $ slow "<2 4>" $ s "bd*8" + > d1 $ slowSqueeze "<2 4>" $ s "bd*8" + + When the time pattern has multiple values, however, the behavior is a little + different. Instead, a slowed version of the pattern will be made for each value + in the time pattern, and they’re all combined together in a cycle according to + the structure of the time pattern. For example, these are equivalent: + + > d1 $ slowSqueeze "2 4 8 16" $ s "bd*8" + > d1 $ s "bd*4 bd*2 bd bd/2" + + as are these: + + > d1 $ slowSqueeze "2 4 [8 16]" $ s "bd*8" + > d1 $ s "bd*4 bd*2 [bd bd/2]" +-} slowSqueeze :: Pattern Time -> Pattern a -> Pattern a slowSqueeze = tParamSqueeze _slow @@ -353,17 +460,18 @@ sparsity :: Pattern Time -> Pattern a -> Pattern a sparsity = slow {- | Plays a portion of a pattern, specified by a time arc (start and end time). -The new resulting pattern is played over the time period of the original pattern: + The new resulting pattern is played over the time period of the original pattern. -@ -d1 $ zoom (0.25, 0.75) $ sound "bd*2 hh*3 [sn bd]*2 drum" -@ + > d1 $ zoom (0.25, 0.75) $ sound "bd*2 hh*3 [sn bd]*2 drum" -In the pattern above, `zoom` is used with an arc from 25% to 75%. It is equivalent to this pattern: + In the pattern above, @zoom@ is used with an arc from 25% to 75%. It is + equivalent to: -@ -d1 $ sound "hh*3 [sn bd]*2" -@ + > d1 $ sound "hh*3 [sn bd]*2" + + Here’s an example of it being used with a conditional: + + > d1 $ every 4 (zoom (0.25, 0.75)) $ sound "bd*2 hh*3 [sn bd]*2 drum" -} zoom :: (Time, Time) -> Pattern a -> Pattern a zoom (s,e) = zoomArc (Arc s e) @@ -373,10 +481,12 @@ zoomArc (Arc s e) p = splitQueries $ withResultArc (mapCycle ((/d) . subtract s)) $ withQueryArc (mapCycle ((+s) . (*d))) p where d = e-s --- | @fastGap@ is similar to 'fast' but maintains its cyclic --- alignment. For example, @fastGap 2 p@ would squash the events in --- pattern @p@ into the first half of each cycle (and the second --- halves would be empty). The factor should be at least 1 +{-| @fastGap@ is similar to 'fast' but maintains its cyclic alignment, i.e., + rather than playing the pattern multiple times, it instead leaves a gap in + the remaining space of the cycle. For example, @fastGap 2 p@ would squash the + events in pattern @p@ into the first half of each cycle (and the second halves + would be empty). The factor should be at least 1. +-} fastGap :: Pattern Time -> Pattern a -> Pattern a fastGap = tParam _fastGap @@ -384,6 +494,24 @@ fastGap = tParam _fastGap densityGap :: Pattern Time -> Pattern a -> Pattern a densityGap = fastGap +{-| + @compress@ takes a pattern and squeezes it within the specified time span (i.e. + the ‘arc’). The new resulting pattern is a sped up version of the original. + + > d1 $ compress (1/4, 3/4) $ s "[bd sn]!" + + In the above example, the pattern will play in an arc spanning from 25% to 75% + of the duration of a cycle. It is equivalent to: + + > d1 $ s "~ [bd sn]! ~" + + Another example, where all events are different: + + > d1 $ compress (1/4, 3/4) $ n (run 4) # s "arpy" + + It differs from 'zoom' in that it preserves the original pattern but it speeds + up its events so to match with the new time period. +-} compress :: (Time,Time) -> Pattern a -> Pattern a compress (s,e) = compressArc (Arc s e) @@ -403,8 +531,24 @@ fastRepeatCycles n p = cat (replicate n p) -- | Functions which work on other functions (higher order functions) --- | @every n f p@ applies the function @f@ to @p@, but only affects --- every @n@ cycles. +{- | @every n f p@ applies the function @f@ to @p@, but only affects + every @n@ cycles. + + It takes three inputs: how often the function should be applied (e.g. 3 to + apply it every 3 cycles), the function to be applied, and the pattern you are + applying it to. For example: to reverse a pattern every three cycles (and for + the other two play it normally) + + > d1 $ every 3 rev $ n "0 1 [~ 2] 3" # sound "arpy" + + Note that if the function you’re applying requires additional parameters + itself (such as fast 2 to make a pattern twice as fast), then you’ll need to + wrap it in parenthesis, like so: + + > d1 $ every 3 (fast 2) $ n "0 1 [~ 2] 3" # sound "arpy" + + Otherwise, the every function will think it is being passed too many parameters. +-} every :: Pattern Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a every tp f p = innerJoin $ (\t -> _every t f p) <$> tp @@ -412,30 +556,55 @@ _every :: Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a _every 0 _ p = p _every n f p = when ((== 0) . (`mod` n)) f p --- | @every n o f'@ is like @every n f@ with an offset of @o@ cycles +{-| @every' n o f p@ is like @every n f p@ but with an offset of @o@ cycles. + + For example, @every' 3 0 (fast 2)@ will speed up the cycle on cycles 0,3,6,… + whereas @every' 3 1 (fast 2)@ will transform the pattern on cycles 1,4,7,…. + + With this in mind, setting the second argument of @every'@ to 0 gives the + equivalent every function. For example, every 3 is equivalent to every' 3 0. + + The @every@ functions can be used to silence a full cycle or part of a cycle + by using silent or mask "~". Mask provides additional flexibility to turn on/off + individual steps. + + > d1 $ every 3 silent $ n "2 9 11 2" # s "hh27" + > d1 $ every 3 (mask "~") $ n "2 9 10 2" # s "hh27" + > d1 $ every 3 (mask "0 0 0 0") $ n "2 9 11 2" # s "hh27" +-} every' :: Pattern Int -> Pattern Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a every' np op f p = do { n <- np; o <- op; _every' n o f p } _every' :: Int -> Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a _every' n o = when ((== o) . (`mod` n)) --- | @foldEvery ns f p@ applies the function @f@ to @p@, and is applied for --- each cycle in @ns@. +{- | @foldEvery ns f p@ applies the function @f@ to @p@, and is applied for + each cycle in @ns@. + + It is similar to chaining multiple @every@ functions together. It transforms + a pattern with a function, once per any of the given number of cycles. If a + particular cycle is the start of more than one of the given cycle periods, then + it it applied more than once. + + > d1 $ foldEvery [5,3] (|+ n 1) $ s "moog" # legato 1 + + The first moog samples are tuned to C2, C3 and C4. Note how on cycles that are + multiples of 3 or 5 the pitch is an octave higher, and on multiples of 15 the + pitch is two octaves higher, as the transformation is applied twice. +-} foldEvery :: [Int] -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a foldEvery ns f p = foldr (`_every` f) p ns {-| -Only `when` the given test function returns `True` the given pattern -transformation is applied. The test function will be called with the -current cycle as a number. +The given pattern transformation is applied only @when@ the given test function +returns @True@. The test function will be called with the current cycle as +a number. -@ -d1 $ when ((elem '4').show) - (striate 4) - $ sound "hh hc" -@ +> d1 $ when (elem '4' . show) +> (striate 4) +> $ sound "hh hc" -The above will only apply `striate 4` to the pattern if the current +The above will only apply @striate 4@ to the pattern if the current cycle number contains the number 4. So the fourth cycle will be striated and the fourteenth and so on. Expect lots of striates after cycle number 399. @@ -445,7 +614,14 @@ when test f p = splitQueries $ p {query = apply} where apply st | test (floor $ start $ arc st) = query (f p) st | otherwise = query p st --- | Like 'when', but works on continuous time values rather than cycle numbers. +{- | Like 'when', but works on continuous time values rather than cycle numbers. + The following will apply @# speed 2@ only when the remainder of the current + @Time@ divided by 2 is less than 0.5: + + > d1 $ whenT ((< 0.5) . (flip Data.Fixed.mod' 2)) + > (# speed 2) + > $ sound "hh(4,8) hc(3,8)" +-} whenT :: (Time -> Bool) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a whenT test f p = splitQueries $ p {query = apply} where apply st | test (start $ arc st) = query (f p) st diff --git a/src/Sound/Tidal/Params.hs b/src/Sound/Tidal/Params.hs index cd229dbfd..ce443cfba 100644 --- a/src/Sound/Tidal/Params.hs +++ b/src/Sound/Tidal/Params.hs @@ -31,7 +31,7 @@ import Data.Maybe (fromMaybe) import Data.Word (Word8) import Data.Fixed (mod') --- | group multiple params into one +-- | Group multiple params into one. grp :: [String -> ValueMap] -> Pattern String -> ControlPattern grp [] _ = empty grp fs p = splitby <$> p @@ -50,7 +50,7 @@ mI name v = fromMaybe Map.empty $ do i <- readMaybe v mS :: String -> String -> ValueMap mS name v = Map.singleton name (VS v) --- | Param makers +-- * Param makers pF :: String -> Pattern Double -> ControlPattern pF name = fmap (Map.singleton name . VF) @@ -119,7 +119,7 @@ pStateListF name sName = pStateList name sName . map VF pStateListS :: String -> String -> [String] -> ControlPattern pStateListS name sName = pStateList name sName . map VS --- | Grouped params +-- * Grouped params sound :: Pattern String -> ControlPattern sound = grp [mS "s", mF "n"] @@ -139,6 +139,13 @@ nrpnn = pI "nrpn" nrpnv :: Pattern Int -> ControlPattern nrpnv = pI "val" +{-| @grain'@ is a shortcut to join a @begin@ and @end@ + + These are equivalent: + + > d1 $ slow 2 $ s "bev" # grain' "0.2:0.3" # legato 1 + > d1 $ slow 2 $ s "bev" # begin 0.2 # end 0.3 # legato 1 +-} grain' :: Pattern String -> ControlPattern grain' = grp [mF "begin", mF "end"] @@ -212,11 +219,23 @@ drumN "ms" = 86 drumN "os" = 87 drumN _ = 0 --- Generated params +-- * Generated params + +{- | A pattern of numbers that speed up (or slow down) samples while they play. --- | a pattern of numbers that speed up (or slow down) samples while they play. + In the following example, the sound starts at the original pitch and gets + higher as it plays: + + > d1 $ s "arpy" # accelerate 2 + + You can use a negative number to make the sound get lower. In this example, a + different acceleration is applied to each played note using state values: + + > d1 $ arp "up" $ note "c'maj'4" # s "arpy" # accelerateTake "susan" [0.2,1,-1] +-} accelerate :: Pattern Double -> ControlPattern accelerate = pF "accelerate" + accelerateTake :: String -> [Double] -> ControlPattern accelerateTake name xs = pStateListF "accelerate" name xs accelerateCount :: String -> ControlPattern @@ -227,7 +246,11 @@ accelerateCountTo name ipat = innerJoin $ (\i -> pStateF "accelerate" name (mayb acceleratebus :: Pattern Int -> Pattern Double -> ControlPattern acceleratebus _ _ = error $ "Control parameter 'accelerate' can't be sent to a bus." --- | like @gain@, but linear. +{-| Controls the amplitude (volume) of the sound. Like 'gain', but linear. + Default value is 0.4. + + > d1 $ s "arpy" # amp "<0.4 0.8 0.2>" +-} amp :: Pattern Double -> ControlPattern amp = pF "amp" ampTake :: String -> [Double] -> ControlPattern @@ -295,7 +318,16 @@ bandqbus busid pat = (pF "bandq" pat) # (pI "^bandq" busid) bandqrecv :: Pattern Int -> ControlPattern bandqrecv busid = pI "^bandq" busid --- | a pattern of numbers from 0 to 1. Skips the beginning of each sample, e.g. `0.25` to cut off the first quarter from each sample. +{- | @begin@ receives a pattern of numbers from 0 to 1 and skips the beginning +of each sample by the indicated proportion. I.e., 0 would play the sample from +the start, 1 would skip the whole sample, and 0.25 would cut off the first +quarter. + +In this example, the first 3 @ade@ samples are played on every cycle, but the +start point from which they are played changes on each cycle: + +> d1 $ n "0 1 2" # s "ade" # begin "<0 0.25 0.5 0.75>" # legato 1 +-} begin :: Pattern Double -> ControlPattern begin = pF "begin" beginTake :: String -> [Double] -> ControlPattern @@ -660,7 +692,13 @@ controlCountTo name ipat = innerJoin $ (\i -> pStateF "control" name (maybe 0 (( controlbus :: Pattern Int -> Pattern Double -> ControlPattern controlbus _ _ = error $ "Control parameter 'control' can't be sent to a bus." --- | +{-| A control pattern; 'setcps' is the standalone function. + + Patterns don’t (yet) have independent tempos though, if you change it on one + pattern, it changes on all of them. + + > p "cpsfun" $ s "bd sd(3,8)" # cps (slow 8 $ 0.5 + saw) +-} cps :: Pattern Double -> ControlPattern cps = pF "cps" cpsTake :: String -> [Double] -> ControlPattern @@ -913,7 +951,14 @@ durbus busid pat = (pF "dur" pat) # (pI "^dur" busid) durrecv :: Pattern Int -> ControlPattern durrecv busid = pI "^dur" busid --- | the same as `begin`, but cuts the end off samples, shortening them; e.g. `0.75` to cut off the last quarter of each sample. +{- | Similar to `begin`, but cuts the end off samples, shortening them; e.g. + 0.75 to cut off the last quarter of each sample. + + > d1 $ s "bev" >| begin 0.5 >| end "[0.65 0.55]" + + The example above will play the sample two times for cycle, but the second time + will play a shorter segment than the first time, creating a kind of canon effect. +-} end :: Pattern Double -> ControlPattern end = pF "end" endTake :: String -> [Double] -> ControlPattern @@ -1098,7 +1143,24 @@ fshiftphasebus busid pat = (pF "fshiftphase" pat) # (pI "^fshiftphase" busid) fshiftphaserecv :: Pattern Int -> ControlPattern fshiftphaserecv busid = pI "^fshiftphase" busid --- | a pattern of numbers that specify volume. Values less than 1 make the sound quieter. Values greater than 1 make the sound louder. For the linear equivalent, see @amp@. +{- | Used to control the amplitude (volume) of the sound. Values less than 1 +make the sound quieter and values greater than 1 make the sound louder. + +@gain@ uses a power function, so the volume change around 1 is subtle, but it +gets more noticeable as it increases or decreases. Typical values for @gain@ are +between 0 and 1.5. + +For the linear equivalent, see 'amp'. + +> d1 $ s "arpy" # gain 0.8 + +This plays the first arpy sample at a quieter level than the default. + +> d1 $ s "ab*16" # gain (range 0.8 1.3 $ sine) + +This plays a hihat sound, 16 times per cycle, with a @gain@ moving from 0.8 to 1.3 +following a sine wave. +-} gain :: Pattern Double -> ControlPattern gain = pF "gain" gainTake :: String -> [Double] -> ControlPattern @@ -1877,7 +1939,7 @@ ophatdecaybus busid pat = (pF "ophatdecay" pat) # (pI "^ophatdecay" busid) ophatdecayrecv :: Pattern Int -> ControlPattern ophatdecayrecv busid = pI "^ophatdecay" busid --- | a pattern of numbers. An `orbit` is a global parameter context for patterns. Patterns with the same orbit will share hardware output bus offset and global effects, e.g. reverb and delay. The maximum number of orbits is specified in the superdirt startup, numbers higher than maximum will wrap around. +-- | a pattern of numbers. An "orbit" is a global parameter context for patterns. Patterns with the same orbit will share hardware output bus offset and global effects, e.g. reverb and delay. The maximum number of orbits is specified in the superdirt startup, numbers higher than maximum will wrap around. orbit :: Pattern Int -> ControlPattern orbit = pI "orbit" orbitTake :: String -> [Double] -> ControlPattern @@ -2126,7 +2188,7 @@ progNumCountTo name ipat = innerJoin $ (\i -> pStateF "progNum" name (maybe 0 (( progNumbus :: Pattern Int -> Pattern Double -> ControlPattern progNumbus _ _ = error $ "Control parameter 'progNum' can't be sent to a bus." --- | used in SuperDirt softsynths as a control rate or 'speed' +-- | used in SuperDirt softsynths as a control rate or "speed" rate :: Pattern Double -> ControlPattern rate = pF "rate" rateTake :: String -> [Double] -> ControlPattern @@ -2662,7 +2724,20 @@ songPtrCountTo name ipat = innerJoin $ (\i -> pStateF "songPtr" name (maybe 0 (( songPtrbus :: Pattern Int -> Pattern Double -> ControlPattern songPtrbus _ _ = error $ "Control parameter 'songPtr' can't be sent to a bus." --- | a pattern of numbers which changes the speed of sample playback, i.e. a cheap way of changing pitch. Negative values will play the sample backwards! +{-| + A pattern of numbers which changes the speed of sample playback which also + changes pitch. Negative values will play the sample backwards. + + > d1 $ slow 5 $ s "sax:5" # legato 1 # speed 0.5 + + This will play the @sax:5@ sample at half its rate. As a result, the sample will + last twice the normal time, and will be pitched a whole octave lower. This is + equivalent to @d1 $ slow 5 $ s "sax:5" # legato 1 |- note 12@. + + > d1 $ fast 2 $ s "breaks125:1" # cps (125/60/4) # speed (-2) + + In the above example, the break (which lasts for exactly one bar at 125 BPM), will be played backwards, and at double speed (so, we use @fast 2@ to fill the whole cycle). +-} speed :: Pattern Double -> ControlPattern speed = pF "speed" speedTake :: String -> [Double] -> ControlPattern @@ -2735,7 +2810,22 @@ stuttertimebus busid pat = (pF "stuttertime" pat) # (pI "^stuttertime" busid) stuttertimerecv :: Pattern Int -> ControlPattern stuttertimerecv busid = pI "^stuttertime" busid --- | +{-| + A pattern of numbers that indicates the total duration of sample playback in seconds. + + This @sustain@ refers to the whole playback duration and is not to be confused with the sustain level of a typical ADSR envelope. + + > d1 $ fast 2 $ s "breaks125:1" # cps (120/60/4) # sustain 1 + + At 120 BPM, a cycle lasts for two seconds. In the above example, we cut the + sample so it plays just for one second, and repeat this part two times, so we + fill the whole cycle. Note that sample pitch isn’t modified. + + > d1 $ s "breaks125:2!3" # cps (120/60/4) # sustain "0.4 0.2 0.4" # begin "0 0 0.4" + + Here, we take advantage that sustain receives a pattern to build a different + break from the original sample. +-} sustain :: Pattern Double -> ControlPattern sustain = pF "sustain" sustainTake :: String -> [Double] -> ControlPattern @@ -2763,9 +2853,25 @@ sustainpedalbus busid pat = (pF "sustainpedal" pat) # (pI "^sustainpedal" busid) sustainpedalrecv :: Pattern Int -> ControlPattern sustainpedalrecv busid = pI "^sustainpedal" busid --- | time stretch amount +{- | + @timescale@ is the main function used to activate time-stretching, and usually + the only one you need. It receives a single parameter which is the stretching + rate to apply. + + You can use any positive number as the ratio, but the particular method used is + designed for ratios greater than 1, and work reasonably well for values between + 0.1 and 3. + + > d1 $ slow 2 $ s "breaks152" # legato 1 # timescale (152/130) # cps (130/60/4) + + In the example above, we set tempo at 130 beats per minute. But we want to play + one of the @breaks152@ samples, which are, as indicated, at 152 BPM. So, the + ratio we want is 152 over 130. This will slow down the sample to fit in our 130 + BPM tempo. +-} timescale :: Pattern Double -> ControlPattern timescale = pF "timescale" + timescaleTake :: String -> [Double] -> ControlPattern timescaleTake name xs = pStateListF "timescale" name xs timescaleCount :: String -> ControlPattern @@ -2776,9 +2882,39 @@ timescaleCountTo name ipat = innerJoin $ (\i -> pStateF "timescale" name (maybe timescalebus :: Pattern Int -> Pattern Double -> ControlPattern timescalebus _ _ = error $ "Control parameter 'timescale' can't be sent to a bus." --- | time stretch window size +{- | Time stretch window size. + +The algorithm used to time-stretch a sample divides a sample in many little parts, modifies them, and puts them all together again. It uses one particular parameter, called @windowSize@, which is the length of each sample part. + +The @windowSize@ value is automatically calculated, but can be changed with @timescalewin@. The @windowSize@ value is multiplied by the number provided. + +@timescalewin@ can be used to improve the quality of time-stretching for some samples, or simply as an effect. + +Consider the following two examples. In the first one, @timescalewin 0.01@ makes +the window size a lot smaller, and the extreme chopping of the sample causes +a rougher sound. In the second one, @timescalewin 10@ makes the chunks a lot +bigger. The method used overlaps the treated chunks when recomposing the sample, +and, with the bigger window size, this overlap is noticeable and causes a kind +of delay effect. + +> d1 $ slow 2 +> $ s "breaks152" +> # legato 1 +> # timescale (152/130) +> # timescalewin 0.01 +> # cps (130/60/4) + +> d1 $ slow 2 +> $ s "breaks152" +> # legato 1 +> # timescale (152/130) +> # timescalewin 10 +> # cps (130/60/4) + +-} timescalewin :: Pattern Double -> ControlPattern timescalewin = pF "timescalewin" + timescalewinTake :: String -> [Double] -> ControlPattern timescalewinTake name xs = pStateListF "timescalewin" name xs timescalewinCount :: String -> ControlPattern @@ -2902,7 +3038,21 @@ uidCountTo name ipat = innerJoin $ (\i -> pStateF "uid" name (maybe 0 ((`mod'` i uidbus :: Pattern Int -> Pattern Double -> ControlPattern uidbus _ _ = error $ "Control parameter 'uid' can't be sent to a bus." --- | used in conjunction with `speed`, accepts values of "r" (rate, default behavior), "c" (cycles), or "s" (seconds). Using `unit "c"` means `speed` will be interpreted in units of cycles, e.g. `speed "1"` means samples will be stretched to fill a cycle. Using `unit "s"` means the playback speed will be adjusted so that the duration is the number of seconds specified by `speed`. +{- | + Used in conjunction with `speed`. It accepts values of @r@ (rate, default + behavior), @c@ (cycles), or @s@ (seconds). Using @unit "c"@ means `speed` + will be interpreted in units of cycles, e.g. @speed "1"@ means samples will be + stretched to fill a cycle. Using @unit "s"@ means the playback speed will be + adjusted so that the duration is the number of seconds specified by `speed`. + + In the following example, @speed 2@ means that samples will be stretched to fill + half a cycle: + + > d1 $ stack [ + > s "sax:5" # legato 1 # speed 2 # unit "c", + > s "bd*2" + > ] +-} unit :: Pattern String -> ControlPattern unit = pS "unit" unitTake :: String -> [Double] -> ControlPattern @@ -3025,7 +3175,7 @@ xsdelayrecv busid = pI "^xsdelay" busid --- aliases +-- * Aliases voi :: Pattern Double -> ControlPattern voi = voice diff --git a/src/Sound/Tidal/Pattern.hs b/src/Sound/Tidal/Pattern.hs index 60b6374ae..8fc13c4fc 100644 --- a/src/Sound/Tidal/Pattern.hs +++ b/src/Sound/Tidal/Pattern.hs @@ -74,40 +74,40 @@ instance Applicative Pattern where v) $ cycleArcsInArc a - -- | In each of `a <*> b`, `a <* b` and `a *> b` + -- | In each of @a <*> b@, @a <* b@ and @a *> b@ -- (using the definitions from this module, not the Prelude), -- the time structure of the result - -- depends on the structures of both `a` and `b`. - -- They all result in `Event`s with identical `part`s and `value`s. - -- However, their `whole`s are different. + -- depends on the structures of both @a@ and @b@. + -- They all result in @Event@s with identical @part@s and @value@s. + -- However, their @whole@s are different. -- - -- For instance, `listToPat [(+1), (+2)] <*> "0 10 100"` - -- gives the following 4-`Event` cycle: + -- For instance, @listToPat [(+1), (+2)] <*> "0 10 100"@ + -- gives the following 4-@Event@ cycle: -- > (0>⅓)|1 -- > (⅓>½)|11 -- > (½>⅔)|12 -- > (⅔>1)|102 - -- If we use `<*` instead, we get this: + -- If we use @<*@ instead, we get this: -- > (0>⅓)-½|1 -- > 0-(⅓>½)|11 -- > (½>⅔)-1|12 -- > ½-(⅔>1)|102 - -- And if we use `*>`, we get this: + -- And if we use @*>@, we get this: -- > (0>⅓)|1 -- > (⅓>½)-⅔|11 -- > ⅓-(½>⅔)|12 -- > (⅔>1)|102 (<*>) = applyPatToPatBoth --- | Like <*>, but the 'wholes' come from the left +-- | Like @<*>@, but the "wholes" come from the left (<*) :: Pattern (a -> b) -> Pattern a -> Pattern b (<*) = applyPatToPatLeft --- | Like <*>, but the 'wholes' come from the right +-- | Like @<*>@, but the "wholes" come from the right (*>) :: Pattern (a -> b) -> Pattern a -> Pattern b (*>) = applyPatToPatRight --- | Like <*>, but the 'wholes' come from the left +-- | Like @<*>@, but the "wholes" come from the left (<<*) :: Pattern (a -> b) -> Pattern a -> Pattern b (<<*) = applyPatToPatSqueeze @@ -162,9 +162,11 @@ applyPatToPatSqueeze :: Pattern (a -> b) -> Pattern a -> Pattern b applyPatToPatSqueeze pf px = squeezeJoin $ (\f -> f <$> px) <$> pf -- * Monad and friends - +-- +-- $monadAndFriends +-- -- Note there are four ways of joining - the default 'unwrap' used by @>>=@, as well --- as innerJoin, innerJoin and squeezeJoin. +-- as @innerJoin@, @innerJoin@ and @squeezeJoin@. instance Monad Pattern where return = pure @@ -504,12 +506,56 @@ focusArc :: Arc -> Pattern a -> Pattern a focusArc (Arc s e) p = (cyclePos s) `rotR` (_fast (1/(e-s)) p) --- | Speed up a pattern by the given time pattern +{-| Speed up a pattern by the given time pattern. + +For example, the following will play the sound pattern @"bd sn kurt"@ twice as +fast (i.e., so it repeats twice per cycle), and the vowel pattern three times +as fast: + +> d1 $ sound (fast 2 "bd sn kurt") +> # fast 3 (vowel "a e o") + +The first parameter can be patterned to, for example, play the pattern at twice +the speed for the first half of each cycle and then four times the speed for the +second half: + +> d1 $ fast "2 4" $ sound "bd sn kurt cp" +-} fast :: Pattern Time -> Pattern a -> Pattern a fast = tParam _fast --- | Slow down a pattern by the factors in the given time pattern, 'squeezing' --- the pattern to fit the slot given in the time pattern +{-| @fastSqueeze@ speeds up a pattern by a time pattern given as input, + squeezing the resulting pattern inside one cycle and playing the original + pattern at every repetition. + + To better understand how it works, compare it with 'fast': + + >>> print $ fast "1 2" $ s "bd sn" + (0>½)|s: "bd" + (½>¾)|s: "bd" + (¾>1)|s: "sn" + + This will give @bd@ played in the first half cycle, and @bd sn@ in the second + half. On the other hand, using fastSqueeze; + + >>> print $ fastSqueeze "1 2" $ s "bd sn" + (0>¼)|s: "bd" + (¼>½)|s: "sn" + (½>⅝)|s: "bd" + (⅝>¾)|s: "sn" + (¾>⅞)|s: "bd" + (⅞>1)|s: "sn" + + The original pattern will play in the first half, and two repetitions of the + original pattern will play in the second half. That is, every repetition + contains the whole pattern. + + If the time pattern has a single value, it becomes equivalent to 'fast': + + > d1 $ fastSqueeze 2 $ s "bd sn" + > d1 $ fast 2 $ s "bd sn" + > d1 $ s "[bd sn]*2" +-} fastSqueeze :: Pattern Time -> Pattern a -> Pattern a fastSqueeze = tParamSqueeze _fast @@ -522,7 +568,15 @@ _fast rate pat | rate == 0 = silence | rate < 0 = rev $ _fast (negate rate) pat | otherwise = withResultTime (/ rate) $ withQueryTime (* rate) pat --- | Slow down a pattern by the given time pattern +{-| Slow down a pattern by the given time pattern. + + For example, the following will play the sound pattern @"bd sn kurt"@ twice as + slow (i.e., so it repeats once every two cycles), and the vowel pattern three + times as slow: + + > d1 $ sound (slow 2 "bd sn kurt") + > # slow 3 (vowel "a e o") +-} slow :: Pattern Time -> Pattern a -> Pattern a slow = tParam _slow _slow :: Time -> Pattern a -> Pattern a @@ -542,16 +596,47 @@ _fastGap r p = splitQueries $ where mungeQuery t = sam t + min 1 (r' * cyclePos t) a' = (\(Arc s e) -> Arc (mungeQuery s) (mungeQuery e)) a --- | Shifts a pattern back in time by the given amount, expressed in cycles +{-| Shifts a pattern back in time by the given amount, expressed in cycles. + + This will skip to the fourth cycle: + + > do + > resetCycles + > d1 $ rotL 4 $ seqP + > [ (0, 12, sound "bd bd*2") + > , (4, 12, sound "hh*2 [sn cp] cp future*4") + > , (8, 12, sound (samples "arpy*8" (run 16))) + > ] + + Useful when building and testing out longer sequences. +-} rotL :: Time -> Pattern a -> Pattern a rotL t p = withResultTime (subtract t) $ withQueryTime (+ t) p --- | Shifts a pattern forward in time by the given amount, expressed in cycles +{-| Shifts a pattern forward in time by the given amount, expressed in cycles. + Opposite of 'rotL'. +-} rotR :: Time -> Pattern a -> Pattern a rotR t = rotL (negate t) --- | @rev p@ returns @p@ with the event positions in each cycle --- reversed (or mirrored). +{- | @rev p@ returns @p@ with the event positions in each cycle reversed (or + mirrored). + + For example rev @"1 [~ 2] ~ 3"@ is equivalent to rev @"3 ~ [2 ~] 1"@. + + Note that @rev@ reverses on a cycle-by-cycle basis. This means that @rev (slow + 2 "1 2 3 4")@ would actually result in @(slow 2 "2 1 4 3")@. This is because the + @slow 2@ makes the repeating pattern last two cycles, each of which is reversed + independently. + + In practice rev is generally used with conditionals, for example with every: + + > d1 $ every 3 rev $ n "0 1 [~ 2] 3" # sound "arpy" + + or 'jux': + + > d1 $ jux rev $ n (iter 4 "0 1 [~ 2] 3") # sound "arpy" +-} rev :: Pattern a -> Pattern a rev p = splitQueries $ p { diff --git a/src/Sound/Tidal/Safe/Boot.hs b/src/Sound/Tidal/Safe/Boot.hs index 7350eaed5..b9a33bed0 100644 --- a/src/Sound/Tidal/Safe/Boot.hs +++ b/src/Sound/Tidal/Safe/Boot.hs @@ -42,8 +42,50 @@ first = streamFirst asap = once nudgeAll = streamNudgeAll all = streamAll + +{-| + Resets the cycle count back to 0. + Useful to make sure a pattern or set of patterns start from the beginning: + + > do + > resetCycles + > d1 $ s "bd hh hh hh" + > d2 $ s "ade" # cut 1 + + Cycle count affects all patterns, so if there are any active, all of them will immediately jump to the beginning. + @resetCycles@ is also userful in multi-user Tidal. + + Also see 'setCycle', 'getnow'. +-} resetCycles = streamResetCycles + +{-| + Adjusts the number of cycles per second, i.e., tempo. + Accepts integers, decimals, and fractions. + + The default number of cycles per second is 0.5625, equivalent to 135\/60\/4, i.e., + 135 beats per minute if there are 4 beats per cycle. + + Representing cycles per second using fractions has the advantage of being more + human-readable and more closely aligned with how tempo is commonly represented + in music as beats per minute (bpm). For example, techno has a typical range of + 120-140 bpm and house has a range of 115-130 bpm. To set the tempo in Tidal to + fast house, e.g.,: @setcps (130\/60\/4)@. + + The following sound the same: + + > setcps (130/60/4) + > d1 $ n "1" # s "kick kick kick kick" + + and + + > setcps (130/60/1) + > d1 $ n "1" # s "kick" +-} setcps = asap . cps + +-- * Transitions + xfade i = transition True (Sound.Tidal.Transition.xfadeIn 4) i xfadeIn i t = transition True (Sound.Tidal.Transition.xfadeIn t) i histpan i t = transition True (Sound.Tidal.Transition.histpan t) i diff --git a/src/Sound/Tidal/Safe/Context.hs b/src/Sound/Tidal/Safe/Context.hs index 941a105af..afb3754dd 100644 --- a/src/Sound/Tidal/Safe/Context.hs +++ b/src/Sound/Tidal/Safe/Context.hs @@ -53,7 +53,7 @@ module Sound.Tidal.Safe.Context where import Data.Ratio as C -import Sound.Tidal.Config as C +import Sound.Tidal.Stream.Config as C import Sound.Tidal.Control as C import Sound.Tidal.Core as C import Sound.Tidal.Params as C @@ -61,8 +61,9 @@ import Sound.Tidal.ParseBP as C import Sound.Tidal.Pattern as C import Sound.Tidal.Scales as C import Sound.Tidal.Simple as C -import Sound.Tidal.Stream - (startTidal, superdirtTarget, Target(..)) +import Sound.Tidal.Stream.Target (superdirtTarget) +import Sound.Tidal.Stream.Types (Target(..)) +import Sound.Tidal.Stream.Main (startTidal) -- import Sound.Tidal.Transition as C import Sound.Tidal.UI as C import Sound.Tidal.Version as C @@ -79,7 +80,7 @@ exec :: Stream -> Op r -> IO r exec stream (Op m) = runReaderT m stream op1 f = Op $ do a <- ask; lift $ f a -op2 f b = Op $ do a <- ask; lift $ f a b +op2 f b = Op $ do a <- ask; lift $ f a b op3 f b c = Op $ do a <- ask; lift $ f a b c op4 f b c d = Op $ do a <- ask; lift $ f a b c d op5 f b c d e = Op $ do a <- ask; lift $ f a b c d e diff --git a/src/Sound/Tidal/Scales.hs b/src/Sound/Tidal/Scales.hs index 77c2d3922..4c2538152 100644 --- a/src/Sound/Tidal/Scales.hs +++ b/src/Sound/Tidal/Scales.hs @@ -23,21 +23,24 @@ import Data.Maybe import Sound.Tidal.Pattern import Sound.Tidal.Utils --- five notes scales +-- * Scale definitions + +-- ** Five notes scales minPent :: Fractional a => [a] minPent = [0,3,5,7,10] majPent :: Fractional a => [a] majPent = [0,2,4,7,9] --- another mode of major pentatonic +-- | Another mode of major pentatonic ritusen :: Fractional a => [a] ritusen = [0,2,5,7,9] --- another mode of major pentatonic +-- | Another mode of major pentatonic egyptian :: Fractional a => [a] egyptian = [0,2,5,7,10] --- +-- *** Other scales + kumai :: Fractional a => [a] kumai = [0,2,3,7,9] hirajoshi :: Fractional a => [a] @@ -51,13 +54,14 @@ indian = [0,4,5,7,10] pelog :: Fractional a => [a] pelog = [0,1,3,7,8] --- +-- *** More scales + prometheus :: Fractional a => [a] prometheus = [0,2,4,6,11] scriabin :: Fractional a => [a] scriabin = [0,1,4,7,9] --- han chinese pentatonic scales +-- *** Han Chinese pentatonic scales gong :: Fractional a => [a] gong = [0,2,4,7,9] shang :: Fractional a => [a] @@ -69,7 +73,7 @@ zhi = [0,2,5,7,9] yu :: Fractional a => [a] yu = [0,3,5,7,10] --- 6 note scales +-- ** 6 note scales whole' :: Fractional a => [a] whole' = [0,2,4,6,8,10] augmented :: Fractional a => [a] @@ -77,7 +81,7 @@ augmented = [0,3,4,7,8,11] augmented2 :: Fractional a => [a] augmented2 = [0,1,4,5,8,9] --- hexatonic modes with no tritone +-- *** Hexatonic modes with no tritone hexMajor7 :: Fractional a => [a] hexMajor7 = [0,2,4,7,9,11] hexDorian :: Fractional a => [a] @@ -91,7 +95,7 @@ hexMajor6 = [0,2,4,5,7,9] hexAeolian :: Fractional a => [a] hexAeolian = [0,3,5,7,8,10] --- 7 note scales +-- ** 7 note scales major :: Fractional a => [a] major = [0,2,4,5,7,9,11] ionian :: Fractional a => [a] @@ -125,7 +129,7 @@ bartok = melodicMajor hindu :: Fractional a => [a] hindu = melodicMajor --- raga modes +-- *** Raga modes todi :: Fractional a => [a] todi = [0,1,3,6,7,8,11] purvi :: Fractional a => [a] @@ -137,7 +141,7 @@ bhairav = [0,1,4,5,7,8,11] ahirbhairav :: Fractional a => [a] ahirbhairav = [0,1,4,5,7,9,10] --- +-- *** More modes superLocrian :: Fractional a => [a] superLocrian = [0,1,3,4,6,8,10] romanianMinor :: Fractional a => [a] @@ -151,7 +155,7 @@ enigmatic = [0,1,4,6,8,10,11] spanish :: Fractional a => [a] spanish = [0,1,4,5,7,8,10] --- modes of whole tones with added note -> +-- *** Modes of whole tones with added note -> leadingWhole :: Fractional a => [a] leadingWhole = [0,2,4,6,8,10,11] lydianMinor :: Fractional a => [a] @@ -161,13 +165,13 @@ neapolitanMajor = [0,1,3,5,7,9,11] locrianMajor :: Fractional a => [a] locrianMajor = [0,2,4,5,6,8,10] --- 8 note scales +-- ** 8 note scales diminished :: Fractional a => [a] diminished = [0,1,3,4,6,7,9,10] diminished2 :: Fractional a => [a] diminished2 = [0,2,3,5,6,8,9,11] --- modes of limited transposition +-- ** Modes of limited transposition messiaen1 :: Fractional a => [a] messiaen1 = whole' messiaen2 :: Fractional a => [a] @@ -183,7 +187,7 @@ messiaen6 = [0, 2, 4, 5, 6, 8, 10, 11] messiaen7 :: Fractional a => [a] messiaen7 = [0, 1, 2, 3, 5, 6, 7, 8, 9, 11] --- Arabic maqams taken from SuperCollider's Scale.sc +-- ** Arabic maqams taken from SuperCollider's Scale.sc bayati :: Fractional a => [a] bayati = [0, 1.5, 3, 5, 7, 8, 10] hijaz :: Fractional a => [a] @@ -197,22 +201,81 @@ iraq = [0, 1.5, 3.5, 5, 6.5, 8.5, 10.5] saba :: Fractional a => [a] saba = [0, 1.5, 3, 4, 6, 8, 10] --- 12 note scales +-- ** 12 note scales chromatic :: Fractional a => [a] chromatic = [0,1,2,3,4,5,6,7,8,9,10,11] +{-| + Interprets a pattern of note numbers into a particular named scale. For example: + + > d1 + > $ jux rev + > $ chunk 4 (fast 2 . (|- n 12)) + > $ off 0.25 (|+ 7) + > $ struct (iter 4 "t(5,8)") + > $ n (scale "ritusen" "0 .. 7") + > # sound "superpiano" +-} scale :: Fractional a => Pattern String -> Pattern Int -> Pattern a scale = getScale scaleTable +{-| + Build a scale function, with additional scales if you wish. For example: + + > let myscale = + > getScale + > ( scaleTable ++ + > [ ("techno", [0,2,3,5,7,8,10]) + > , ("broken", [0,1,4,7,8,10]) + > ] + > ) + + The above takes the standard 'scaleTable' as a starting point and adds two custom scales to it. You’ll be able to use the new function in place of the normal one: + + > d1 $ n (myscale "techno" "0 1 2 3 4 5 6 7") # sound "superpiano" +-} getScale :: Fractional a => [(String, [a])] -> Pattern String -> Pattern Int -> Pattern a getScale table sp p = (\n scaleName -> noteInScale (fromMaybe [0] $ lookup scaleName table) n) <$> p <* sp where octave s x = x `div` length s noteInScale s x = (s !!! x) + fromIntegral (12 * octave s x) +{-| + Outputs this list of all the available scales: + +@ +minPent majPent ritusen egyptian kumai hirajoshi iwato chinese indian pelog +prometheus scriabin gong shang jiao zhi yu whole wholetone augmented augmented2 +hexMajor7 hexDorian hexPhrygian hexSus hexMajor6 hexAeolian major ionian dorian +phrygian lydian mixolydian aeolian minor locrian harmonicMinor harmonicMajor +melodicMinor melodicMinorDesc melodicMajor bartok hindu todi purvi marva bhairav +ahirbhairav superLocrian romanianMinor hungarianMinor neapolitanMinor enigmatic +spanish leadingWhole lydianMinor neapolitanMajor locrianMajor diminished +octatonic diminished2 octatonic2 messiaen1 messiaen2 messiaen3 messiaen4 +messiaen5 messiaen6 messiaen7 chromatic bayati hijaz sikah rast saba iraq +@ +-} scaleList :: String scaleList = unwords $ map fst (scaleTable :: [(String, [Rational])]) +{-| + Outputs a list of all available scales and their corresponding notes. For + example, its first entry is @("minPent",[0,3,5,7,10]@) which means that + a minor pentatonic scale is formed by the root (0), the minor third (3 semitones + above the root), the perfect fourth (5 semitones above the root), etc. + + As the list is big, you can use the Haskell function lookup to look up a + specific scale: @lookup "phrygian" scaleTable@. This will output + @Just [0.0,1.0,3.0,5.0,7.0,8.0,10.0]@. + + You can also do a reverse lookup into the scale table. For example: + + > filter ( \(_, x) -> take 3 x == [0,2,4] ) scaleTable + + The above example will output all scales of which the first three notes are + the root, the major second (2 semitones above the fundamental), and the major + third (4 semitones above the root). +-} scaleTable :: Fractional a => [(String, [a])] scaleTable = [("minPent", minPent), ("majPent", majPent), diff --git a/src/Sound/Tidal/Stream.hs b/src/Sound/Tidal/Stream.hs index ebe81ba37..318951cf0 100644 --- a/src/Sound/Tidal/Stream.hs +++ b/src/Sound/Tidal/Stream.hs @@ -1,11 +1,23 @@ -{-# LANGUAGE ConstraintKinds, GeneralizedNewtypeDeriving, FlexibleContexts, ScopedTypeVariables, BangPatterns #-} -{-# OPTIONS_GHC -fno-warn-missing-fields #-} -{-# language DeriveGeneric, StandaloneDeriving #-} - -module Sound.Tidal.Stream (module Sound.Tidal.Stream) where +module Sound.Tidal.Stream + (module Sound.Tidal.Stream.Config + ,module Sound.Tidal.Stream.Types + ,module Sound.Tidal.Stream.Process + ,module Sound.Tidal.Stream.Target + ,module Sound.Tidal.Stream.UI + ,module Sound.Tidal.Stream.Listen + ,module Sound.Tidal.Stream.Main + ) where + +import Sound.Tidal.Stream.Config +import Sound.Tidal.Stream.Types +import Sound.Tidal.Stream.Process +import Sound.Tidal.Stream.Target +import Sound.Tidal.Stream.UI +import Sound.Tidal.Stream.Listen +import Sound.Tidal.Stream.Main {- - Stream.hs - Tidal's thingie for turning patterns into OSC streams + Stream.hs - re-exports of all stream modules Copyright (C) 2020, Alex McLean and contributors This library is free software: you can redistribute it and/or modify @@ -21,745 +33,3 @@ module Sound.Tidal.Stream (module Sound.Tidal.Stream) where You should have received a copy of the GNU General Public License along with this library. If not, see . -} - -import Control.Applicative ((<|>)) -import Control.Concurrent.MVar -import Control.Concurrent -import Control.Monad (forM_, when) -import Data.Coerce (coerce) -import qualified Data.Map.Strict as Map -import Data.Maybe (fromJust, fromMaybe, catMaybes, isJust) -import qualified Control.Exception as E -import Foreign -import Foreign.C.Types -import System.IO (hPutStrLn, stderr) - -import qualified Sound.Osc.Fd as O -import qualified Sound.Osc.Time.Timeout as O -import qualified Network.Socket as N - -import Sound.Tidal.Config -import Sound.Tidal.Core (stack, (#)) -import Sound.Tidal.ID -import qualified Sound.Tidal.Link as Link -import Sound.Tidal.Params (pS) -import Sound.Tidal.Pattern -import qualified Sound.Tidal.Tempo as T -import Sound.Tidal.Utils ((!!!)) -import Data.List (sortOn) -import System.Random (getStdRandom, randomR) -import Sound.Tidal.Show () - -import Sound.Tidal.Version - -import Sound.Tidal.StreamTypes as Sound.Tidal.Stream - -data Stream = Stream {sConfig :: Config, - sStateMV :: MVar ValueMap, - -- sOutput :: MVar ControlPattern, - sLink :: Link.AbletonLink, - sListen :: Maybe O.Udp, - sPMapMV :: MVar PlayMap, - sActionsMV :: MVar [T.TempoAction], - sGlobalFMV :: MVar (ControlPattern -> ControlPattern), - sCxs :: [Cx] - } - -data Cx = Cx {cxTarget :: Target, - cxUDP :: O.Udp, - cxOSCs :: [OSC], - cxAddr :: N.AddrInfo, - cxBusAddr :: Maybe N.AddrInfo, - cxBusses :: Maybe (MVar [Int]) - } - -data StampStyle = BundleStamp - | MessageStamp - deriving (Eq, Show) - -data Schedule = Pre StampStyle - | Live - deriving (Eq, Show) - -data Target = Target {oName :: String, - oAddress :: String, - oPort :: Int, - oBusPort :: Maybe Int, - oLatency :: Double, - oWindow :: Maybe Arc, - oSchedule :: Schedule, - oHandshake :: Bool - } - deriving Show - -data Args = Named {requiredArgs :: [String]} - | ArgList [(String, Maybe Value)] - deriving Show - -data OSC = OSC {path :: String, - args :: Args - } - | OSCContext {path :: String} - deriving Show - -data ProcessedEvent = - ProcessedEvent { - peHasOnset :: Bool, - peEvent :: Event ValueMap, - peCps :: Link.BPM, - peDelta :: Link.Micros, - peCycle :: Time, - peOnWholeOrPart :: Link.Micros, - peOnWholeOrPartOsc :: O.Time, - peOnPart :: Link.Micros, - peOnPartOsc :: O.Time - } - -sDefault :: String -> Maybe Value -sDefault x = Just $ VS x -fDefault :: Double -> Maybe Value -fDefault x = Just $ VF x -rDefault :: Rational -> Maybe Value -rDefault x = Just $ VR x -iDefault :: Int -> Maybe Value -iDefault x = Just $ VI x -bDefault :: Bool -> Maybe Value -bDefault x = Just $ VB x -xDefault :: [Word8] -> Maybe Value -xDefault x = Just $ VX x - -required :: Maybe Value -required = Nothing - -superdirtTarget :: Target -superdirtTarget = Target {oName = "SuperDirt", - oAddress = "127.0.0.1", - oPort = 57120, - oBusPort = Just 57110, - oLatency = 0.2, - oWindow = Nothing, - oSchedule = Pre BundleStamp, - oHandshake = True - } - -superdirtShape :: OSC -superdirtShape = OSC "/dirt/play" $ Named {requiredArgs = ["s"]} - -dirtTarget :: Target -dirtTarget = Target {oName = "Dirt", - oAddress = "127.0.0.1", - oPort = 7771, - oBusPort = Nothing, - oLatency = 0.02, - oWindow = Nothing, - oSchedule = Pre MessageStamp, - oHandshake = False - } - -dirtShape :: OSC -dirtShape = OSC "/play" $ ArgList [("cps", fDefault 0), - ("s", required), - ("offset", fDefault 0), - ("begin", fDefault 0), - ("end", fDefault 1), - ("speed", fDefault 1), - ("pan", fDefault 0.5), - ("velocity", fDefault 0.5), - ("vowel", sDefault ""), - ("cutoff", fDefault 0), - ("resonance", fDefault 0), - ("accelerate", fDefault 0), - ("shape", fDefault 0), - ("kriole", iDefault 0), - ("gain", fDefault 1), - ("cut", iDefault 0), - ("delay", fDefault 0), - ("delaytime", fDefault (-1)), - ("delayfeedback", fDefault (-1)), - ("crush", fDefault 0), - ("coarse", iDefault 0), - ("hcutoff", fDefault 0), - ("hresonance", fDefault 0), - ("bandf", fDefault 0), - ("bandq", fDefault 0), - ("unit", sDefault "rate"), - ("loop", fDefault 0), - ("n", fDefault 0), - ("attack", fDefault (-1)), - ("hold", fDefault 0), - ("release", fDefault (-1)), - ("orbit", iDefault 0) -- , - -- ("id", iDefault 0) - ] - -defaultCps :: O.Time -defaultCps = 0.5625 - --- Start an instance of Tidal --- Spawns a thread within Tempo that acts as the clock --- Spawns a thread that listens to and acts on OSC control messages -startStream :: Config -> [(Target, [OSC])] -> IO Stream -startStream config oscmap - = do sMapMV <- newMVar Map.empty - pMapMV <- newMVar Map.empty - globalFMV <- newMVar id - actionsMV <- newEmptyMVar - - tidal_status_string >>= verbose config - verbose config $ "Listening for external controls on " ++ cCtrlAddr config ++ ":" ++ show (cCtrlPort config) - listen <- openListener config - - cxs <- mapM (\(target, os) -> do remote_addr <- resolve (oAddress target) (oPort target) - remote_bus_addr <- sequence (resolve (oAddress target) <$> (oBusPort target)) - remote_busses <- sequence (oBusPort target >> (Just $ newMVar [])) - let broadcast = if cCtrlBroadcast config then 1 else 0 - u <- O.udp_socket (\sock sockaddr -> do N.setSocketOption sock N.Broadcast broadcast - -- N.connect sock sockaddr - ) (oAddress target) (oPort target) - let cx = Cx {cxUDP = u, cxAddr = remote_addr, cxBusAddr = remote_bus_addr, cxBusses = remote_busses, cxTarget = target, cxOSCs = os} - _ <- forkIO $ handshake cx config - return cx - ) oscmap - let bpm = (coerce defaultCps) * 60 * (cBeatsPerCycle config) - abletonLink <- Link.create bpm - let stream = Stream {sConfig = config, - sStateMV = sMapMV, - sLink = abletonLink, - sListen = listen, - sPMapMV = pMapMV, - sActionsMV = actionsMV, - sGlobalFMV = globalFMV, - sCxs = cxs - } - let ac = T.ActionHandler { - T.onTick = onTick stream, - T.onSingleTick = onSingleTick stream, - T.updatePattern = updatePattern stream - } - -- Spawn a thread that acts as the clock - _ <- T.clocked config sMapMV pMapMV actionsMV ac abletonLink - -- Spawn a thread to handle OSC control messages - _ <- forkIO $ ctrlResponder config stream - return stream - -handshake :: Cx -> Config -> IO () -handshake Cx { cxUDP = udp, cxBusses = Just bussesMV, cxAddr = addr } c = sendHandshake >> listen 0 - where - sendHandshake :: IO () - sendHandshake = O.sendTo udp (O.Packet_Message $ O.Message "/dirt/handshake" []) (N.addrAddress addr) - listen :: Int -> IO () - listen waits = do ms <- recvMessagesTimeout 2 udp - if (null ms) - then do checkHandshake waits -- there was a timeout, check handshake - listen (waits+1) - else do mapM_ respond ms - listen 0 - checkHandshake :: Int -> IO () - checkHandshake waits = do busses <- readMVar bussesMV - when (null busses) $ do when (waits == 0) $ verbose c $ "Waiting for SuperDirt (v.1.7.2 or higher).." - sendHandshake - respond :: O.Message -> IO () - respond (O.Message "/dirt/hello" _) = sendHandshake - respond (O.Message "/dirt/handshake/reply" xs) = do prev <- swapMVar bussesMV $ bufferIndices xs - -- Only report the first time.. - when (null prev) $ verbose c $ "Connected to SuperDirt." - return () - respond _ = return () - bufferIndices :: [O.Datum] -> [Int] - bufferIndices [] = [] - bufferIndices (x:xs') | x == (O.AsciiString $ O.ascii "&controlBusIndices") = catMaybes $ takeWhile isJust $ map O.datum_integral xs' - | otherwise = bufferIndices xs' -handshake _ _ = return () - -sendO :: Bool -> Cx -> O.Message -> IO () -sendO isBusMsg cx msg = O.sendTo (cxUDP cx) (O.Packet_Message msg) (N.addrAddress addr) - where addr | isBusMsg && isJust (cxBusAddr cx) = fromJust $ cxBusAddr cx - | otherwise = cxAddr cx - -sendBndl :: Bool -> Cx -> O.Bundle -> IO () -sendBndl isBusMsg cx bndl = O.sendTo (cxUDP cx) (O.Packet_Bundle bndl) (N.addrAddress addr) - where addr | isBusMsg && isJust (cxBusAddr cx) = fromJust $ cxBusAddr cx - | otherwise = cxAddr cx - -resolve :: String -> Int -> IO N.AddrInfo -resolve host port = do let hints = N.defaultHints { N.addrSocketType = N.Stream } - addr:_ <- N.getAddrInfo (Just hints) (Just host) (Just $ show port) - return addr - --- Start an instance of Tidal with superdirt OSC -startTidal :: Target -> Config -> IO Stream -startTidal target config = startStream config [(target, [superdirtShape])] - -startMulti :: [Target] -> Config -> IO () -startMulti _ _ = hPutStrLn stderr $ "startMulti has been removed, please check the latest documentation on tidalcycles.org" - -toDatum :: Value -> O.Datum -toDatum (VF x) = O.float x -toDatum (VN x) = O.float x -toDatum (VI x) = O.int32 x -toDatum (VS x) = O.string x -toDatum (VR x) = O.float $ ((fromRational x) :: Double) -toDatum (VB True) = O.int32 (1 :: Int) -toDatum (VB False) = O.int32 (0 :: Int) -toDatum (VX xs) = O.Blob $ O.blob_pack xs -toDatum _ = error "toDatum: unhandled value" - -toData :: OSC -> Event ValueMap -> Maybe [O.Datum] -toData (OSC {args = ArgList as}) e = fmap (fmap (toDatum)) $ sequence $ map (\(n,v) -> Map.lookup n (value e) <|> v) as -toData (OSC {args = Named rqrd}) e - | hasRequired rqrd = Just $ concatMap (\(n,v) -> [O.string n, toDatum v]) $ Map.toList $ value e - | otherwise = Nothing - where hasRequired [] = True - hasRequired xs = null $ filter (not . (`elem` ks)) xs - ks = Map.keys (value e) -toData _ _ = Nothing - -substitutePath :: String -> ValueMap -> Maybe String -substitutePath str cm = parse str - where parse [] = Just [] - parse ('{':xs) = parseWord xs - parse (x:xs) = do xs' <- parse xs - return (x:xs') - parseWord xs | b == [] = getString cm a - | otherwise = do v <- getString cm a - xs' <- parse (tail b) - return $ v ++ xs' - where (a,b) = break (== '}') xs - -getString :: ValueMap -> String -> Maybe String -getString cm s = (simpleShow <$> Map.lookup param cm) <|> defaultValue dflt - where (param, dflt) = break (== '=') s - simpleShow :: Value -> String - simpleShow (VS str) = str - simpleShow (VI i) = show i - simpleShow (VF f) = show f - simpleShow (VN n) = show n - simpleShow (VR r) = show r - simpleShow (VB b) = show b - simpleShow (VX xs) = show xs - simpleShow (VState _) = show "" - simpleShow (VPattern _) = show "" - simpleShow (VList _) = show "" - defaultValue :: String -> Maybe String - defaultValue ('=':dfltVal) = Just dfltVal - defaultValue _ = Nothing - -playStack :: PlayMap -> ControlPattern -playStack pMap = stack . (map pattern) . (filter active) . Map.elems $ pMap - where active pState = if hasSolo pMap - then solo pState - else not (mute pState) - -toOSC :: Maybe [Int] -> ProcessedEvent -> OSC -> [(Double, Bool, O.Message)] -toOSC maybeBusses pe osc@(OSC _ _) - = catMaybes (playmsg:busmsgs) - -- playmap is a ValueMap where the keys don't start with ^ and are not "" - -- busmap is a ValueMap containing the rest of the keys from the event value - -- The partition is performed in order to have special handling of bus ids. - where - (playmap, busmap) = Map.partitionWithKey (\k _ -> null k || head k /= '^') $ val pe - -- Map in bus ids where needed. - -- - -- Bus ids are integers - -- If busses is empty, the ids to send are directly contained in the the values of the busmap. - -- Otherwise, the ids to send are contained in busses at the indices of the values of the busmap. - -- Both cases require that the values of the busmap are only ever integers, - -- that is, they are Values with constructor VI - -- (but perhaps we should explicitly crash with an error message if it contains something else?). - -- Map.mapKeys tail is used to remove ^ from the keys. - -- In case (value e) has the key "", we will get a crash here. - playmap' = Map.union (Map.mapKeys tail $ Map.map (\(VI i) -> VS ('c':(show $ toBus i))) busmap) playmap - val = value . peEvent - -- Only events that start within the current nowArc are included - playmsg | peHasOnset pe = do - -- If there is already cps in the event, the union will preserve that. - let extra = Map.fromList [("cps", (VF (coerce $! peCps pe))), - ("delta", VF (T.addMicrosToOsc (peDelta pe) 0)), - ("cycle", VF (fromRational (peCycle pe))) - ] - addExtra = Map.union playmap' extra - ts = (peOnWholeOrPartOsc pe) + nudge -- + latency - vs <- toData osc ((peEvent pe) {value = addExtra}) - mungedPath <- substitutePath (path osc) playmap' - return (ts, - False, -- bus message ? - O.Message mungedPath vs - ) - | otherwise = Nothing - toBus n | Just busses <- maybeBusses, (not . null) busses = busses !!! n - | otherwise = n - busmsgs = map - (\(('^':k), (VI b)) -> do v <- Map.lookup k playmap - return $ (tsPart, - True, -- bus message ? - O.Message "/c_set" [O.int32 b, toDatum v] - ) - ) - (Map.toList busmap) - where - tsPart = (peOnPartOsc pe) + nudge -- + latency - nudge = fromJust $ getF $ fromMaybe (VF 0) $ Map.lookup "nudge" $ playmap -toOSC _ pe (OSCContext oscpath) - = map cToM $ contextPosition $ context $ peEvent pe - where cToM :: ((Int,Int),(Int,Int)) -> (Double, Bool, O.Message) - cToM ((x, y), (x',y')) = (ts, - False, -- bus message ? - O.Message oscpath $ (O.string ident):(O.float (peDelta pe)):(O.float cyc):(map O.int32 [x,y,x',y']) - ) - cyc :: Double - cyc = fromRational $ peCycle pe - nudge = fromMaybe 0 $ Map.lookup "nudge" (value $ peEvent pe) >>= getF - ident = fromMaybe "unknown" $ Map.lookup "_id_" (value $ peEvent pe) >>= getS - ts = (peOnWholeOrPartOsc pe) + nudge -- + latency - - --- Used for Tempo callback -updatePattern :: Stream -> ID -> Time -> ControlPattern -> IO () -updatePattern stream k !t pat = do - let x = queryArc pat (Arc 0 0) - pMap <- seq x $ takeMVar (sPMapMV stream) - let playState = updatePS $ Map.lookup (fromID k) pMap - putMVar (sPMapMV stream) $ Map.insert (fromID k) playState pMap - where updatePS (Just playState) = do playState {pattern = pat', history = pat:(history playState)} - updatePS Nothing = PlayState pat' False False [pat'] - patControls = Map.singleton patternTimeID (VR t) - pat' = withQueryControls (Map.union patControls) - $ pat # pS "_id_" (pure $ fromID k) - -processCps :: T.LinkOperations -> [Event ValueMap] -> IO [ProcessedEvent] -processCps ops = mapM processEvent - where - processEvent :: Event ValueMap -> IO ProcessedEvent - processEvent e = do - let wope = wholeOrPart e - partStartCycle = start $ part e - partStartBeat = (T.cyclesToBeat ops) (realToFrac partStartCycle) - onCycle = start wope - onBeat = (T.cyclesToBeat ops) (realToFrac onCycle) - offCycle = stop wope - offBeat = (T.cyclesToBeat ops) (realToFrac offCycle) - on <- (T.timeAtBeat ops) onBeat - onPart <- (T.timeAtBeat ops) partStartBeat - when (eventHasOnset e) (do - let cps' = Map.lookup "cps" (value e) >>= getF - maybe (return ()) (\newCps -> (T.setTempo ops) ((T.cyclesToBeat ops) (newCps * 60)) on) $ coerce cps' - ) - off <- (T.timeAtBeat ops) offBeat - bpm <- (T.getTempo ops) - let cps = ((T.beatToCycles ops) bpm) / 60 - let delta = off - on - return $! ProcessedEvent { - peHasOnset = eventHasOnset e, - peEvent = e, - peCps = cps, - peDelta = delta, - peCycle = onCycle, - peOnWholeOrPart = on, - peOnWholeOrPartOsc = (T.linkToOscTime ops) on, - peOnPart = onPart, - peOnPartOsc = (T.linkToOscTime ops) onPart - } - - --- streamFirst but with random cycle instead of always first cicle -streamOnce :: Stream -> ControlPattern -> IO () -streamOnce st p = do i <- getStdRandom $ randomR (0, 8192) - streamFirst st $ rotL (toRational (i :: Int)) p - --- here let's do modifyMVar_ on actions -streamFirst :: Stream -> ControlPattern -> IO () -streamFirst stream pat = modifyMVar_ (sActionsMV stream) (\actions -> return $ (T.SingleTick pat) : actions) - --- Used for Tempo callback -onTick :: Stream -> TickState -> T.LinkOperations -> ValueMap -> IO ValueMap -onTick stream st ops s - = doTick stream st ops s - --- Used for Tempo callback --- Tempo changes will be applied. --- However, since the full arc is processed at once and since Link does not support --- scheduling, tempo change may affect scheduling of events that happen earlier --- in the normal stream (the one handled by onTick). -onSingleTick :: Stream -> T.LinkOperations -> ValueMap -> ControlPattern -> IO ValueMap -onSingleTick stream ops s pat = do - pMapMV <- newMVar $ Map.singleton "fake" - (PlayState {pattern = pat, - mute = False, - solo = False, - history = [] - } - ) - - -- The nowArc is a full cycle - let state = TickState {tickArc = (Arc 0 1), tickNudge = 0} - doTick (stream {sPMapMV = pMapMV}) state ops s - - --- | Query the current pattern (contained in argument @stream :: Stream@) --- for the events in the current arc (contained in argument @st :: T.State@), --- translate them to OSC messages, and send these. --- --- If an exception occurs during sending, --- this functions prints a warning and continues, because --- the likely reason is that the backend (supercollider) isn't running. --- --- If any exception occurs before or outside sending --- (e.g., while querying the pattern, while computing a message), --- this function prints a warning and resets the current pattern --- to the previous one (or to silence if there isn't one) and continues, --- because the likely reason is that something is wrong with the current pattern. -doTick :: Stream -> TickState -> T.LinkOperations -> ValueMap -> IO ValueMap -doTick stream st ops sMap = - E.handle (\ (e :: E.SomeException) -> do - hPutStrLn stderr $ "Failed to Stream.doTick: " ++ show e - hPutStrLn stderr $ "Return to previous pattern." - setPreviousPatternOrSilence stream - return sMap) (do - pMap <- readMVar (sPMapMV stream) - sGlobalF <- readMVar (sGlobalFMV stream) - bpm <- (T.getTempo ops) - let - cxs = sCxs stream - patstack = sGlobalF $ playStack pMap - cps = ((T.beatToCycles ops) bpm) / 60 - sMap' = Map.insert "_cps" (VF $ coerce cps) sMap - extraLatency = tickNudge st - -- First the state is used to query the pattern - es = sortOn (start . part) $ query patstack (State {arc = tickArc st, - controls = sMap' - } - ) - -- Then it's passed through the events - (sMap'', es') = resolveState sMap' es - tes <- processCps ops es' - -- For each OSC target - forM_ cxs $ \cx@(Cx target _ oscs _ _ bussesMV) -> do - busses <- mapM readMVar bussesMV - -- Latency is configurable per target. - -- Latency is only used when sending events live. - let latency = oLatency target - ms = concatMap (\e -> concatMap (toOSC busses e) oscs) tes - -- send the events to the OSC target - forM_ ms $ \ m -> (do - send cx latency extraLatency m) `E.catch` \ (e :: E.SomeException) -> do - hPutStrLn stderr $ "Failed to send. Is the '" ++ oName target ++ "' target running? " ++ show e - sMap'' `seq` return sMap'') - -setPreviousPatternOrSilence :: Stream -> IO () -setPreviousPatternOrSilence stream = - modifyMVar_ (sPMapMV stream) $ return - . Map.map ( \ pMap -> case history pMap of - _:p:ps -> pMap { pattern = p, history = p:ps } - _ -> pMap { pattern = silence, history = [silence] } - ) - --- send has three modes: --- Send events early using timestamp in the OSC bundle - used by Superdirt --- Send events early by adding timestamp to the OSC message - used by Dirt --- Send events live by delaying the thread -send :: Cx -> Double -> Double -> (Double, Bool, O.Message) -> IO () -send cx latency extraLatency (time, isBusMsg, m) - | oSchedule target == Pre BundleStamp = sendBndl isBusMsg cx $ O.Bundle timeWithLatency [m] - | oSchedule target == Pre MessageStamp = sendO isBusMsg cx $ addtime m - | otherwise = do _ <- forkOS $ do now <- O.time - threadDelay $ floor $ (timeWithLatency - now) * 1000000 - sendO isBusMsg cx m - return () - where addtime (O.Message mpath params) = O.Message mpath ((O.int32 sec):((O.int32 usec):params)) - ut = O.ntpr_to_posix timeWithLatency - sec :: Int - sec = floor ut - usec :: Int - usec = floor $ 1000000 * (ut - (fromIntegral sec)) - target = cxTarget cx - timeWithLatency = time - latency + extraLatency - --- Interaction - -streamNudgeAll :: Stream -> Double -> IO () -streamNudgeAll s nudge = T.setNudge (sActionsMV s) nudge - -streamResetCycles :: Stream -> IO () -streamResetCycles s = streamSetCycle s 0 - -streamSetCycle :: Stream -> Time -> IO () -streamSetCycle s cyc = T.setCycle cyc (sActionsMV s) - -hasSolo :: Map.Map k PlayState -> Bool -hasSolo = (>= 1) . length . filter solo . Map.elems - -streamList :: Stream -> IO () -streamList s = do pMap <- readMVar (sPMapMV s) - let hs = hasSolo pMap - putStrLn $ concatMap (showKV hs) $ Map.toList pMap - where showKV :: Bool -> (PatId, PlayState) -> String - showKV True (k, (PlayState {solo = True})) = k ++ " - solo\n" - showKV True (k, _) = "(" ++ k ++ ")\n" - showKV False (k, (PlayState {solo = False})) = k ++ "\n" - showKV False (k, _) = "(" ++ k ++ ") - muted\n" - --- Evaluation of pat is forced so exceptions are picked up here, before replacing the existing pattern. - -streamReplace :: Stream -> ID -> ControlPattern -> IO () -streamReplace s k !pat - = modifyMVar_ (sActionsMV s) (\actions -> return $ (T.StreamReplace k pat) : actions) - -streamMute :: Stream -> ID -> IO () -streamMute s k = withPatIds s [k] (\x -> x {mute = True}) - -streamMutes :: Stream -> [ID] -> IO () -streamMutes s ks = withPatIds s ks (\x -> x {mute = True}) - -streamUnmute :: Stream -> ID -> IO () -streamUnmute s k = withPatIds s [k] (\x -> x {mute = False}) - -streamSolo :: Stream -> ID -> IO () -streamSolo s k = withPatIds s [k] (\x -> x {solo = True}) - -streamUnsolo :: Stream -> ID -> IO () -streamUnsolo s k = withPatIds s [k] (\x -> x {solo = False}) - -withPatIds :: Stream -> [ID] -> (PlayState -> PlayState) -> IO () -withPatIds s ks f - = do playMap <- takeMVar $ sPMapMV s - let pMap' = foldr (Map.update (\x -> Just $ f x)) playMap (map fromID ks) - putMVar (sPMapMV s) pMap' - return () - --- TODO - is there a race condition here? -streamMuteAll :: Stream -> IO () -streamMuteAll s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {mute = True}) - -streamHush :: Stream -> IO () -streamHush s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {pattern = silence, history = silence:history x}) - -streamUnmuteAll :: Stream -> IO () -streamUnmuteAll s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {mute = False}) - -streamUnsoloAll :: Stream -> IO () -streamUnsoloAll s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {solo = False}) - -streamSilence :: Stream -> ID -> IO () -streamSilence s k = withPatIds s [k] (\x -> x {pattern = silence, history = silence:history x}) - -streamAll :: Stream -> (ControlPattern -> ControlPattern) -> IO () -streamAll s f = do _ <- swapMVar (sGlobalFMV s) f - return () - -streamGet :: Stream -> String -> IO (Maybe Value) -streamGet s k = Map.lookup k <$> readMVar (sStateMV s) - -streamSet :: Valuable a => Stream -> String -> Pattern a -> IO () -streamSet s k pat = do sMap <- takeMVar $ sStateMV s - let pat' = toValue <$> pat - sMap' = Map.insert k (VPattern pat') sMap - putMVar (sStateMV s) $ sMap' - -streamSetI :: Stream -> String -> Pattern Int -> IO () -streamSetI = streamSet - -streamSetF :: Stream -> String -> Pattern Double -> IO () -streamSetF = streamSet - -streamSetS :: Stream -> String -> Pattern String -> IO () -streamSetS = streamSet - -streamSetB :: Stream -> String -> Pattern Bool -> IO () -streamSetB = streamSet - -streamSetR :: Stream -> String -> Pattern Rational -> IO () -streamSetR = streamSet - -openListener :: Config -> IO (Maybe O.Udp) -openListener c - | cCtrlListen c = catchAny run (\_ -> do verbose c "That port isn't available, perhaps another Tidal instance is already listening on that port?" - return Nothing - ) - | otherwise = return Nothing - where - run = do sock <- O.udpServer (cCtrlAddr c) (cCtrlPort c) - when (cCtrlBroadcast c) $ N.setSocketOption (O.udpSocket sock) N.Broadcast 1 - return $ Just sock - catchAny :: IO a -> (E.SomeException -> IO a) -> IO a - catchAny = E.catch - --- Listen to and act on OSC control messages -ctrlResponder :: Config -> Stream -> IO () -ctrlResponder c (stream@(Stream {sListen = Just sock})) = loop - where - loop :: IO () - loop = do O.recvMessages sock >>= mapM_ act - loop - -- External controller commands - act :: O.Message -> IO () - act (O.Message "/ctrl" (O.Int32 k:v:[])) - = act (O.Message "/ctrl" [O.string $ show k,v]) - act (O.Message "/ctrl" (O.AsciiString k:v@(O.Float _):[])) - = add (O.ascii_to_string k) (VF (fromJust $ O.datum_floating v)) - act (O.Message "/ctrl" (O.AsciiString k:O.AsciiString v:[])) - = add (O.ascii_to_string k) (VS (O.ascii_to_string v)) - act (O.Message "/ctrl" (O.AsciiString k:O.Int32 v:[])) - = add (O.ascii_to_string k) (VI (fromIntegral v)) - -- Stream playback commands - act (O.Message "/mute" (k:[])) - = withID k $ streamMute stream - act (O.Message "/unmute" (k:[])) - = withID k $ streamUnmute stream - act (O.Message "/solo" (k:[])) - = withID k $ streamSolo stream - act (O.Message "/unsolo" (k:[])) - = withID k $ streamUnsolo stream - act (O.Message "/muteAll" []) - = streamMuteAll stream - act (O.Message "/unmuteAll" []) - = streamUnmuteAll stream - act (O.Message "/unsoloAll" []) - = streamUnsoloAll stream - act (O.Message "/hush" []) - = streamHush stream - act (O.Message "/silence" (k:[])) - = withID k $ streamSilence stream - act m = hPutStrLn stderr $ "Unhandled OSC: " ++ show m - add :: String -> Value -> IO () - add k v = do sMap <- takeMVar (sStateMV stream) - putMVar (sStateMV stream) $ Map.insert k v sMap - return () - withID :: O.Datum -> (ID -> IO ()) -> IO () - withID (O.AsciiString k) func = func $ (ID . O.ascii_to_string) k - withID (O.Int32 k) func = func $ (ID . show) k - withID _ _ = return () -ctrlResponder _ _ = return () - -verbose :: Config -> String -> IO () -verbose c s = when (cVerbose c) $ putStrLn s - -recvMessagesTimeout :: (O.Transport t) => Double -> t -> IO [O.Message] -recvMessagesTimeout n sock = fmap (maybe [] O.packetMessages) $ O.recvPacketTimeout n sock - -streamGetcps :: Stream -> IO Double -streamGetcps s = do - let config = sConfig s - ss <- Link.createAndCaptureAppSessionState (sLink s) - bpm <- Link.getTempo ss - Link.destroySessionState ss - return $! coerce $ bpm / (cBeatsPerCycle config) / 60 - -streamGetnow :: Stream -> IO Double -streamGetnow s = do - let config = sConfig s - ss <- Link.createAndCaptureAppSessionState (sLink s) - now <- Link.clock (sLink s) - beat <- Link.beatAtTime ss now (cQuantum config) - Link.destroySessionState ss - return $! coerce $ beat / (cBeatsPerCycle config) - -getProcessAhead :: Stream -> Link.Micros -getProcessAhead str = round $ (cProcessAhead $ sConfig str) * 100000 - -streamGetAhead :: Stream -> IO Double -streamGetAhead str = do - ss <- Link.createAndCaptureAppSessionState (sLink str) - now <- Link.clock (sLink str) - beat <- Link.beatAtTime ss (now + (getProcessAhead str)) (cQuantum $! sConfig str) - Link.destroySessionState ss - return $ coerce $! beat / (cBeatsPerCycle $! sConfig str) diff --git a/src/Sound/Tidal/Config.hs b/src/Sound/Tidal/Stream/Config.hs similarity index 58% rename from src/Sound/Tidal/Config.hs rename to src/Sound/Tidal/Stream/Config.hs index 8e83853b4..295c41c46 100644 --- a/src/Sound/Tidal/Config.hs +++ b/src/Sound/Tidal/Stream/Config.hs @@ -1,7 +1,6 @@ -module Sound.Tidal.Config where +module Sound.Tidal.Stream.Config where -import Data.Int(Int64) -import Foreign.C.Types (CDouble) +import qualified Sound.Tidal.Clock as Clock {- Config.hs - For default Tidal configuration values. @@ -25,16 +24,11 @@ data Config = Config {cCtrlListen :: Bool, cCtrlAddr :: String, cCtrlPort :: Int, cCtrlBroadcast :: Bool, - cFrameTimespan :: Double, - cEnableLink :: Bool, - cProcessAhead :: Double, - cTempoAddr :: String, - cTempoPort :: Int, - cTempoClientPort :: Int, - cSkipTicks :: Int64, + -- cTempoAddr :: String, + -- cTempoPort :: Int, + -- cTempoClientPort :: Int, cVerbose :: Bool, - cQuantum :: CDouble, - cBeatsPerCycle :: CDouble + cClockConfig :: Clock.ClockConfig } defaultConfig :: Config @@ -42,14 +36,9 @@ defaultConfig = Config {cCtrlListen = True, cCtrlAddr ="127.0.0.1", cCtrlPort = 6010, cCtrlBroadcast = False, - cFrameTimespan = 1/20, - cEnableLink = True, - cProcessAhead = 3/10, - cTempoAddr = "127.0.0.1", - cTempoPort = 9160, - cTempoClientPort = 0, -- choose at random - cSkipTicks = 10, + -- cTempoAddr = "127.0.0.1", + -- cTempoPort = 9160, + -- cTempoClientPort = 0, -- choose at random cVerbose = True, - cQuantum = 4, - cBeatsPerCycle = 4 + cClockConfig = Clock.defaultConfig } diff --git a/src/Sound/Tidal/Stream/Listen.hs b/src/Sound/Tidal/Stream/Listen.hs new file mode 100644 index 000000000..8fa61cd47 --- /dev/null +++ b/src/Sound/Tidal/Stream/Listen.hs @@ -0,0 +1,118 @@ +module Sound.Tidal.Stream.Listen where + +import Data.Maybe (fromJust, catMaybes, isJust) +import Control.Concurrent.MVar +import Control.Monad (when) +import System.IO (hPutStrLn, stderr) +import qualified Data.Map as Map +import qualified Sound.Osc.Fd as O +import qualified Sound.Osc.Time.Timeout as O +import qualified Network.Socket as N +import qualified Control.Exception as E + +import Sound.Tidal.ID +import Sound.Tidal.Pattern + +import Sound.Tidal.Stream.Config +import Sound.Tidal.Stream.Types +import Sound.Tidal.Stream.UI + +{- + Listen.hs - logic for listening and acting on incoming OSC messages + Copyright (C) 2020, Alex McLean and contributors + + This library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library. If not, see . +-} + + +openListener :: Config -> IO (Maybe O.Udp) +openListener c + | cCtrlListen c = catchAny run (\_ -> do verbose c "That port isn't available, perhaps another Tidal instance is already listening on that port?" + return Nothing + ) + | otherwise = return Nothing + where + run = do sock <- O.udpServer (cCtrlAddr c) (cCtrlPort c) + when (cCtrlBroadcast c) $ N.setSocketOption (O.udpSocket sock) N.Broadcast 1 + return $ Just sock + catchAny :: IO a -> (E.SomeException -> IO a) -> IO a + catchAny = E.catch + +-- Listen to and act on OSC control messages +ctrlResponder :: Int -> Config -> Stream -> IO () +ctrlResponder waits c (stream@(Stream {sListen = Just sock})) + = do ms <- recvMessagesTimeout 2 sock + if (null ms) + then do checkHandshake -- there was a timeout, check handshake + ctrlResponder (waits+1) c stream + else do mapM_ act ms + ctrlResponder 0 c stream + where + checkHandshake = do busses <- readMVar (sBusses stream) + when (null busses) $ do when (waits == 0) $ verbose c $ "Waiting for SuperDirt (v.1.7.2 or higher).." + sendHandshakes stream + + act (O.Message "/dirt/hello" _) = sendHandshakes stream + act (O.Message "/dirt/handshake/reply" xs) = do prev <- swapMVar (sBusses stream) $ bufferIndices xs + -- Only report the first time.. + when (null prev) $ verbose c $ "Connected to SuperDirt." + return () + where + bufferIndices [] = [] + bufferIndices (x:xs') | x == (O.AsciiString $ O.ascii "&controlBusIndices") = catMaybes $ takeWhile isJust $ map O.datum_integral xs' + | otherwise = bufferIndices xs' + -- External controller commands + act (O.Message "/ctrl" (O.Int32 k:v:[])) + = act (O.Message "/ctrl" [O.string $ show k,v]) + act (O.Message "/ctrl" (O.AsciiString k:v@(O.Float _):[])) + = add (O.ascii_to_string k) (VF (fromJust $ O.datum_floating v)) + act (O.Message "/ctrl" (O.AsciiString k:O.AsciiString v:[])) + = add (O.ascii_to_string k) (VS (O.ascii_to_string v)) + act (O.Message "/ctrl" (O.AsciiString k:O.Int32 v:[])) + = add (O.ascii_to_string k) (VI (fromIntegral v)) + -- Stream playback commands + act (O.Message "/mute" (k:[])) + = withID k $ streamMute stream + act (O.Message "/unmute" (k:[])) + = withID k $ streamUnmute stream + act (O.Message "/solo" (k:[])) + = withID k $ streamSolo stream + act (O.Message "/unsolo" (k:[])) + = withID k $ streamUnsolo stream + act (O.Message "/muteAll" []) + = streamMuteAll stream + act (O.Message "/unmuteAll" []) + = streamUnmuteAll stream + act (O.Message "/unsoloAll" []) + = streamUnsoloAll stream + act (O.Message "/hush" []) + = streamHush stream + act (O.Message "/silence" (k:[])) + = withID k $ streamSilence stream + act m = hPutStrLn stderr $ "Unhandled OSC: " ++ show m + add :: String -> Value -> IO () + add k v = do sMap <- takeMVar (sStateMV stream) + putMVar (sStateMV stream) $ Map.insert k v sMap + return () + withID :: O.Datum -> (ID -> IO ()) -> IO () + withID (O.AsciiString k) func = func $ (ID . O.ascii_to_string) k + withID (O.Int32 k) func = func $ (ID . show) k + withID _ _ = return () +ctrlResponder _ _ _ = return () + +verbose :: Config -> String -> IO () +verbose c s = when (cVerbose c) $ putStrLn s + +recvMessagesTimeout :: (O.Transport t) => Double -> t -> IO [O.Message] +recvMessagesTimeout n sock = fmap (maybe [] O.packetMessages) $ O.recvPacketTimeout n sock diff --git a/src/Sound/Tidal/Stream/Main.hs b/src/Sound/Tidal/Stream/Main.hs new file mode 100644 index 000000000..e4dd41c09 --- /dev/null +++ b/src/Sound/Tidal/Stream/Main.hs @@ -0,0 +1,78 @@ +module Sound.Tidal.Stream.Main where + +import qualified Data.Map as Map +import qualified Sound.Tidal.Clock as Clock +import Control.Concurrent.MVar +import Control.Concurrent +import System.IO (hPutStrLn, stderr) + + +import Sound.Tidal.Version (tidal_status_string) +import Sound.Tidal.Stream.Config +import Sound.Tidal.Stream.Types +import Sound.Tidal.Stream.Listen +import Sound.Tidal.Stream.Target +import Sound.Tidal.Stream.Process +import Sound.Tidal.Stream.UI + +{- + Main.hs - Start tidals stream, listen and act on incoming messages + Copyright (C) 2020, Alex McLean and contributors + + This library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library. If not, see . +-} + + +-- Start an instance of Tidal with superdirt OSC +startTidal :: Target -> Config -> IO Stream +startTidal target config = startStream config [(target, [superdirtShape])] + +-- Start an instance of Tidal +-- Spawns a thread within Tempo that acts as the clock +-- Spawns a thread that listens to and acts on OSC control messages +startStream :: Config -> [(Target, [OSC])] -> IO Stream +startStream config oscmap = do + sMapMV <- newMVar Map.empty + pMapMV <- newMVar Map.empty + bussesMV <- newMVar [] + globalFMV <- newMVar id + + tidal_status_string >>= verbose config + verbose config $ "Listening for external controls on " ++ cCtrlAddr config ++ ":" ++ show (cCtrlPort config) + listen <- openListener config + + cxs <- getCXs config oscmap + + clockRef <- Clock.clocked (cClockConfig config) (doTick sMapMV bussesMV pMapMV globalFMV cxs listen) + + let stream = Stream {sConfig = config, + sBusses = bussesMV, + sStateMV = sMapMV, + sClockRef = clockRef, + -- sLink = abletonLink, + sListen = listen, + sPMapMV = pMapMV, + -- sActionsMV = actionsMV, + sGlobalFMV = globalFMV, + sCxs = cxs + } + + sendHandshakes stream + + -- Spawn a thread to handle OSC control messages + _ <- forkIO $ ctrlResponder 0 config stream + return stream + +startMulti :: [Target] -> Config -> IO () +startMulti _ _ = hPutStrLn stderr $ "startMulti has been removed, please check the latest documentation on tidalcycles.org" diff --git a/src/Sound/Tidal/Stream/Process.hs b/src/Sound/Tidal/Stream/Process.hs new file mode 100644 index 000000000..cb661c3bb --- /dev/null +++ b/src/Sound/Tidal/Stream/Process.hs @@ -0,0 +1,319 @@ +{-# LANGUAGE ConstraintKinds, GeneralizedNewtypeDeriving, FlexibleContexts, ScopedTypeVariables, BangPatterns #-} +{-# OPTIONS_GHC -fno-warn-missing-fields #-} +{-# language DeriveGeneric, StandaloneDeriving #-} + +module Sound.Tidal.Stream.Process where + +{- + Process.hs - Tidal's thingie for turning patterns into OSC streams + Copyright (C) 2020, Alex McLean and contributors + + This library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library. If not, see . +-} + +import Control.Applicative ((<|>)) +import Control.Concurrent.MVar +import Control.Monad (forM_, when) +import Data.Coerce (coerce) +import qualified Data.Map.Strict as Map +import Data.Maybe (fromJust, fromMaybe, catMaybes) +import qualified Control.Exception as E +import Foreign.C.Types +import System.IO (hPutStrLn, stderr) + +import qualified Sound.Osc.Fd as O + +import Sound.Tidal.Stream.Config +import Sound.Tidal.Core (stack, (#)) +import Sound.Tidal.ID +import qualified Sound.Tidal.Link as Link +import qualified Sound.Tidal.Clock as Clock +import Sound.Tidal.Params (pS) +import Sound.Tidal.Pattern +import Sound.Tidal.Utils ((!!!)) +import Data.List (sortOn) +import Sound.Tidal.Show () + +import Sound.Tidal.Stream.Types +import Sound.Tidal.Stream.Target + +data ProcessedEvent = + ProcessedEvent { + peHasOnset :: Bool, + peEvent :: Event ValueMap, + peCps :: Link.BPM, + peDelta :: Link.Micros, + peCycle :: Time, + peOnWholeOrPart :: Link.Micros, + peOnWholeOrPartOsc :: O.Time, + peOnPart :: Link.Micros, + peOnPartOsc :: O.Time + } + +-- | Query the current pattern (contained in argument @stream :: Stream@) +-- for the events in the current arc (contained in argument @st :: T.State@), +-- translate them to OSC messages, and send these. +-- +-- If an exception occurs during sending, +-- this functions prints a warning and continues, because +-- the likely reason is that the backend (supercollider) isn't running. +-- +-- If any exception occurs before or outside sending +-- (e.g., while querying the pattern, while computing a message), +-- this function prints a warning and resets the current pattern +-- to the previous one (or to silence if there isn't one) and continues, +-- because the likely reason is that something is wrong with the current pattern. + +doTick :: MVar ValueMap -- pattern state + -> MVar [Int] -- busses + -> MVar PlayMap -- currently playing + -> MVar (ControlPattern -> ControlPattern) -- current global fx + -> [Cx] -- target addresses + -> Maybe O.Udp -- network socket + -> (Time,Time) -- current arc + -> Double -- nudge + -> Clock.LinkOperations -- ableton link operations + -> IO () +doTick stateMV busMV playMV globalFMV cxs listen (st,end) nudge ops = + E.handle (\ (e :: E.SomeException) -> do + hPutStrLn stderr $ "Failed to Stream.doTick: " ++ show e + hPutStrLn stderr $ "Return to previous pattern." + setPreviousPatternOrSilence playMV) (do + sMap <- takeMVar stateMV + pMap <- readMVar playMV + busses <- readMVar busMV + sGlobalF <- readMVar globalFMV + bpm <- (Clock.getTempo ops) + let + patstack = sGlobalF $ playStack pMap + cps = ((Clock.beatToCycles ops) bpm) / 60 + sMap' = Map.insert "_cps" (VF $ coerce cps) sMap + extraLatency = nudge + -- First the state is used to query the pattern + es = sortOn (start . part) $ query patstack (State {arc = Arc st end, + controls = sMap' + } + ) + -- Then it's passed through the events + (sMap'', es') = resolveState sMap' es + tes <- processCps ops es' + -- For each OSC target + forM_ cxs $ \cx@(Cx target _ oscs _ _) -> do + -- Latency is configurable per target. + -- Latency is only used when sending events live. + let latency = oLatency target + ms = concatMap (\e -> concatMap (toOSC busses e) oscs) tes + -- send the events to the OSC target + forM_ ms $ \m -> (send listen cx latency extraLatency m) `E.catch` \(e :: E.SomeException) -> + hPutStrLn stderr $ "Failed to send. Is the '" ++ oName target ++ "' target running? " ++ show e + putMVar stateMV sMap'') + +processCps :: Clock.LinkOperations -> [Event ValueMap] -> IO [ProcessedEvent] +processCps ops = mapM processEvent + where + processEvent :: Event ValueMap -> IO ProcessedEvent + processEvent e = do + let wope = wholeOrPart e + partStartCycle = start $ part e + partStartBeat = (Clock.cyclesToBeat ops) (realToFrac partStartCycle) + onCycle = start wope + onBeat = (Clock.cyclesToBeat ops) (realToFrac onCycle) + offCycle = stop wope + offBeat = (Clock.cyclesToBeat ops) (realToFrac offCycle) + on <- (Clock.timeAtBeat ops) onBeat + onPart <- (Clock.timeAtBeat ops) partStartBeat + when (eventHasOnset e) (do + let cps' = Map.lookup "cps" (value e) >>= getF + maybe (return ()) (\newCps -> (Clock.setTempo ops) ((Clock.cyclesToBeat ops) (newCps * 60)) on) $ coerce cps' + ) + off <- (Clock.timeAtBeat ops) offBeat + bpm <- (Clock.getTempo ops) + let cps = ((Clock.beatToCycles ops) bpm) / 60 + let delta = off - on + return $! ProcessedEvent { + peHasOnset = eventHasOnset e, + peEvent = e, + peCps = cps, + peDelta = delta, + peCycle = onCycle, + peOnWholeOrPart = on, + peOnWholeOrPartOsc = (Clock.linkToOscTime ops) on, + peOnPart = onPart, + peOnPartOsc = (Clock.linkToOscTime ops) onPart + } + + +toOSC :: [Int] -> ProcessedEvent -> OSC -> [(Double, Bool, O.Message)] +toOSC busses pe osc@(OSC _ _) + = catMaybes (playmsg:busmsgs) + -- playmap is a ValueMap where the keys don't start with ^ and are not "" + -- busmap is a ValueMap containing the rest of the keys from the event value + -- The partition is performed in order to have special handling of bus ids. + where + (playmap, busmap) = Map.partitionWithKey (\k _ -> null k || head k /= '^') $ val pe + -- Map in bus ids where needed. + -- + -- Bus ids are integers + -- If busses is empty, the ids to send are directly contained in the the values of the busmap. + -- Otherwise, the ids to send are contained in busses at the indices of the values of the busmap. + -- Both cases require that the values of the busmap are only ever integers, + -- that is, they are Values with constructor VI + -- (but perhaps we should explicitly crash with an error message if it contains something else?). + -- Map.mapKeys tail is used to remove ^ from the keys. + -- In case (value e) has the key "", we will get a crash here. + playmap' = Map.union (Map.mapKeys tail $ Map.map (\(VI i) -> VS ('c':(show $ toBus i))) busmap) playmap + val = value . peEvent + -- Only events that start within the current nowArc are included + playmsg | peHasOnset pe = do + -- If there is already cps in the event, the union will preserve that. + let extra = Map.fromList [("cps", (VF (coerce $! peCps pe))), + ("delta", VF (Clock.addMicrosToOsc (peDelta pe) 0)), + ("cycle", VF (fromRational (peCycle pe))) + ] + addExtra = Map.union playmap' extra + ts = (peOnWholeOrPartOsc pe) + nudge -- + latency + vs <- toData osc ((peEvent pe) {value = addExtra}) + mungedPath <- substitutePath (path osc) playmap' + return (ts, + False, -- bus message ? + O.Message mungedPath vs + ) + | otherwise = Nothing + toBus n | null busses = n + | otherwise = busses !!! n + busmsgs = map + (\(('^':k), (VI b)) -> do v <- Map.lookup k playmap + return $ (tsPart, + True, -- bus message ? + O.Message "/c_set" [O.int32 b, toDatum v] + ) + ) + (Map.toList busmap) + where + tsPart = (peOnPartOsc pe) + nudge -- + latency + nudge = fromJust $ getF $ fromMaybe (VF 0) $ Map.lookup "nudge" $ playmap +toOSC _ pe (OSCContext oscpath) + = map cToM $ contextPosition $ context $ peEvent pe + where cToM :: ((Int,Int),(Int,Int)) -> (Double, Bool, O.Message) + cToM ((x, y), (x',y')) = (ts, + False, -- bus message ? + O.Message oscpath $ (O.string ident):(O.float (peDelta pe)):(O.float cyc):(map O.int32 [x,y,x',y']) + ) + cyc :: Double + cyc = fromRational $ peCycle pe + nudge = fromMaybe 0 $ Map.lookup "nudge" (value $ peEvent pe) >>= getF + ident = fromMaybe "unknown" $ Map.lookup "_id_" (value $ peEvent pe) >>= getS + ts = (peOnWholeOrPartOsc pe) + nudge -- + latency + +toData :: OSC -> Event ValueMap -> Maybe [O.Datum] +toData (OSC {args = ArgList as}) e = fmap (fmap (toDatum)) $ sequence $ map (\(n,v) -> Map.lookup n (value e) <|> v) as +toData (OSC {args = Named rqrd}) e + | hasRequired rqrd = Just $ concatMap (\(n,v) -> [O.string n, toDatum v]) $ Map.toList $ value e + | otherwise = Nothing + where hasRequired [] = True + hasRequired xs = null $ filter (not . (`elem` ks)) xs + ks = Map.keys (value e) +toData _ _ = Nothing + +toDatum :: Value -> O.Datum +toDatum (VF x) = O.float x +toDatum (VN x) = O.float x +toDatum (VI x) = O.int32 x +toDatum (VS x) = O.string x +toDatum (VR x) = O.float $ ((fromRational x) :: Double) +toDatum (VB True) = O.int32 (1 :: Int) +toDatum (VB False) = O.int32 (0 :: Int) +toDatum (VX xs) = O.Blob $ O.blob_pack xs +toDatum _ = error "toDatum: unhandled value" + +substitutePath :: String -> ValueMap -> Maybe String +substitutePath str cm = parse str + where parse [] = Just [] + parse ('{':xs) = parseWord xs + parse (x:xs) = do xs' <- parse xs + return (x:xs') + parseWord xs | b == [] = getString cm a + | otherwise = do v <- getString cm a + xs' <- parse (tail b) + return $ v ++ xs' + where (a,b) = break (== '}') xs + +getString :: ValueMap -> String -> Maybe String +getString cm s = (simpleShow <$> Map.lookup param cm) <|> defaultValue dflt + where (param, dflt) = break (== '=') s + simpleShow :: Value -> String + simpleShow (VS str) = str + simpleShow (VI i) = show i + simpleShow (VF f) = show f + simpleShow (VN n) = show n + simpleShow (VR r) = show r + simpleShow (VB b) = show b + simpleShow (VX xs) = show xs + simpleShow (VState _) = show "" + simpleShow (VPattern _) = show "" + simpleShow (VList _) = show "" + defaultValue :: String -> Maybe String + defaultValue ('=':dfltVal) = Just dfltVal + defaultValue _ = Nothing + +playStack :: PlayMap -> ControlPattern +playStack pMap = stack . (map pattern) . (filter active) . Map.elems $ pMap + where active pState = if hasSolo pMap + then solo pState + else not (mute pState) + +hasSolo :: Map.Map k PlayState -> Bool +hasSolo = (>= 1) . length . filter solo . Map.elems + + +-- Used for Tempo callback +-- Tempo changes will be applied. +-- However, since the full arc is processed at once and since Link does not support +-- scheduling, tempo change may affect scheduling of events that happen earlier +-- in the normal stream (the one handled by onTick). +onSingleTick :: Config -> Clock.ClockRef -> MVar ValueMap -> MVar [Int] -> MVar PlayMap -> MVar (ControlPattern -> ControlPattern) -> [Cx] -> Maybe O.Udp -> ControlPattern -> IO () +onSingleTick config clockRef stateMV busMV _ globalFMV cxs listen pat = do + ops <- Clock.getZeroedLinkOperations (cClockConfig config) clockRef + pMapMV <- newMVar $ Map.singleton "fake" + (PlayState {pattern = pat, + mute = False, + solo = False, + history = [] + } + ) + -- The nowArc is a full cycle + doTick stateMV busMV pMapMV globalFMV cxs listen (0,1) 0 ops + + + +-- Used for Tempo callback +updatePattern :: Stream -> ID -> Time -> ControlPattern -> IO () +updatePattern stream k !t pat = do + let x = queryArc pat (Arc 0 0) + pMap <- seq x $ takeMVar (sPMapMV stream) + let playState = updatePS $ Map.lookup (fromID k) pMap + putMVar (sPMapMV stream) $ Map.insert (fromID k) playState pMap + where updatePS (Just playState) = do playState {pattern = pat', history = pat:(history playState)} + updatePS Nothing = PlayState pat' False False [pat'] + patControls = Map.singleton patternTimeID (VR t) + pat' = withQueryControls (Map.union patControls) + $ pat # pS "_id_" (pure $ fromID k) + +setPreviousPatternOrSilence :: MVar PlayMap -> IO () +setPreviousPatternOrSilence playMV = + modifyMVar_ playMV $ return + . Map.map ( \ pMap -> case history pMap of + _:p:ps -> pMap { pattern = p, history = p:ps } + _ -> pMap { pattern = silence, history = [silence] } + ) diff --git a/src/Sound/Tidal/Stream/Target.hs b/src/Sound/Tidal/Stream/Target.hs new file mode 100644 index 000000000..964cb992f --- /dev/null +++ b/src/Sound/Tidal/Stream/Target.hs @@ -0,0 +1,156 @@ +module Sound.Tidal.Stream.Target where + +import qualified Sound.Osc.Fd as O +import qualified Network.Socket as N +import Data.Maybe (fromJust, isJust) +import Control.Concurrent (forkOS, threadDelay) +import Foreign (Word8) + +import Sound.Tidal.Pattern +import Sound.Tidal.Stream.Types +import Sound.Tidal.Stream.Config + +{- + Target.hs - Create and send to OSC targets + Copyright (C) 2020, Alex McLean and contributors + + This library is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this library. If not, see . +-} + + +getCXs :: Config -> [(Target, [OSC])] -> IO [Cx] +getCXs config oscmap = mapM (\(target, os) -> do + remote_addr <- resolve (oAddress target) (show $ oPort target) + remote_bus_addr <- if isJust $ oBusPort target + then Just <$> resolve (oAddress target) (show $ fromJust $ oBusPort target) + else return Nothing + let broadcast = if cCtrlBroadcast config then 1 else 0 + u <- O.udp_socket (\sock sockaddr -> do N.setSocketOption sock N.Broadcast broadcast + N.connect sock sockaddr + ) (oAddress target) (oPort target) + return $ Cx {cxUDP = u, cxAddr = remote_addr, cxBusAddr = remote_bus_addr, cxTarget = target, cxOSCs = os} + ) oscmap + +resolve :: String -> String -> IO N.AddrInfo +resolve host port = do let hints = N.defaultHints { N.addrSocketType = N.Stream } + addr:_ <- N.getAddrInfo (Just hints) (Just host) (Just port) + return addr + +-- send has three modes: +-- Send events early using timestamp in the OSC bundle - used by Superdirt +-- Send events early by adding timestamp to the OSC message - used by Dirt +-- Send events live by delaying the thread +send :: Maybe O.Udp -> Cx -> Double -> Double -> (Double, Bool, O.Message) -> IO () +send listen cx latency extraLatency (time, isBusMsg, m) + | oSchedule target == Pre BundleStamp = sendBndl isBusMsg listen cx $ O.Bundle timeWithLatency [m] + | oSchedule target == Pre MessageStamp = sendO isBusMsg listen cx $ addtime m + | otherwise = do _ <- forkOS $ do now <- O.time + threadDelay $ floor $ (timeWithLatency - now) * 1000000 + sendO isBusMsg listen cx m + return () + where addtime (O.Message mpath params) = O.Message mpath ((O.int32 sec):((O.int32 usec):params)) + ut = O.ntpr_to_posix timeWithLatency + sec :: Int + sec = floor ut + usec :: Int + usec = floor $ 1000000 * (ut - (fromIntegral sec)) + target = cxTarget cx + timeWithLatency = time - latency + extraLatency + +sendBndl :: Bool -> (Maybe O.Udp) -> Cx -> O.Bundle -> IO () +sendBndl isBusMsg (Just listen) cx bndl = O.sendTo listen (O.Packet_Bundle bndl) (N.addrAddress addr) + where addr | isBusMsg && isJust (cxBusAddr cx) = fromJust $ cxBusAddr cx + | otherwise = cxAddr cx +sendBndl _ Nothing cx bndl = O.sendBundle (cxUDP cx) bndl + +sendO :: Bool -> (Maybe O.Udp) -> Cx -> O.Message -> IO () +sendO isBusMsg (Just listen) cx msg = O.sendTo listen (O.Packet_Message msg) (N.addrAddress addr) + where addr | isBusMsg && isJust (cxBusAddr cx) = fromJust $ cxBusAddr cx + | otherwise = cxAddr cx +sendO _ Nothing cx msg = O.sendMessage (cxUDP cx) msg + + +superdirtTarget :: Target +superdirtTarget = Target {oName = "SuperDirt", + oAddress = "127.0.0.1", + oPort = 57120, + oBusPort = Just 57110, + oLatency = 0.2, + oWindow = Nothing, + oSchedule = Pre BundleStamp, + oHandshake = True + } + +superdirtShape :: OSC +superdirtShape = OSC "/dirt/play" $ Named {requiredArgs = ["s"]} + +dirtTarget :: Target +dirtTarget = Target {oName = "Dirt", + oAddress = "127.0.0.1", + oPort = 7771, + oBusPort = Nothing, + oLatency = 0.02, + oWindow = Nothing, + oSchedule = Pre MessageStamp, + oHandshake = False + } + +dirtShape :: OSC +dirtShape = OSC "/play" $ ArgList [("cps", fDefault 0), + ("s", Nothing), + ("offset", fDefault 0), + ("begin", fDefault 0), + ("end", fDefault 1), + ("speed", fDefault 1), + ("pan", fDefault 0.5), + ("velocity", fDefault 0.5), + ("vowel", sDefault ""), + ("cutoff", fDefault 0), + ("resonance", fDefault 0), + ("accelerate", fDefault 0), + ("shape", fDefault 0), + ("kriole", iDefault 0), + ("gain", fDefault 1), + ("cut", iDefault 0), + ("delay", fDefault 0), + ("delaytime", fDefault (-1)), + ("delayfeedback", fDefault (-1)), + ("crush", fDefault 0), + ("coarse", iDefault 0), + ("hcutoff", fDefault 0), + ("hresonance", fDefault 0), + ("bandf", fDefault 0), + ("bandq", fDefault 0), + ("unit", sDefault "rate"), + ("loop", fDefault 0), + ("n", fDefault 0), + ("attack", fDefault (-1)), + ("hold", fDefault 0), + ("release", fDefault (-1)), + ("orbit", iDefault 0) -- , + -- ("id", iDefault 0) + ] + +sDefault :: String -> Maybe Value +sDefault x = Just $ VS x +fDefault :: Double -> Maybe Value +fDefault x = Just $ VF x +rDefault :: Rational -> Maybe Value +rDefault x = Just $ VR x +iDefault :: Int -> Maybe Value +iDefault x = Just $ VI x +bDefault :: Bool -> Maybe Value +bDefault x = Just $ VB x +xDefault :: [Word8] -> Maybe Value +xDefault x = Just $ VX x diff --git a/src/Sound/Tidal/Stream/Types.hs b/src/Sound/Tidal/Stream/Types.hs new file mode 100644 index 000000000..f5589f353 --- /dev/null +++ b/src/Sound/Tidal/Stream/Types.hs @@ -0,0 +1,79 @@ +module Sound.Tidal.Stream.Types where + +import Control.Concurrent.MVar +import qualified Data.Map.Strict as Map +import Sound.Tidal.Pattern +import Sound.Tidal.Show () + +import qualified Sound.Osc.Fd as O +import qualified Network.Socket as N + +import qualified Sound.Tidal.Clock as Clock + +import Sound.Tidal.Stream.Config + +data Stream = Stream {sConfig :: Config, + sBusses :: MVar [Int], + sStateMV :: MVar ValueMap, + -- sOutput :: MVar ControlPattern, + sClockRef :: Clock.ClockRef, + sListen :: Maybe O.Udp, + sPMapMV :: MVar PlayMap, + sGlobalFMV :: MVar (ControlPattern -> ControlPattern), + sCxs :: [Cx] + } + +data Cx = Cx {cxTarget :: Target, + cxUDP :: O.Udp, + cxOSCs :: [OSC], + cxAddr :: N.AddrInfo, + cxBusAddr :: Maybe N.AddrInfo + } + +data StampStyle = BundleStamp + | MessageStamp + deriving (Eq, Show) + +data Schedule = Pre StampStyle + | Live + deriving (Eq, Show) + +data Target = Target {oName :: String, + oAddress :: String, + oPort :: Int, + oBusPort :: Maybe Int, + oLatency :: Double, + oWindow :: Maybe Arc, + oSchedule :: Schedule, + oHandshake :: Bool + } + deriving Show + +data Args = Named {requiredArgs :: [String]} + | ArgList [(String, Maybe Value)] + deriving Show + +data OSC = OSC {path :: String, + args :: Args + } + | OSCContext {path :: String} + deriving Show + +data PlayState = PlayState {pattern :: ControlPattern, + mute :: Bool, + solo :: Bool, + history :: [ControlPattern] + } + deriving Show + +type PatId = String +type PlayMap = Map.Map PatId PlayState + +-- data TickState = TickState { +-- tickArc :: Arc, +-- tickNudge :: Double +-- } +-- deriving Show + +patternTimeID :: String +patternTimeID = "_t_pattern" diff --git a/src/Sound/Tidal/Stream/UI.hs b/src/Sound/Tidal/Stream/UI.hs new file mode 100644 index 000000000..1ebeb4553 --- /dev/null +++ b/src/Sound/Tidal/Stream/UI.hs @@ -0,0 +1,154 @@ +{-# LANGUAGE BangPatterns, ScopedTypeVariables #-} +module Sound.Tidal.Stream.UI where + +import Data.Maybe (isJust) +import qualified Data.Map as Map +import qualified Control.Exception as E +import Control.Concurrent.MVar +import System.IO (hPutStrLn, stderr) +import System.Random (getStdRandom, randomR) +import qualified Sound.Osc.Fd as O + +import qualified Sound.Tidal.Clock as Clock +import Sound.Tidal.Stream.Types +import Sound.Tidal.Stream.Config +import Sound.Tidal.Stream.Process +import Sound.Tidal.Stream.Target + +import Sound.Tidal.Pattern +import Sound.Tidal.ID + +streamNudgeAll :: Stream -> Double -> IO () +streamNudgeAll s = Clock.setNudge (sClockRef s) + +streamResetCycles :: Stream -> IO () +streamResetCycles s = streamSetCycle s 0 + +streamSetCycle :: Stream -> Time -> IO () +streamSetCycle s = Clock.setClock (sClockRef s) + +streamSetBPM :: Stream -> Time -> IO () +streamSetBPM s = Clock.setBPM (sClockRef s) + +streamSetCPS :: Stream -> Time -> IO () +streamSetCPS s = Clock.setCPS (cClockConfig $ sConfig s) (sClockRef s) + +streamGetCPS :: Stream -> IO Time +streamGetCPS s = Clock.getCPS (cClockConfig $ sConfig s)(sClockRef s) + +streamGetBPM :: Stream -> IO Time +streamGetBPM s = Clock.getBPM (sClockRef s) + +streamGetNow :: Stream -> IO Time +streamGetNow s = Clock.getCycleTime (cClockConfig $ sConfig s)(sClockRef s) + +streamEnableLink :: Stream -> IO () +streamEnableLink s = Clock.enableLink (sClockRef s) + +streamDisableLink :: Stream -> IO () +streamDisableLink s = Clock.disableLink (sClockRef s) + +streamList :: Stream -> IO () +streamList s = do pMap <- readMVar (sPMapMV s) + let hs = hasSolo pMap + putStrLn $ concatMap (showKV hs) $ Map.toList pMap + where showKV :: Bool -> (PatId, PlayState) -> String + showKV True (k, (PlayState {solo = True})) = k ++ " - solo\n" + showKV True (k, _) = "(" ++ k ++ ")\n" + showKV False (k, (PlayState {solo = False})) = k ++ "\n" + showKV False (k, _) = "(" ++ k ++ ") - muted\n" + +streamReplace :: Stream -> ID -> ControlPattern -> IO () +streamReplace stream k !pat = do + t <- Clock.getCycleTime (cClockConfig $ sConfig stream) (sClockRef stream) + E.handle (\ (e :: E.SomeException) -> do + hPutStrLn stderr $ "Failed to Stream.streamReplace: " ++ show e + hPutStrLn stderr $ "Return to previous pattern." + setPreviousPatternOrSilence (sPMapMV stream)) (updatePattern stream k t pat) + + -- = modifyMVar_ (sActionsMV s) (\actions -> return $ (T.StreamReplace k pat) : actions) + +-- streamFirst but with random cycle instead of always first cicle +streamOnce :: Stream -> ControlPattern -> IO () +streamOnce st p = do i <- getStdRandom $ randomR (0, 8192) + streamFirst st $ rotL (toRational (i :: Int)) p + +streamFirst :: Stream -> ControlPattern -> IO () +streamFirst stream pat = onSingleTick (sConfig stream) (sClockRef stream) (sStateMV stream) (sBusses stream) (sPMapMV stream) (sGlobalFMV stream) (sCxs stream) (sListen stream) pat + +streamMute :: Stream -> ID -> IO () +streamMute s k = withPatIds s [k] (\x -> x {mute = True}) + +streamMutes :: Stream -> [ID] -> IO () +streamMutes s ks = withPatIds s ks (\x -> x {mute = True}) + +streamUnmute :: Stream -> ID -> IO () +streamUnmute s k = withPatIds s [k] (\x -> x {mute = False}) + +streamSolo :: Stream -> ID -> IO () +streamSolo s k = withPatIds s [k] (\x -> x {solo = True}) + +streamUnsolo :: Stream -> ID -> IO () +streamUnsolo s k = withPatIds s [k] (\x -> x {solo = False}) + +withPatIds :: Stream -> [ID] -> (PlayState -> PlayState) -> IO () +withPatIds s ks f + = do playMap <- takeMVar $ sPMapMV s + let pMap' = foldr (Map.update (\x -> Just $ f x)) playMap (map fromID ks) + putMVar (sPMapMV s) pMap' + return () + +-- TODO - is there a race condition here? +streamMuteAll :: Stream -> IO () +streamMuteAll s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {mute = True}) + +streamHush :: Stream -> IO () +streamHush s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {pattern = silence, history = silence:history x}) + +streamUnmuteAll :: Stream -> IO () +streamUnmuteAll s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {mute = False}) + +streamUnsoloAll :: Stream -> IO () +streamUnsoloAll s = modifyMVar_ (sPMapMV s) $ return . fmap (\x -> x {solo = False}) + +streamSilence :: Stream -> ID -> IO () +streamSilence s k = withPatIds s [k] (\x -> x {pattern = silence, history = silence:history x}) + +streamAll :: Stream -> (ControlPattern -> ControlPattern) -> IO () +streamAll s f = do _ <- swapMVar (sGlobalFMV s) f + return () + +streamGet :: Stream -> String -> IO (Maybe Value) +streamGet s k = Map.lookup k <$> readMVar (sStateMV s) + +streamSet :: Valuable a => Stream -> String -> Pattern a -> IO () +streamSet s k pat = do sMap <- takeMVar $ sStateMV s + let pat' = toValue <$> pat + sMap' = Map.insert k (VPattern pat') sMap + putMVar (sStateMV s) $ sMap' + +streamSetI :: Stream -> String -> Pattern Int -> IO () +streamSetI = streamSet + +streamSetF :: Stream -> String -> Pattern Double -> IO () +streamSetF = streamSet + +streamSetS :: Stream -> String -> Pattern String -> IO () +streamSetS = streamSet + +streamSetB :: Stream -> String -> Pattern Bool -> IO () +streamSetB = streamSet + +streamSetR :: Stream -> String -> Pattern Rational -> IO () +streamSetR = streamSet + +-- It only really works to handshake with one target at the moment.. +sendHandshakes :: Stream -> IO () +sendHandshakes stream = mapM_ sendHandshake $ filter (oHandshake . cxTarget) (sCxs stream) + where sendHandshake cx = if (isJust $ sListen stream) + then + do -- send it _from_ the udp socket we're listening to, so the + -- replies go back there + sendO False (sListen stream) cx $ O.Message "/dirt/handshake" [] + else + hPutStrLn stderr "Can't handshake with SuperCollider without control port." diff --git a/src/Sound/Tidal/StreamTypes.hs b/src/Sound/Tidal/StreamTypes.hs deleted file mode 100644 index 6b4fa76ea..000000000 --- a/src/Sound/Tidal/StreamTypes.hs +++ /dev/null @@ -1,24 +0,0 @@ -module Sound.Tidal.StreamTypes where - -import qualified Data.Map.Strict as Map -import Sound.Tidal.Pattern -import Sound.Tidal.Show () - -data PlayState = PlayState {pattern :: ControlPattern, - mute :: Bool, - solo :: Bool, - history :: [ControlPattern] - } - deriving Show - -type PatId = String -type PlayMap = Map.Map PatId PlayState - -data TickState = TickState { - tickArc :: Arc, - tickNudge :: Double - } - deriving Show - -patternTimeID :: String -patternTimeID = "_t_pattern" diff --git a/src/Sound/Tidal/Tempo.hs b/src/Sound/Tidal/Tempo.hs deleted file mode 100644 index 3b505158a..000000000 --- a/src/Sound/Tidal/Tempo.hs +++ /dev/null @@ -1,300 +0,0 @@ -{-# LANGUAGE ConstraintKinds, GeneralizedNewtypeDeriving, FlexibleContexts, ScopedTypeVariables, BangPatterns #-} -{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns -fno-warn-orphans #-} - - -module Sound.Tidal.Tempo where - -import Control.Concurrent.MVar -import qualified Sound.Tidal.Pattern as P -import qualified Sound.Osc.Fd as O -import Control.Concurrent (forkIO, ThreadId, threadDelay) -import Control.Monad (when) -import qualified Data.Map.Strict as Map -import qualified Control.Exception as E -import Sound.Tidal.ID -import Sound.Tidal.Config -import Sound.Tidal.Utils (writeError) -import qualified Sound.Tidal.Link as Link -import Foreign.C.Types (CDouble(..)) -import System.IO (hPutStrLn, stderr) -import Data.Int(Int64) - -import Sound.Tidal.StreamTypes - -{- - Tempo.hs - Tidal's scheduler - Copyright (C) 2020, Alex McLean and contributors - - This library is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this library. If not, see . --} - -instance Show O.Udp where - show _ = "-unshowable-" - -type TransitionMapper = P.Time -> [P.ControlPattern] -> P.ControlPattern - -data TempoAction = - SetCycle P.Time - | SingleTick P.ControlPattern - | SetNudge Double - | StreamReplace ID P.ControlPattern - | Transition Bool TransitionMapper ID P.ControlPattern - -data State = State {ticks :: Int64, - start :: Link.Micros, - nowArc :: P.Arc, - nudged :: Double - } - deriving Show - -data ActionHandler = - ActionHandler { - onTick :: TickState -> LinkOperations -> P.ValueMap -> IO P.ValueMap, - onSingleTick :: LinkOperations -> P.ValueMap -> P.ControlPattern -> IO P.ValueMap, - updatePattern :: ID -> P.Time -> P.ControlPattern -> IO () - } - -data LinkOperations = - LinkOperations { - timeAtBeat :: Link.Beat -> IO Link.Micros, - timeToCycles :: Link.Micros -> IO P.Time, - getTempo :: IO Link.BPM, - setTempo :: Link.BPM -> Link.Micros -> IO (), - linkToOscTime :: Link.Micros -> O.Time, - beatToCycles :: CDouble -> CDouble, - cyclesToBeat :: CDouble -> CDouble - } - -setCycle :: P.Time -> MVar [TempoAction] -> IO () -setCycle cyc actionsMV = modifyMVar_ actionsMV (\actions -> return $ SetCycle cyc : actions) - -setNudge :: MVar [TempoAction] -> Double -> IO () -setNudge actionsMV nudge = modifyMVar_ actionsMV (\actions -> return $ SetNudge nudge : actions) - -timeToCycles' :: Config -> Link.SessionState -> Link.Micros -> IO P.Time -timeToCycles' config ss time = do - beat <- Link.beatAtTime ss time (cQuantum config) - return $! (toRational beat) / (toRational (cBeatsPerCycle config)) - --- At what time does the cycle occur according to Link? -cyclesToTime :: Config -> Link.SessionState -> P.Time -> IO Link.Micros -cyclesToTime config ss cyc = do - let beat = (fromRational cyc) * (cBeatsPerCycle config) - Link.timeAtBeat ss beat (cQuantum config) - -addMicrosToOsc :: Link.Micros -> O.Time -> O.Time -addMicrosToOsc m t = ((fromIntegral m) / 1000000) + t - --- clocked assumes tempoMV is empty -clocked :: Config -> MVar P.ValueMap -> MVar PlayMap -> MVar [TempoAction] -> ActionHandler -> Link.AbletonLink -> IO [ThreadId] -clocked config stateMV mapMV actionsMV ac abletonLink - = do -- TODO - do something with thread id - clockTid <- forkIO $ loopInit - return $! [clockTid] - where frameTimespan :: Link.Micros - frameTimespan = round $ (cFrameTimespan config) * 1000000 - quantum :: CDouble - quantum = cQuantum config - beatsPerCycle :: CDouble - beatsPerCycle = cBeatsPerCycle config - loopInit :: IO a - loopInit = - do - when (cEnableLink config) $ Link.enable abletonLink - sessionState <- Link.createAndCaptureAppSessionState abletonLink - now <- Link.clock abletonLink - let startAt = now + processAhead - Link.requestBeatAtTime sessionState 0 startAt quantum - Link.commitAndDestroyAppSessionState abletonLink sessionState - putMVar actionsMV [] - let st = State {ticks = 0, - start = now, - nowArc = P.Arc 0 0, - nudged = 0 - } - checkArc $! st - -- Time is processed at a fixed rate according to configuration - -- logicalTime gives the time when a tick starts based on when - -- processing first started. - logicalTime :: Link.Micros -> Int64 -> Link.Micros - logicalTime startTime ticks' = startTime + ticks' * frameTimespan - -- tick moves the logical time forward or recalculates the ticks in case - -- the logical time is out of sync with Link time. - -- tick delays the thread when logical time is ahead of Link time. - tick :: State -> IO a - tick st = do - now <- Link.clock abletonLink - let preferredNewTick = ticks st + 1 - logicalNow = logicalTime (start st) preferredNewTick - aheadOfNow = now + processAhead - actualTick = (aheadOfNow - start st) `div` frameTimespan - drifted = abs (actualTick - preferredNewTick) > cSkipTicks config - newTick | drifted = actualTick - | otherwise = preferredNewTick - st' = st {ticks = newTick} - delta = min frameTimespan (logicalNow - aheadOfNow) - if drifted - then writeError $ "skip: " ++ (show (actualTick - ticks st)) - else when (delta > 0) $ threadDelay $ fromIntegral delta - checkArc st' - -- The reference time Link uses, - -- is the time the audio for a certain beat hits the speaker. - -- Processing of the nowArc should happen early enough for - -- all events in the nowArc to hit the speaker, but not too early. - -- Processing thus needs to happen a short while before the start - -- of nowArc. How far ahead is controlled by cProcessAhead. - processAhead :: Link.Micros - processAhead = round $ (cProcessAhead config) * 1000000 - checkArc :: State -> IO a - checkArc st = do - actions <- swapMVar actionsMV [] - st' <- processActions st actions - let logicalEnd = logicalTime (start st') $ ticks st' + 1 - nextArcStartCycle = P.stop $ nowArc st' - ss <- Link.createAndCaptureAppSessionState abletonLink - arcStartTime <- cyclesToTime config ss nextArcStartCycle - Link.destroySessionState ss - if (arcStartTime < logicalEnd) - then processArc st' - else tick st' - processArc :: State -> IO a - processArc st = - do - streamState <- takeMVar stateMV - let logicalEnd = logicalTime (start st) $ ticks st + 1 - startCycle = P.stop $ nowArc st - sessionState <- Link.createAndCaptureAppSessionState abletonLink - endCycle <- timeToCycles' config sessionState logicalEnd - let st' = st {nowArc = P.Arc startCycle endCycle} - nowOsc <- O.time - nowLink <- Link.clock abletonLink - let ops = LinkOperations { - timeAtBeat = \beat -> Link.timeAtBeat sessionState beat quantum , - timeToCycles = timeToCycles' config sessionState, - getTempo = Link.getTempo sessionState, - setTempo = Link.setTempo sessionState, - linkToOscTime = \lt -> addMicrosToOsc (lt - nowLink) nowOsc, - beatToCycles = btc, - cyclesToBeat = ctb - } - let state = TickState { - tickArc = nowArc st', - tickNudge = nudged st' - } - streamState' <- (onTick ac) state ops streamState - Link.commitAndDestroyAppSessionState abletonLink sessionState - putMVar stateMV streamState' - tick st' - btc :: CDouble -> CDouble - btc beat = beat / beatsPerCycle - ctb :: CDouble -> CDouble - ctb cyc = cyc * beatsPerCycle - processActions :: State -> [TempoAction] -> IO State - processActions st [] = return $! st - processActions st actions = do - streamState <- takeMVar stateMV - (st', streamState') <- handleActions st actions streamState - putMVar stateMV streamState' - return $! st' - handleActions :: State -> [TempoAction] -> P.ValueMap -> IO (State, P.ValueMap) - handleActions st [] streamState = return (st, streamState) - handleActions st (SetCycle cyc : otherActions) streamState = - do - (st', streamState') <- handleActions st otherActions streamState - sessionState <- Link.createAndCaptureAppSessionState abletonLink - - now <- Link.clock abletonLink - let startAt = now + processAhead - beat = (fromRational cyc) * (cBeatsPerCycle config) - Link.requestBeatAtTime sessionState beat startAt quantum - Link.commitAndDestroyAppSessionState abletonLink sessionState - - - let st'' = st' { - ticks = 0, - start = now, - nowArc = P.Arc cyc cyc - } - - return (st'', streamState') - handleActions st (SingleTick pat : otherActions) streamState = - do - (st', streamState') <- handleActions st otherActions streamState - -- onSingleTick assumes it runs at beat 0. - -- The best way to achieve that is to use forceBeatAtTime. - -- But using forceBeatAtTime means we can not commit its session state. - -- Another session state, which we will commit, - -- is introduced to keep track of tempo changes. - sessionState <- Link.createAndCaptureAppSessionState abletonLink - zeroedSessionState <- Link.createAndCaptureAppSessionState abletonLink - nowOsc <- O.time - nowLink <- Link.clock abletonLink - Link.forceBeatAtTime zeroedSessionState 0 (nowLink + processAhead) quantum - let ops = LinkOperations { - timeAtBeat = \beat -> Link.timeAtBeat zeroedSessionState beat quantum, - timeToCycles = timeToCycles' config zeroedSessionState, - getTempo = Link.getTempo zeroedSessionState, - setTempo = \bpm micros -> - Link.setTempo zeroedSessionState bpm micros >> - Link.setTempo sessionState bpm micros, - linkToOscTime = \lt -> addMicrosToOsc (lt - nowLink) nowOsc, - beatToCycles = btc, - cyclesToBeat = ctb - } - streamState'' <- (onSingleTick ac) ops streamState' pat - Link.commitAndDestroyAppSessionState abletonLink sessionState - Link.destroySessionState zeroedSessionState - return (st', streamState'') - handleActions st (SetNudge nudge : otherActions) streamState = - do - (st', streamState') <- handleActions st otherActions streamState - let st'' = st' {nudged = nudge} - return (st'', streamState') - handleActions st (StreamReplace k pat : otherActions) streamState = - do - (st', streamState') <- handleActions st otherActions streamState - E.catch ( - do - now <- Link.clock abletonLink - sessionState <- Link.createAndCaptureAppSessionState abletonLink - cyc <- timeToCycles' config sessionState now - Link.destroySessionState sessionState - (updatePattern ac) k cyc pat - return (st', streamState') - ) - (\(e :: E.SomeException) -> do - hPutStrLn stderr $ "Error in pattern: " ++ show e - return (st', streamState') - ) - handleActions st (Transition historyFlag f patId pat : otherActions) streamState = - do - (st', streamState') <- handleActions st otherActions streamState - let - appendPat flag = if flag then (pat:) else id - updatePS (Just playState) = playState {history = (appendPat historyFlag) (history playState)} - updatePS Nothing = PlayState {pattern = P.silence, - mute = False, - solo = False, - history = (appendPat historyFlag) (P.silence:[]) - } - transition' pat' = do now <- Link.clock abletonLink - ss <- Link.createAndCaptureAppSessionState abletonLink - c <- timeToCycles' config ss now - return $! f c pat' - pMap <- readMVar mapMV - let playState = updatePS $ Map.lookup (fromID patId) pMap - pat' <- transition' $ appendPat (not historyFlag) (history playState) - let pMap' = Map.insert (fromID patId) (playState {pattern = pat'}) pMap - _ <- swapMVar mapMV pMap' - return (st', streamState') diff --git a/src/Sound/Tidal/Time.hs b/src/Sound/Tidal/Time.hs index b65a655d4..8f0aa9e01 100644 --- a/src/Sound/Tidal/Time.hs +++ b/src/Sound/Tidal/Time.hs @@ -36,7 +36,7 @@ instance (Fractional a) => Fractional (ArcF a) where recip = fmap recip fromRational = pure . fromRational --- Utility functions - Time +-- * Utility functions - Time -- | The @sam@ (start of cycle) for the given time value. -- Cycles have duration 1, so every integer Time value divides two cycles. @@ -59,7 +59,7 @@ nextSam = (1+) . sam cyclePos :: Time -> Time cyclePos t = t - sam t --- Utility functions - Arc +-- * Utility functions - Arc -- | convex hull union hull :: Arc -> Arc -> Arc @@ -109,9 +109,9 @@ cycleArc (Arc s e) = Arc (cyclePos s) (cyclePos s + (e-s)) -- Thus, for instance, @cyclesInArc (Arc 0 1.5) == [0,1]@.) -- -- Edge cases: --- > cyclesInArc $ Arc 0 1.0001 == [0,1] --- > cyclesInArc $ Arc 0 1 == [0] -- the endpoint is excluded --- > cyclesInArc $ Arc 1 1 == [1] -- unless the Arc has duration 0 +-- > cyclesInArc $ Arc 0 1.0001 == [0,1] +-- > cyclesInArc $ Arc 0 1 == [0] -- the endpoint is excluded +-- > cyclesInArc $ Arc 1 1 == [1] -- unless the Arc has duration 0 -- -- PITFALL: Don't be fooled by the name. The output cycles -- are not necessarily completely contained in the input @Arc@, diff --git a/src/Sound/Tidal/Transition.hs b/src/Sound/Tidal/Transition.hs index c4139325b..b976c72b2 100644 --- a/src/Sound/Tidal/Transition.hs +++ b/src/Sound/Tidal/Transition.hs @@ -4,18 +4,20 @@ module Sound.Tidal.Transition where import Prelude hiding ((<*), (*>)) -import Control.Concurrent.MVar (modifyMVar_) +import Control.Concurrent.MVar (readMVar, swapMVar) import qualified Data.Map.Strict as Map -- import Data.Maybe (fromJust) import Sound.Tidal.Control import Sound.Tidal.Core +import Sound.Tidal.Stream.Config import Sound.Tidal.ID import Sound.Tidal.Params (gain, pan) import Sound.Tidal.Pattern -import Sound.Tidal.Stream -import Sound.Tidal.Tempo as T +import Sound.Tidal.Stream.Types +import qualified Sound.Tidal.Clock as Clock +-- import Sound.Tidal.Tempo as T import Sound.Tidal.UI (fadeOutFrom, fadeInFrom) import Sound.Tidal.Utils (enumerate) @@ -37,11 +39,30 @@ import Sound.Tidal.Utils (enumerate) along with this library. If not, see . -} +type TransitionMapper = Time -> [ControlPattern] -> ControlPattern + -- Evaluation of pat is forced so exceptions are picked up here, before replacing the existing pattern. -- the "historyFlag" determines if the new pattern should be placed on the history stack or not -transition :: Stream -> Bool -> (Time -> [ControlPattern] -> ControlPattern) -> ID -> ControlPattern -> IO () -transition stream historyFlag f patId !pat = - modifyMVar_ (sActionsMV stream) (\actions -> return $! (T.Transition historyFlag f patId pat) : actions) +transition :: Stream -> Bool -> TransitionMapper -> ID -> ControlPattern -> IO () +transition stream historyFlag mapper patId !pat = do + let + appendPat flag = if flag then (pat:) else id + updatePS (Just playState) = playState {history = (appendPat historyFlag) (history playState)} + updatePS Nothing = PlayState {pattern = silence, + mute = False, + solo = False, + history = (appendPat historyFlag) (silence:[]) + } + transition' pat' = do + t <- Clock.getCycleTime (cClockConfig $ sConfig stream) (sClockRef stream) + return $! mapper t pat' + pMap <- readMVar (sPMapMV stream) + let playState = updatePS $ Map.lookup (fromID patId) pMap + pat' <- transition' $ appendPat (not historyFlag) (history playState) + let pMap' = Map.insert (fromID patId) (playState {pattern = pat'}) pMap + _ <- swapMVar (sPMapMV stream) pMap' + return () + mortalOverlay :: Time -> Time -> [Pattern a] -> Pattern a mortalOverlay _ _ [] = silence diff --git a/src/Sound/Tidal/UI.hs b/src/Sound/Tidal/UI.hs index 21b62e03d..d0c28c952 100644 --- a/src/Sound/Tidal/UI.hs +++ b/src/Sound/Tidal/UI.hs @@ -64,7 +64,7 @@ Given a seed number, generates a reasonably random number out of it. This is an efficient algorithm suitable for use in tight loops and used to implement the below functions, which are used to implement 'rand'. -See George Marsaglia (2003). ["Xorshift RNGs"](@https://www.jstatsoft.org/article/view/v008i14@), +See George Marsaglia (2003). ["Xorshift RNGs"](https://www.jstatsoft.org/article/view/v008i14), in Journal of Statistical Software, pages 8–14. -} @@ -94,19 +94,20 @@ timeToRands' seed n {-| -`rand` generates a continuous pattern of (pseudo-)random numbers between @0@ and @1@. +@rand@ is an oscillator that generates a continuous pattern of (pseudo-)random +numbers between 0 and 1. -@ -sound "bd*8" # pan rand -@ +For example, to randomly pan around the stereo field: -pans bass drums randomly, and +> d1 $ sound "bd*8" # pan rand -@ -sound "sn sn ~ sn" # gain rand -@ +Or to enjoy a randomised speed from 0.5 to 1.5, add 0.5 to it: + +> d1 $ sound "arpy*4" # speed (rand + 0.5) + +To make the snares randomly loud and quiet: -makes the snares randomly loud and quiet. +> sound "sn sn ~ sn" # gain rand Numbers coming from this pattern are \'seeded\' by time. So if you reset time (using 'resetCycles', 'setCycle', or 'cps') the random pattern will emit the @@ -116,15 +117,11 @@ In cases where you need two different random patterns, you can shift one of them around to change the time from which the _random_ pattern is read, note the difference: -@ -jux (# gain rand) $ sound "sn sn ~ sn" # gain rand -@ +> jux (# gain rand) $ sound "sn sn ~ sn" # gain rand and with the juxed version shifted backwards for 1024 cycles: -@ -jux (# ((1024 <~) $ gain rand)) $ sound "sn sn ~ sn" # gain rand -@ +> jux (# ((1024 <~) $ gain rand)) $ sound "sn sn ~ sn" # gain rand -} rand :: Fractional a => Pattern a rand = Pattern (\(State a@(Arc s e) _) -> [Event (Context []) Nothing a (realToFrac $ (timeToRand ((e + s)/2) :: Double))]) @@ -153,14 +150,15 @@ irand = (>>= _irand) _irand :: Num a => Int -> Pattern a _irand i = fromIntegral . (floor :: Double -> Int) . (* fromIntegral i) <$> rand -{- | 1D Perlin (smooth) noise, works like rand but smoothly moves between random -values each cycle. `perlinWith` takes a pattern as the RNG's "input" instead -of automatically using the cycle count. -@ -d1 $ s "arpy*32" # cutoff (perlinWith (saw * 4) * 2000) -@ +{- | 1D Perlin (smooth) noise, works like 'rand' but smoothly moves between random +values each cycle. @perlinWith@ takes a pattern as the random number generator's +"input" instead of automatically using the cycle count. + +> d1 $ s "arpy*32" # cutoff (perlinWith (saw * 4) * 2000) + will generate a smooth random pattern for the cutoff frequency which will -repeat every cycle (because the saw does) +repeat every cycle (because the saw does). + The `perlin` function uses the cycle count as input and can be used much like @rand@. -} perlinWith :: Fractional a => Pattern Double -> Pattern a @@ -170,23 +168,33 @@ perlinWith p = fmap realToFrac $ (interp) <$> (p-pa) <*> (timeToRand <$> pa) <*> interp x a b = a + smootherStep x * (b-a) smootherStep x = 6.0 * x**5 - 15.0 * x**4 + 10.0 * x**3 --- | As 'perlin' with a suitable choice of input pattern (@'sig' 'fromRational'@). +{- | As 'perlin' with a suitable choice of input pattern (@'sig' 'fromRational'@). + + The @perlin@ function produces a new random value to move to every cycle. If + you want a new random value to be generated more or less frequently, you can use + fast or slow, respectively: + + > d1 $ sound "bd*32" # speed (fast 4 $ perlin + 0.5) + > d1 $ sound "bd*32" # speed (slow 4 $ perlin + 0.5) +-} perlin :: Fractional a => Pattern a perlin = perlinWith (sig fromRational) -{-| `perlin2With` is Perlin noise with a 2-dimensional input. This can be +{-| @perlin2With@ is Perlin noise with a 2-dimensional input. This can be useful for more control over how the randomness repeats (or doesn't). @ d1 - $ s "[supersaw:-12*32]" - # lpf (rangex 60 5000 $ perlin2With (cosine*2) (sine*2)) - # lpq 0.3 + $ s "[supersaw:-12*32]" + # lpf (rangex 60 5000 $ perlin2With (cosine*2) (sine*2)) + # lpq 0.3 @ -will generate a smooth random cutoff pattern that repeats every cycle without -any reversals or discontinuities (because the 2D path is a circle). -`perlin2` only needs one input because it uses the cycle count as the -second input. + +The above will generate a smooth random cutoff pattern that repeats every cycle +without any reversals or discontinuities (because the 2D path is a circle). + +See also: `perlin2`, which only needs one input because it uses the cycle count +as the second input. -} perlin2With :: Pattern Double -> Pattern Double -> Pattern Double perlin2With x y = (/2) . (+1) $ interp2 <$> xfrac <*> yfrac <*> dota <*> dotb <*> dotc <*> dotd where @@ -209,23 +217,34 @@ perlin2With x y = (/2) . (+1) $ interp2 <$> xfrac <*> yfrac <*> dota <*> dotb <* perlin2 :: Pattern Double -> Pattern Double perlin2 = perlin2With (sig fromRational) -{- | Randomly picks an element from the given list +{- | Randomly picks an element from the given list. @ sound "superpiano(3,8)" # note (choose ["a", "e", "g", "c"]) @ plays a melody randomly choosing one of the four notes \"a\", \"e\", \"g\", \"c\". + +As with all continuous patterns, you have to be careful to give them structure; in this case choose gives you an infinitely detailed stream of random choices. + +> choose = 'chooseBy' 'rand' -} choose :: [a] -> Pattern a choose = chooseBy rand -{- | Given a pattern of doubles, 'chooseBy' normalizes them so that each +{- | Given a pattern of doubles, @chooseBy@ normalizes them so that each corresponds to an index in the provided list. The returned pattern contains the corresponding elements in the list. +It is like choose, but instead of selecting elements of the list randomly, it +uses the given pattern to select elements. + @'choose' = chooseBy 'rand'@ + +The following results in the pattern @"a b c"@: + +> chooseBy "0 0.25 0.5" ["a","b","c","d"] -} chooseBy :: Pattern Double -> [a] -> Pattern a chooseBy _ [] = silence @@ -240,16 +259,14 @@ sound "superpiano(3,8)" # note (wchoose [("a",1), ("e",0.5), ("g",2), ("c",1)]) In the above example, the "a" and "c" notes are twice as likely to play as the "e" note, and half as likely to play as the "g" note. +> wchoose = 'wchooseBy' 'rand' -} wchoose :: [(a,Double)] -> Pattern a wchoose = wchooseBy rand -{- | Given a pattern of probabilities and an list of @(value, weight)@ pairs, -'wchooseBy' creates a @'Pattern' value@ by choosing values based on those -probabilities and, weighted appropriately by the weights in the list of pairs. - -@'wchoose' = wchooseBy 'rand'@ - +{- | Given a pattern of probabilities and a list of @(value, weight)@ pairs, +@wchooseBy@ creates a @'Pattern' value@ by choosing values based on those +probabilities and weighted appropriately by the weights in the list of pairs. -} wchooseBy :: Pattern Double -> [(a,Double)] -> Pattern a wchooseBy pat pairs = match <$> pat @@ -259,41 +276,45 @@ wchooseBy pat pairs = match <$> pat values = map fst pairs total = sum $ map snd pairs --- | @randcat ps@: does a @slowcat@ on the list of patterns @ps@ but --- randomises the order in which they are played. +{-| @randcat ps@: does a @slowcat@ on the list of patterns @ps@ but + randomises the order in which they are played. + + > d1 $ sound (randcat ["bd*2 sn", "jvbass*3", "drum*2", "ht mt"]) +-} randcat :: [Pattern a] -> Pattern a randcat ps = spread' rotL (_segment 1 $ (% 1) . fromIntegral <$> (_irand (length ps) :: Pattern Int)) (slowcat ps) --- | As 'randcat', but allowing weighted choice. +{-| As 'randcat', but allowing weighted choice. + + In the following, the first pattern is the most likely and will play about half the time, and the last pattern is the less likely, with only a 10% probability. + + > d1 $ sound + > $ wrandcat + > [ ("bd*2 sn", 5), ("jvbass*3", 2), ("drum*2", 2), ("ht mt", 1) ] +-} wrandcat :: [(Pattern a, Double)] -> Pattern a wrandcat ps = unwrap $ wchooseBy (segment 1 rand) ps -{- | `degrade` randomly removes events from a pattern 50% of the time: +{- | @degrade@ randomly removes events from a pattern 50% of the time: -@ -d1 $ slow 2 $ degrade $ sound "[[[feel:5*8,feel*3] feel:3*8], feel*4]" - # accelerate "-6" - # speed "2" -@ +> d1 $ slow 2 $ degrade $ sound "[[[feel:5*8,feel*3] feel:3*8], feel*4]" +> # accelerate "-6" +> # speed "2" -The shorthand syntax for `degrade` is a question mark: `?`. Using `?` +The shorthand syntax for @degrade@ is a question mark: @?@. Using @?@ will allow you to randomly remove events from a portion of a pattern: -@ -d1 $ slow 2 $ sound "bd ~ sn bd ~ bd? [sn bd?] ~" -@ +> d1 $ slow 2 $ sound "bd ~ sn bd ~ bd? [sn bd?] ~" -You can also use `?` to randomly remove events from entire sub-patterns: +You can also use @?@ to randomly remove events from entire sub-patterns: -@ -d1 $ slow 2 $ sound "[[[feel:5*8,feel*3] feel:3*8]?, feel*4]" -@ +> d1 $ slow 2 $ sound "[[[feel:5*8,feel*3] feel:3*8]?, feel*4]" -} degrade :: Pattern a -> Pattern a degrade = _degradeBy 0.5 {- | -Similar to `degrade`, `degradeBy` allows you to control the percentage of events that +Similar to `degrade`, @degradeBy@ allows you to control the percentage of events that are removed. For example, to remove events 90% of the time: @ @@ -369,38 +390,43 @@ pattern before probabilities are taken into account. sometimesBy' :: Pattern Double -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a sometimesBy' x f pat = overlay (degradeBy x pat) (unDegradeBy x $ f pat) --- | @sometimes@ is an alias for @sometimesBy 0.5@. +-- | @sometimes@ is an alias for @'sometimesBy' 0.5@. sometimes :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a sometimes = sometimesBy 0.5 +-- | @sometimes'@ is an alias for @'sometimesBy'' 0.5@. sometimes' :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a sometimes' = sometimesBy' 0.5 --- | @often@ is an alias for @sometimesBy 0.75@. +-- | @often@ is an alias for @'sometimesBy' 0.75@. often :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a often = sometimesBy 0.75 +-- | @often'@ is an alias for @'sometimesBy'' 0.75@. often' :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a often' = sometimesBy' 0.75 --- | @rarely@ is an alias for @sometimesBy 0.25@. +-- | @rarely@ is an alias for @'sometimesBy' 0.25@. rarely :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a rarely = sometimesBy 0.25 +-- | @rarely'@ is an alias for @'sometimesBy'' 0.25@. rarely' :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a rarely' = sometimesBy' 0.25 --- | @almostNever@ is an alias for @sometimesBy 0.1@. +-- | @almostNever@ is an alias for @'sometimesBy' 0.1@. almostNever :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a almostNever = sometimesBy 0.1 +-- | @almostNever'@ is an alias for @'sometimesBy'' 0.1@. almostNever' :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a almostNever' = sometimesBy 0.1 --- | @almostAlways@ is an alias for @sometimesBy 0.9@. +-- | @almostAlways@ is an alias for @'sometimesBy' 0.9@. almostAlways :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a almostAlways = sometimesBy 0.9 +-- | @almostAlways'@ is an alias for @'sometimesBy'' 0.9@. almostAlways' :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a almostAlways' = sometimesBy' 0.9 @@ -423,7 +449,10 @@ always = id {- | @someCyclesBy@ is a cycle-by-cycle version of @'sometimesBy'@. -@someCycles = someCyclesBy 0.5@ + For example the following will either distort all of the events in a cycle, or + none of them: + + > d1 $ someCyclesBy 0.5 (# crush 2) $ n "0 1 [~ 2] 3" # sound "arpy" -} someCyclesBy :: Pattern Double -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a someCyclesBy pd f pat = innerJoin $ (\d -> _someCyclesBy d f pat) <$> pd @@ -432,29 +461,34 @@ _someCyclesBy :: Double -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a _someCyclesBy x = when test where test c = timeToRand (fromIntegral c :: Double) < x +-- | Alias of 'someCyclesBy'. somecyclesBy :: Pattern Double -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a somecyclesBy = someCyclesBy --- | @someCycles = someCyclesBy 0.5@ +-- | @someCycles = 'someCyclesBy' 0.5@ someCycles :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a someCycles = someCyclesBy 0.5 +-- | Alias of 'someCycles'. somecycles :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a somecycles = someCycles -- ** Pattern transformations +-- +-- $patternTransformations +-- +-- Pattern transformations are functions generally of type +-- @'Pattern' a -> 'Pattern' a@. This means they take a pattern of any type +-- and return a pattern of that type. -{- | -Pattern transformations are functions generally of type @'Pattern' a -> 'Pattern' a@. -This means they take a pattern of any type and return a pattern of that type. - - -This transformation makes a pattern sound a bit like a breakbeat. - -Example: +{-| +@brak@ makes a pattern sound a bit like a breakbeat. It does this by, every +other cycle, squashing the pattern to fit half a cycle, and offsetting it by a +quarter of a cycle. @ d1 $ sound (brak "bd sn kurt") +d1 $ brak $ sound "[feel feel:3, hc:3 hc:2 hc:4 ho:1]" @ -} brak :: Pattern a -> Pattern a @@ -488,16 +522,37 @@ iter = tParam _iter _iter :: Int -> Pattern a -> Pattern a _iter n p = slowcat $ map (\i -> (fromIntegral i % fromIntegral n) `rotL` p) [0 .. (n-1)] --- | @iter'@ is the same as @iter@, but decrements the starting --- subdivision instead of incrementing it. +{- | @iter'@ is the same as @iter@, but decrements the starting +subdivision instead of incrementing it. For example, + +@ +d1 $ iter' 4 $ sound "bd hh sn cp" +@ + +produces + +@ +bd hh sn cp +cp bd hh sn +sn cp bd hh +hh sn cp bd +@ +-} iter' :: Pattern Int -> Pattern c -> Pattern c iter' = tParam _iter' _iter' :: Int -> Pattern a -> Pattern a _iter' n p = slowcat $ map (\i -> (fromIntegral i % fromIntegral n) `rotR` p) [0 .. (n-1)] --- | @palindrome p@ applies @rev@ to @p@ every other cycle, so that --- the pattern alternates between forwards and backwards. +{- | @palindrome p@ applies @rev@ to @p@ every other cycle, so that the pattern +alternates between forwards and backwards. For example, these are equivalent: + +@ +d1 $ palindrome $ sound "arpy:0 arpy:1 arpy:2 arpy:3" +d1 $ slow 2 $ sound "arpy:0 arpy:1 arpy:2 arpy:3 arpy:3 arpy:2 arpy:1 arpy:0" +d1 $ every 2 rev $ sound "arpy:0 arpy:1 arpy:2 arpy:3" +@ +-} palindrome :: Pattern a -> Pattern a palindrome p = slowAppend p (rev p) @@ -520,43 +575,33 @@ fadeInFrom from dur p = innerJoin $ (`_degradeBy` p) <$> (from `rotR` _slow dur {- | The 'spread' function allows you to take a pattern transformation which takes a parameter, such as `slow`, and provide several -parameters which are switched between. In other words it 'spreads' a +parameters which are switched between. In other words it "spreads" a function across several values. Taking a simple high hat loop as an example: -@ -d1 $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ sound "ho ho:2 ho:3 hc" We can slow it down by different amounts, such as by a half: -@ -d1 $ slow 2 $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ slow 2 $ sound "ho ho:2 ho:3 hc" Or by four thirds (i.e. speeding it up by a third; @4%3@ means four over three): -@ -d1 $ slow (4%3) $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ slow (4%3) $ sound "ho ho:2 ho:3 hc" But if we use `spread`, we can make a pattern which alternates between the two speeds: -@ -d1 $ spread slow [2,4%3] $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ spread slow [2,4%3] $ sound "ho ho:2 ho:3 hc" Note that if you pass @($)@ as the function to spread values over, you can put functions as the list of values. ('spreadf' is an alias for @spread ($)@.) For example: -@ -d1 $ spread ($) [density 2, rev, slow 2, striate 3, (# speed "0.8")] - $ sound "[bd*2 [~ bd]] [sn future]*2 cp jvbass*4" -@ +> d1 $ spread ($) [density 2, rev, slow 2, striate 3, (# speed "0.8")] +> $ sound "[bd*2 [~ bd]] [sn future]*2 cp jvbass*4" Above, the pattern will have these transforms applied to it, one at a time, per cycle: @@ -577,11 +622,8 @@ slowspread = spread {- | @fastspread@ works the same as `spread`, but the result is squashed into a single cycle. If you gave four values to @spread@, then the result would seem to speed up by a factor of four. Compare these two: -@ - d1 $ spread chop [4,64,32,16] $ sound "ho ho:2 ho:3 hc" - - d1 $ fastspread chop [4,64,32,16] $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ spread chop [4,64,32,16] $ sound "ho ho:2 ho:3 hc" +> d1 $ fastspread chop [4,64,32,16] $ sound "ho ho:2 ho:3 hc" There is also `slowspread`, which is an alias of @spread@. -} @@ -590,23 +632,21 @@ fastspread f xs p = fastcat $ map (`f` p) xs {- | There's a version of this function, `spread'` (pronounced "spread prime"), which takes a /pattern/ of parameters, instead of a list: -@ -d1 $ spread' slow "2 4%3" $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ spread' slow "2 4%3" $ sound "ho ho:2 ho:3 hc" This is quite a messy area of Tidal—due to a slight difference of implementation this sounds completely different! One advantage of using `spread'` though is that you can provide polyphonic parameters, e.g.: -@ -d1 $ spread' slow "[2 4%3, 3]" $ sound "ho ho:2 ho:3 hc" -@ +> d1 $ spread' slow "[2 4%3, 3]" $ sound "ho ho:2 ho:3 hc" -} spread' :: Monad m => (a -> b -> m c) -> m a -> b -> m c spread' f vpat pat = vpat >>= \v -> f v pat {- | @spreadChoose f xs p@ is similar to `slowspread` but picks values from -`xs` at random, rather than cycling through them in order. +@xs@ at random, rather than cycling through them in order. + +> d1 $ spreadChoose ($) [gap 4, striate 4] $ sound "ho ho:2 ho:3 hc" -} spreadChoose :: (t -> t1 -> Pattern b) -> [t] -> t1 -> Pattern b spreadChoose f vs p = do v <- _segment 1 (choose vs) @@ -616,18 +656,24 @@ spreadChoose f vs p = do v <- _segment 1 (choose vs) spreadr :: (t -> t1 -> Pattern b) -> [t] -> t1 -> Pattern b spreadr = spreadChoose -{-| Decide whether to apply one or another function depending on the result of a test function that is passed the current cycle as a number. +{-| Decide whether to apply one or another function depending on the result of a test function, which is passed the current cycle as a number. @ -d1 $ ifp ((== 0).(flip mod 2)) - (striate 4) - (# coarse "24 48") $ - sound "hh hc" +d1 $ ifp ((== 0) . flip mod 2) + (striate 4) + (# coarse "24 48") + $ sound "hh hc" @ -This will apply @'striate' 4@ for every _even_ cycle and apply @# coarse "24 48"@ for every _odd_. +This will apply @'striate' 4@ for every /even/ cycle and apply @# coarse "24 48"@ for every /odd/. -Detail: As you can see the test function is arbitrary and does not rely on anything tidal specific. In fact it uses only plain haskell functionality, that is: it calculates the modulo of 2 of the current cycle which is either 0 (for even cycles) or 1. It then compares this value against 0 and returns the result, which is either `True` or `False`. This is what the `ifp` signature's first part signifies `(Int -> Bool)`, a function that takes a whole number and returns either `True` or `False`. +Detail: As you can see the test function is arbitrary and does not rely on +anything Tidal specific. In fact it uses only plain Haskell functionality, that +is: it calculates the modulo of 2 of the current cycle which is either 0 (for +even cycles) or 1. It then compares this value against 0 and returns the result, +which is either @True@ or @False@. This is what the @ifp@ signature's first part +signifies: @(Int -> Bool)@, a function that takes a whole number and returns +either @True@ or @False@. -} ifp :: (Int -> Bool) -> (Pattern a -> Pattern a) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a ifp test f1 f2 p = splitQueries $ p {query = q} @@ -637,6 +683,7 @@ ifp test f1 f2 p = splitQueries $ p {query = q} -- | @wedge t p p'@ combines patterns @p@ and @p'@ by squashing the -- @p@ into the portion of each cycle given by @t@, and @p'@ into the -- remainer of each cycle. +-- > d1 $ wedge (1/4) (sound "bd*2 arpy*3 cp sn*2") (sound "odx [feel future]*2 hh hh") wedge :: Pattern Time -> Pattern a -> Pattern a -> Pattern a wedge pt pa pb = innerJoin $ (\t -> _wedge t pa pb) <$> pt @@ -647,16 +694,14 @@ _wedge t p p' = overlay (_fastGap (1/t) p) (t `rotR` _fastGap (1/(1-t)) p') {- | @whenmod@ has a similar form and behavior to `every`, but requires an -additional number. Applies the function to the pattern, when the -remainder of the current loop number divided by the first parameter, +additional number. It applies the function to the pattern when the +remainder of the current loop number divided by the first parameter is greater or equal than the second parameter. -For example the following makes every other block of four loops twice +For example, the following makes every other block of four loops twice as dense: -@ -d1 $ whenmod 8 4 (density 2) (sound "bd sn kurt") -@ +> d1 $ whenmod 8 4 (density 2) (sound "bd sn kurt") -} whenmod :: Pattern Time -> Pattern Time -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a whenmod a b f pat = innerJoin $ (\a' b' -> _whenmod a' b' f pat) <$> a <*> b @@ -666,17 +711,21 @@ _whenmod a b = whenT (\t -> ((t `mod'` a) >= b )) {- | -@ -superimpose f p = stack [p, f p] -@ +> superimpose f p = stack [p, f p] -`superimpose` plays a modified version of a pattern at the same time as the original pattern, -resulting in two patterns being played at the same time. +@superimpose@ plays a modified version of a pattern at the same time as the +original pattern, resulting in two patterns being played at the same time. The +following are equivalent: -@ -d1 $ superimpose (density 2) $ sound "bd sn [cp ht] hh" -d1 $ superimpose ((# speed "2") . (0.125 <~)) $ sound "bd sn cp hh" -@ +> d1 $ superimpose (fast 2) $ sound "bd sn [cp ht] hh" +> d1 $ stack [sound "bd sn [cp ht] hh", +> fast 2 $ sound "bd sn [cp ht] hh" +> ] + +More examples: + +> d1 $ superimpose (density 2) $ sound "bd sn [cp ht] hh" +> d1 $ superimpose ((# speed "2") . (0.125 <~)) $ sound "bd sn cp hh" -} superimpose :: (Pattern a -> Pattern a) -> Pattern a -> Pattern a @@ -685,9 +734,11 @@ superimpose f p = stack [p, f p] {- | @trunc@ truncates a pattern so that only a fraction of the pattern is played. The following example plays only the first quarter of the pattern: -@ -d1 $ trunc 0.25 $ sound "bd sn*2 cp hh*4 arpy bd*2 cp bd*2" -@ +> d1 $ trunc 0.25 $ sound "bd sn*2 cp hh*4 arpy bd*2 cp bd*2" + +You can also pattern the first parameter, for example to cycle through three values, one per cycle: + +> d1 $ trunc "<0.75 0.25 1>" $ sound "bd sn:2 [mt rs] hc" -} trunc :: Pattern Time -> Pattern a -> Pattern a trunc = tParam _trunc @@ -695,19 +746,35 @@ trunc = tParam _trunc _trunc :: Time -> Pattern a -> Pattern a _trunc t = compress (0, t) . zoomArc (Arc 0 t) -{- | @linger@ is similar to `trunc` but the truncated part of the pattern loops until the end of the cycle. +{- | @linger@ is similar to `trunc`, in that it truncates a pattern so that +only the first fraction of the pattern is played, but the truncated part of the +pattern loops to fill the remainder of the cycle. -@ -d1 $ linger 0.25 $ sound "bd sn*2 cp hh*4 arpy bd*2 cp bd*2" -@ +> d1 $ linger 0.25 $ sound "bd sn*2 cp hh*4 arpy bd*2 cp bd*2" + +For example this repeats the first quarter, so you only hear a single repeating note: + +> d1 $ linger 0.25 $ n "0 2 [3 4] 2" # sound "arpy" + +or slightly more interesting, applied only every fourth cycle: + +> d1 $ every 4 (linger 0.25) $ n "0 2 [3 4] 2" # sound "arpy" + +or to a chopped-up sample: + +> d1 $ every 2 (linger 0.25) $ loopAt 2 $ chop 8 $ sound "breaks125" + +You can also pattern the first parameter, for example to cycle through three +values, one per cycle: + +> d1 $ linger "<0.75 0.25 1>" $ sound "bd sn:2 [mt rs] hc" +> d1 $ linger "<0.25 0.5 1>" $ loopAt 2 $ chop 8 $ sound "breaks125" If you give it a negative number, it will linger on the last part of the pattern, instead of the start of it. E.g. to linger on the last quarter: -@ -d1 $ linger (-0.25) $ sound "bd sn*2 cp hh*4 arpy bd*2 cp bd*2" -@ +> d1 $ linger (-0.25) $ sound "bd sn*2 cp hh*4 arpy bd*2 cp bd*2" -} linger :: Pattern Time -> Pattern a -> Pattern a linger = tParam _linger @@ -717,18 +784,18 @@ _linger n p | n < 0 = _fast (1/n) $ zoomArc (Arc (1 + n) 1) p | otherwise = _fast (1/n) $ zoomArc (Arc 0 n) p {- | -Use `within` to apply a function to only a part of a pattern. For example, to -apply `density 2` to only the first half of a pattern: +Use @within@ to apply a function to only a part of a pattern. It takes two +arguments: a start time and an end time, specified as floats between 0 and 1, +which are applied to the relevant pattern. Note that the second argument must be +greater than the first for the function to have any effect. -@ -d1 $ within (0, 0.5) (density 2) $ sound "bd*2 sn lt mt hh hh hh hh" -@ +For example, to apply @'fast' 2@ to only the first half of a pattern: -Or, to apply `(# speed "0.5") to only the last quarter of a pattern: +> d1 $ within (0, 0.5) (fast 2) $ sound "bd*2 sn lt mt hh hh hh hh" -@ -d1 $ within (0.75, 1) (# speed "0.5") $ sound "bd*2 sn lt mt hh hh hh hh" -@ +Or, to apply @(# 'speed' "0.5")@ to only the last quarter of a pattern: + +> d1 $ within (0.75, 1) (# speed "0.5") $ sound "bd*2 sn lt mt hh hh hh hh" -} within :: (Time, Time) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a within (s, e) f p = stack [filterWhen (\t -> cyclePos t >= s && cyclePos t < e) $ f p, @@ -744,30 +811,21 @@ The difference between the two occurs when applying functions that change the ti within first applies the function to all notes in the cycle, then keeps the results in the specified interval, and then combines it with the old cycle (an "apply split combine" paradigm). within' first keeps notes in the specified interval, then applies the function to these notes, and then combines it with the old cycle (a "split apply combine" paradigm). - For example, whereas using the standard version of within -@ -d1 $ within (0, 0.25) (fast 2) $ sound "bd hh cp sd" -@ +> d1 $ within (0, 0.25) (fast 2) $ sound "bd hh cp sd" sounds like: -@ -d1 $ sound "[bd hh] hh cp sd" -@ +> d1 $ sound "[bd hh] hh cp sd" using this alternative version, within' -@ -d1 $ within' (0, 0.25) (fast 2) $ sound "bd hh cp sd" -@ +> d1 $ within' (0, 0.25) (fast 2) $ sound "bd hh cp sd" sounds like: -@ -d1 $ sound "[bd bd] hh cp sd" -@ +> d1 $ sound "[bd bd] hh cp sd" -} within' :: (Time, Time) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a @@ -787,9 +845,7 @@ revArc a = within a rev {- | You can use the @euclid@ function to apply a Euclidean algorithm over a complex pattern, although the structure of that pattern will be lost: -@ -d1 $ euclid 3 8 $ sound "bd*2 [sn cp]" -@ +> d1 $ euclid 3 8 $ sound "bd*2 [sn cp]" In the above, three sounds are picked from the pattern on the right according to the structure given by the @euclid 3 8@. It ends up picking two @bd@ sounds, a @@ -806,29 +862,55 @@ more about this in the paper by Toussaint. Some examples from this paper are included below, including rotation as a third parameter in some cases (see 'euclidOff'). -@ -- (2,5) : A thirteenth century Persian rhythm called Khafif-e-ramal. -- (3,4) : The archetypal pattern of the Cumbia from Colombia, as well as a Calypso rhythm from Trinidad. -- (3,5,2) : Another thirteenth century Persian rhythm by the name of Khafif-e-ramal, as well as a Rumanian folk-dance rhythm. -- (3,7) : A Ruchenitza rhythm used in a Bulgarian folk-dance. -- (3,8) : The Cuban tresillo pattern. -- (4,7) : Another Ruchenitza Bulgarian folk-dance rhythm. -- (4,9) : The Aksak rhythm of Turkey. -- (4,11) : The metric pattern used by Frank Zappa in his piece titled Outside Now. -- (5,6) : Yields the York-Samai pattern, a popular Arab rhythm. -- (5,7) : The Nawakhat pattern, another popular Arab rhythm. -- (5,8) : The Cuban cinquillo pattern. -- (5,9) : A popular Arab rhythm called Agsag-Samai. -- (5,11) : The metric pattern used by Moussorgsky in Pictures at an Exhibition. -- (5,12) : The Venda clapping pattern of a South African children’s song. -- (5,16) : The Bossa-Nova rhythm necklace of Brazil. -- (7,8) : A typical rhythm played on the Bendir (frame drum). -- (7,12) : A common West African bell pattern. -- (7,16,14) : A Samba rhythm necklace from Brazil. -- (9,16) : A rhythm necklace used in the Central African Republic. -- (11,24,14) : A rhythm necklace of the Aka Pygmies of Central Africa. -- (13,24,5) : Another rhythm necklace of the Aka Pygmies of the upper Sangha. -@ ++------------+-----------------------------------------------------------------+ +| Pattern | Example | ++============+=================================================================+ +| (2,5) | A thirteenth century Persian rhythm called Khafif-e-ramal. | ++------------+-----------------------------------------------------------------+ +| (3,4) | The archetypal pattern of the Cumbia from Colombia, as well as | +| | a Calypso rhythm from Trinidad. | ++------------+-----------------------------------------------------------------+ +| (3,5,2) | Another thirteenth century Persian rhythm by the name of | +| | Khafif-e-ramal, as well as a Rumanian folk-dance rhythm. | ++------------+-----------------------------------------------------------------+ +| (3,7) | A Ruchenitza rhythm used in a Bulgarian folk-dance. | ++------------+-----------------------------------------------------------------+ +| (3,8) | The Cuban tresillo pattern. | ++------------+-----------------------------------------------------------------+ +| (4,7) | Another Ruchenitza Bulgarian folk-dance rhythm. | ++------------+-----------------------------------------------------------------+ +| (4,9) | The Aksak rhythm of Turkey. | ++------------+-----------------------------------------------------------------+ +| (4,11) | The metric pattern used by Frank Zappa in his piece titled | +| | Outside Now. | ++------------+-----------------------------------------------------------------+ +| (5,6) | Yields the York-Samai pattern, a popular Arab rhythm. | ++------------+-----------------------------------------------------------------+ +| (5,7) | The Nawakhat pattern, another popular Arab rhythm. | ++------------+-----------------------------------------------------------------+ +| (5,8) | The Cuban cinquillo pattern. | ++------------+-----------------------------------------------------------------+ +| (5,9) | A popular Arab rhythm called Agsag-Samai. | ++------------+-----------------------------------------------------------------+ +| (5,11) | The metric pattern used by Moussorgsky in | +| | Pictures at an Exhibition. | ++------------+-----------------------------------------------------------------+ +| (5,12) | The Venda clapping pattern of a South African children’s song. | ++------------+-----------------------------------------------------------------+ +| (5,16) | The Bossa-Nova rhythm necklace of Brazil. | ++------------+-----------------------------------------------------------------+ +| (7,8) | A typical rhythm played on the Bendir (frame drum). | ++------------+-----------------------------------------------------------------+ +| (7,12) | A common West African bell pattern. | ++------------+-----------------------------------------------------------------+ +| (7,16,14) | A Samba rhythm necklace from Brazil. | ++------------+-----------------------------------------------------------------+ +| (9,16) | A rhythm necklace used in the Central African Republic. | ++------------+-----------------------------------------------------------------+ +| (11,24,14) | A rhythm necklace of the Aka Pygmies of Central Africa. | ++------------+-----------------------------------------------------------------+ +| (13,24,5) | Another rhythm necklace of the Aka Pygmies of the upper Sangha. | ++------------+-----------------------------------------------------------------+ There was once a shorter alias @e@ for this function. It has been removed, but you may see references to it in older Tidal code. @@ -842,11 +924,14 @@ _euclid n k a | n >= 0 = fastcat $ fmap (bool silence a) $ bjorklund (n,k) {- | -@euclidFull n k pa pb@ stacks @'euclid' n k pa@ with @'euclidInv' n k pb@. For example, -to implement the traditional flamenco rhythm, you could use hard claps for the former -and soft claps for the latter: +@euclidFull n k pa pb@ stacks @'euclid' n k pa@ with @'euclidInv' n k pb@. That +is, it plays one pattern on the euclidean rhythm and a different pattern on +the off-beat. -@d1 $ euclidFull 3 7 "realclaps" ("realclaps" # gain 0.8)@ +For example, to implement the traditional flamenco rhythm, you could use hard +claps for the former and soft claps for the latter: + +> d1 $ euclidFull 3 7 "realclaps" ("realclaps" # gain 0.8) -} euclidFull :: Pattern Int -> Pattern Int -> Pattern a -> Pattern a -> Pattern a @@ -854,16 +939,15 @@ euclidFull n k pa pb = stack [ euclid n k pa, euclidInv n k pb ] -- | Less expressive than 'euclid' due to its constrained types, but may be more efficient. _euclidBool :: Int -> Int -> Pattern Bool -- TODO: add 'euclidBool'? -_euclidBool n k = fastFromList $ bjorklund (n,k) +_euclidBool n k | n >= 0 = fastFromList $ bjorklund (n,k) + | otherwise = fastFromList $ fmap (not) $ bjorklund (-n,k) _euclid' :: Int -> Int -> Pattern a -> Pattern a _euclid' n k p = fastcat $ map (\x -> if x then p else silence) (bjorklund (n,k)) {- | - As 'euclid', but taking a third rotational parameter corresponding to the onset at which to start the rhythm. - -} euclidOff :: Pattern Int -> Pattern Int -> Pattern Int -> Pattern a -> Pattern a euclidOff = tParam3 _euclidOff @@ -899,9 +983,25 @@ _distrib xs p = boolsToPat (foldr distrib' (replicate (last xs) True) (reverse $ layers = map bjorklund . (zip<*>tail) boolsToPat a b' = flip const <$> filterValues (== True) (fastFromList a) <* b' -{- | `euclidInv` fills in the blanks left by `euclid`. +{-| @euclidInv@ fills in the blanks left by `euclid`, i.e., it inverts the +pattern. -Whereas @euclid 3 8 "x"@ produces @"x ~ ~ x ~ ~ x ~"@, @euclidInv 3 8 "x"@ produces @"~ x x ~ x x ~ x"@. +For example, whereas @euclid 3 8 "x"@ produces + +> "x ~ ~ x ~ ~ x ~" + +@euclidInv 3 8 "x"@ produces + +> "~ x x ~ x x ~ x" + +As another example, in + +> d1 $ stack [ euclid 5 8 $ s "bd" +> , euclidInv 5 8 $ s "hh27" +> ] + +the hi-hat event fires on every one of the eight even beats that the bass drum +does not. -} euclidInv :: Pattern Int -> Pattern Int -> Pattern a -> Pattern a euclidInv = tParam2 _euclidInv @@ -1016,8 +1116,28 @@ pequal :: Ord a => Time -> Pattern a -> Pattern a -> Bool pequal cycles p1 p2 = (sort $ arc p1 (0, cycles)) == (sort $ arc p2 (0, cycles)) -} --- | @rot n p@ rotates the values in a pattern @p@ by @n@ beats to the left. --- Example: @d1 $ every 4 (rot 2) $ slow 2 $ sound "bd hh hh hh"@ +{- | @rot n p@ "rotates" the values in a pattern @p@ by @n@ beats to the left, +preserving its structure. For example, in the following, each value will shift +to its neighbour's position one step to the left, so that @b@ takes the place of +@a@, @a@ of @c@, and @c@ of @b@: + +> rot 1 "a ~ b c" + +The result is equivalent of: + +> "b ~ c a" + +The first parameter is the number of steps, and may be given as a pattern. For example, in + +> d1 $ rot "<0 0 1 3>" $ n "0 ~ 1 2 0 2 ~ 3*2" # sound "drum" + +the pattern will not be rotated for the first two cycles, but will rotate it +by one the third cycle, and by three the fourth cycle. + +Additional example: + +> d1 $ every 4 (rot 2) $ slow 2 $ sound "bd hh hh hh" +-} rot :: Ord a => Pattern Int -> Pattern a -> Pattern a rot = tParam _rot @@ -1042,9 +1162,15 @@ _rot i pat = splitQueries $ pat {query = \st -> f st (query pat (st {arc = whole p' <- subArc (part e) a return e {part = p'} --- | @segment n p@: ’samples’ the pattern @p@ at a rate of @n@ --- events per cycle. Useful for turning a continuous pattern into a --- discrete one. +{-| @segment n p@ ’samples’ the pattern @p@ at a rate of @n@ events per cycle. +Useful for turning a continuous pattern into a discrete one. + +In the following example, the pattern originates from the shape of a sine +wave, a continuous pattern. Without @segment@, the samples will get triggered +at an undefined frequency which may be very high. + +> d1 $ n (slow 2 $ segment 16 $ range 0 32 $ sine) # sound "amencutup" +-} segment :: Pattern Time -> Pattern a -> Pattern a segment = tParam _segment @@ -1093,11 +1219,14 @@ toMIDI p = fromJust <$> (filterValues (isJust) (noteLookup <$> p)) {- | The `fit` function takes a pattern of integer numbers, which are used to select values from the given list. What makes this a bit strange is that only a given number of values are selected each cycle. For example: -@ -d1 $ sound (fit 3 ["bd", "sn", "arpy", "arpy:1", "casio"] "0 [~ 1] 2 1") -@ +> d1 $ sound (fit 3 ["bd", "sn", "arpy", "arpy:1", "casio"] "0 [~ 1] 2 1") -The above fits three samples into the pattern, i.e. for the first cycle this will be `"bd"`, `"sn"` and `"arpy"`, giving the result `"bd [~ sn] arpy sn"` (note that we start counting at zero, so that `0` picks the first value). The following cycle the *next* three values in the list will be picked, i.e. `"arpy:1"`, `"casio"` and `"bd"`, giving the pattern `"arpy:1 [~ casio] bd casio"` (note that the list wraps round here). +The above fits three samples into the pattern, i.e. for the first cycle this +will be @"bd"@, @"sn"@ and @"arpy"@, giving the result @"bd [~ sn] arpy sn"@ +(note that we start counting at zero, so that 0 picks the first value). The +following cycle the /next/ three values in the list will be picked, i.e. +@"arpy:1"@, @"casio"@ and @"bd"@, giving the pattern +@"arpy:1 [~ casio] bd casio"@ (note that the list wraps round here). -} fit :: Pattern Int -> [a] -> Pattern Int -> Pattern a @@ -1118,9 +1247,37 @@ permstep nSteps things p = unwrap $ (\n -> fastFromList $ concatMap (\x -> repli perms 1 n = [[n]] perms n total = concatMap (\x -> map (x:) $ perms (n-1) (total-x)) [1 .. (total-(n-1))] --- | @struct a b@: structures pattern @b@ in terms of the pattern of --- boolean values @a@. Only @True@ values in the boolean pattern are --- used. +{-| + @struct a b@ structures pattern @b@ in terms of the pattern of boolean + values @a@. Only @True@ values in the boolean pattern are used. + + The following are equivalent: + + > d1 $ struct ("t ~ t*2 ~") $ sound "cp" + > d1 $ sound "cp ~ cp*2 ~" + + The structure comes from a boolean pattern, i.e. a binary pattern containing + true or false values. Above we only used true values, denoted by @t@. It’s also + possible to include false values with @f@, which @struct@ will simply treat as + silence. For example, this would have the same outcome as the above: + + > d1 $ struct ("t f t*2 f") $ sound "cp" + + These true / false binary patterns become useful when you conditionally + manipulate them, for example, ‘inverting’ the values using 'every' and 'inv': + + > d1 $ struct (every 3 inv "t f t*2 f") $ sound "cp" + + In the above, the boolean values will be ‘inverted’ every third cycle, so that + the structure comes from the @f@s rather than @t@. Note that euclidean patterns + also create true/false values, for example: + + > d1 $ struct (every 3 inv "t(3,8)") $ sound "cp" + + In the above, the euclidean pattern creates @"t f t f t f f t"@ which gets + inverted to @"f t f t f t t f"@ every third cycle. Note that if you prefer you + can use 1 and 0 instead of @t@ and @f@. +-} struct :: Pattern Bool -> Pattern a -> Pattern a struct ps pv = filterJust $ (\a b -> if a then Just b else Nothing ) <$> ps <* pv @@ -1163,11 +1320,21 @@ substruct' s p = p {query = \st -> concatMap (f st) (query s st)} -- Ignore analog events (ones without wholes) f _ _ = [] --- | @stripe n p@: repeats pattern @p@, @n@ times per cycle. So --- similar to @fast@, but with random durations. The repetitions will --- be continguous (touching, but not overlapping) and the durations --- will add up to a single cycle. @n@ can be supplied as a pattern of --- integers. +{- | @stripe n p@: repeats pattern @p@ @n@ times per cycle, i.e., the first +parameter gives the number of cycles to operate over. So, it is similar to +@fast@, but with random durations. For example @stripe 2@ will repeat a pattern +twice, over two cycles + +In the following example, the start of every third repetition of the @d1@ +pattern will match with the clap on the @d2@ pattern. + +> d1 $ stripe 3 $ sound "bd sd ~ [mt ht]" +> d2 $ sound "cp" + +The repetitions will be contiguous (touching, but not overlapping) and the +durations will add up to a single cycle. @n@ can be supplied as a pattern of +integers. +-} stripe :: Pattern Int -> Pattern a -> Pattern a stripe = tParam _stripe @@ -1195,13 +1362,27 @@ parseLMRule' :: String -> [(Char, String)] parseLMRule' str = map fixer $ parseLMRule str where fixer (c,r) = (head c, r) -{- | Returns the `n`th iteration of a [Lindenmayer System](https://en.wikipedia.org/wiki/L-system) with given start sequence. +{- | Returns the @n@th iteration of a + [Lindenmayer System](https://en.wikipedia.org/wiki/L-system) + with given start sequence. -An example + It takes an integer @b@, a Lindenmayer system rule set, and an initiating + string as input in order to generate an L-system tree string of @b@ iterations. + It can be used in conjunction with a step function to convert the generated + string into a playable pattern. For example, + + > d1 $ slow 16 + > $ sound + > $ step' ["feel:0", "sn:1", "bd:0"] + > ( take 512 + > $ lindenmayer 5 "0:1~~~,1:0~~~2~~~~~0~~~2~,2:2~1~,~:~~1~" "0" + > ) + + generates an L-system with initiating string @"0"@ and maps it onto a list + of samples. + + Complex L-system trees with many rules and iterations can sometimes result in unwieldy strings. Using @take n@ to only use the first @n@ elements of the string, along with a 'slow' function, can make the generated values more manageable. -@ -lindenmayer 1 "a:b,b:ab" "ab" -> "bab" -@ -} lindenmayer :: Int -> String -> String -> String lindenmayer _ _ [] = [] @@ -1232,12 +1413,11 @@ runMarkov n tp xi seed = reverse $ (iterate (markovStep $ renorm) [xi])!! (n-1) r = timeToRand $ seed + (fromIntegral . length) xs / fromIntegral n renorm = [ map (/ sum x) x | x <- tp ] -{- @markovPat n xi tp@ generates a one-cycle pattern of @n@ steps in a Markov +{- | @markovPat n xi tp@ generates a one-cycle pattern of @n@ steps in a Markov chain starting from state @xi@ with transition matrix @tp@. Each row of the transition matrix is automatically normalized. For example: -@ -tidal> markovPat 8 1 [[3,5,2], [4,4,2], [0,1,0]] +>>> markovPat 8 1 [[3,5,2], [4,4,2], [0,1,0]] (0>⅛)|1 (⅛>¼)|2 (¼>⅜)|1 @@ -1246,7 +1426,7 @@ tidal> markovPat 8 1 [[3,5,2], [4,4,2], [0,1,0]] (⅝>¾)|1 (¾>⅞)|1 (⅞>1)|0 -@ -} +-} markovPat :: Pattern Int -> Pattern Int -> [[Double]] -> Pattern Int markovPat = tParam2 _markovPat @@ -1255,62 +1435,84 @@ _markovPat n xi tp = splitQueries $ Pattern (\(State a@(Arc s _) _) -> queryArc (listToPat $ runMarkov n tp xi (sam s)) a) {-| -Removes events from second pattern that don't start during an event from first. +@mask@ takes a boolean pattern and ‘masks’ another pattern with it. That is, +events are only carried over if they match within a ‘true’ event in the binary +pattern, i.e., it removes events from the second pattern that don't start during +an event from the first. -Consider this, kind of messy rhythm without any rests. +For example, consider this kind of messy rhythm without any rests. -@ -d1 $ sound (slowcat ["sn*8", "[cp*4 bd*4, hc*5]"]) # n (run 8) -@ +> d1 $ sound (slowcat ["sn*8", "[cp*4 bd*4, hc*5]"]) # n (run 8) If we apply a mask to it @ -d1 $ s (mask ("1 1 1 ~ 1 1 ~ 1" :: Pattern Bool) - (slowcat ["sn*8", "[cp*4 bd*4, bass*5]"] )) +d1 $ s ( mask ("1 1 1 ~ 1 1 ~ 1" :: Pattern Bool) + ( slowcat ["sn*8", "[cp*4 bd*4, bass*5]"] ) + ) # n (run 8) @ -Due to the use of `slowcat` here, the same mask is first applied to `"sn*8"` and in the next cycle to `"[cp*4 bd*4, hc*5]". +Due to the use of `slowcat` here, the same mask is first applied to @"sn*8"@ and +in the next cycle to @"[cp*4 bd*4, hc*5]"@. -You could achieve the same effect by adding rests within the `slowcat` patterns, but mask allows you to do this more easily. It kind of keeps the rhythmic structure and you can change the used samples independently, e.g. +You could achieve the same effect by adding rests within the `slowcat` patterns, +but mask allows you to do this more easily. It kind of keeps the rhythmic +structure and you can change the used samples independently, e.g., @ -d1 $ s (mask ("1 ~ 1 ~ 1 1 ~ 1") - (slowcat ["can*8", "[cp*4 sn*4, jvbass*16]"] )) +d1 $ s ( mask ("1 ~ 1 ~ 1 1 ~ 1") + ( slowcat ["can*8", "[cp*4 sn*4, jvbass*16]"] ) + ) # n (run 8) @ -} mask :: Pattern Bool -> Pattern a -> Pattern a mask b p = const <$> p <* (filterValues id b) --- | TODO: refactor towards union +-- TODO: refactor towards union enclosingArc :: [Arc] -> Arc enclosingArc [] = Arc 0 1 enclosingArc as = Arc (minimum (map start as)) (maximum (map stop as)) +{-| + @stretch@ takes a pattern, and if there’s silences at the start or end of the + current cycle, it will zoom in to avoid them. The following are equivalent: + + > d1 $ note (stretch "~ 0 1 5 8*4 ~") # s "superpiano" + > d1 $ note "0 1 5 8*4" # s "superpiano" + + You can pattern silences on the extremes of a cycle to make changes to the rhythm: + + > d1 $ note (stretch "~ <0 ~> 1 5 8*4 ~") # s "superpiano" +-} stretch :: Pattern a -> Pattern a -- TODO - should that be whole or part? stretch p = splitQueries $ p {query = q} where q st = query (zoomArc (cycleArc $ enclosingArc $ map wholeOrPart $ query p (st {arc = Arc (sam s) (nextSam s)})) p) st where s = start $ arc st -{- | `fit'` is a generalization of `fit`, where the list is instead constructed by using another integer pattern to slice up a given pattern. The first argument is the number of cycles of that latter pattern to use when slicing. It's easier to understand this with a few examples: +{- | @fit'@ is a generalization of `fit`, where the list is instead constructed +by using another integer pattern to slice up a given pattern. The first argument +is the number of cycles of that latter pattern to use when slicing. It's easier +to understand this with a few examples: -@ -d1 $ sound (fit' 1 2 "0 1" "1 0" "bd sn") -@ +> d1 $ sound (fit' 1 2 "0 1" "1 0" "bd sn") -So what does this do? The first `1` just tells it to slice up a single cycle of `"bd sn"`. The `2` tells it to select two values each cycle, just like the first argument to `fit`. The next pattern `"0 1"` is the "from" pattern which tells it how to slice, which in this case means `"0"` maps to `"bd"`, and `"1"` maps to `"sn"`. The next pattern `"1 0"` is the "to" pattern, which tells it how to rearrange those slices. So the final result is the pattern `"sn bd"`. +So what does this do? The first @1@ just tells it to slice up a single cycle of +@"bd sn"@. The @2@ tells it to select two values each cycle, just like the first +argument to @fit@. The next pattern @"0 1"@ is the "from" pattern which tells +it how to slice, which in this case means @"0"@ maps to @"bd"@, and @"1"@ maps +to @"sn"@. The next pattern @"1 0"@ is the "to" pattern, which tells it how to +rearrange those slices. So the final result is the pattern @"sn bd"@. A more useful example might be something like -@ -d1 $ fit' 1 4 (run 4) "[0 3*2 2 1 0 3*2 2 [1*8 ~]]/2" $ chop 4 $ (sound "breaks152" # unit "c") -@ - -which uses `chop` to break a single sample into individual pieces, which `fit'` then puts into a list (using the `run 4` pattern) and reassembles according to the complicated integer pattern. +> d1 $ fit' 1 4 (run 4) "[0 3*2 2 1 0 3*2 2 [1*8 ~]]/2" +> $ chop 4 +> $ (sound "breaks152" # unit "c") +which uses @chop@ to break a single sample into individual pieces, which @fit'@ then puts into a list (using the @run 4@ pattern) and reassembles according to the complicated integer pattern. -} fit' :: Pattern Time -> Int -> Pattern Int -> Pattern Int -> Pattern a -> Pattern a fit' cyc n from to p = squeezeJoin $ _fit n mapMasks to @@ -1325,9 +1527,18 @@ fit' cyc n from to p = squeezeJoin $ _fit n mapMasks to - from left to right if chunk number is positive - from right to left if chunk number is negative - @ - d1 $ chunk 4 (fast 4) $ sound "cp sn arpy [mt lt]" - @ + > d1 $ chunk 4 (fast 4) $ sound "cp sn arpy [mt lt]" + + The following: + + > d1 $ chunk 4 (# speed 2) $ sound "bd hh sn cp" + + applies @(# speed 2)@ to the uppercased part of the cycle below: + + > BD hh sn cp + > bd HH sn cp + > bd hh SN cp + > bd hh sn CP -} chunk :: Pattern Int -> (Pattern b -> Pattern b) -> Pattern b -> Pattern b chunk npat f p = innerJoin $ (\n -> _chunk n f p) <$> npat @@ -1349,6 +1560,18 @@ _chunk' n f p = _chunk (-n) f p @inside@ carries out an operation /inside/ a cycle. For example, while @rev "0 1 2 3 4 5 6 7"@ is the same as @"7 6 5 4 3 2 1 0"@, @inside 2 rev "0 1 2 3 4 5 6 7"@ gives @"3 2 1 0 7 6 5 4"@. + +What this function is really doing is ‘slowing down’ the pattern by a given +factor, applying the given function to it, and then ‘speeding it up’ by the same +factor. In other words, this: + +> inside 2 rev "0 1 2 3 4 5 6 7" + +Is doing this: + +> fast 2 $ rev $ slow 2 "0 1 2 3 4 5 6 7" + +so rather than whole cycles, each half of a cycle is reversed. -} inside :: Pattern Time -> (Pattern a1 -> Pattern a) -> Pattern a1 -> Pattern a inside np f p = innerJoin $ (\n -> _inside n f p) <$> np @@ -1360,28 +1583,28 @@ _inside n f p = _fast n $ f (_slow n p) @outside@ is the inverse of the 'inside' function. @outside@ applies its function /outside/ the cycle. Say you have a pattern that takes 4 cycles to repeat and apply the rev function: -@ -d1 $ rev $ cat [s "bd bd sn",s "sn sn bd", s"lt lt sd", s "sd sd bd"] -@ +> d1 $ rev $ cat [s "bd bd sn",s "sn sn bd", s"lt lt sd", s "sd sd bd"] The above generates: -@ -d1 $ rev $ cat [s "sn bd bd",s "bd sn sn", s "sd lt lt", s "bd sd sd"] -@ +> d1 $ rev $ cat [s "sn bd bd",s "bd sn sn", s "sd lt lt", s "bd sd sd"] However if you apply @outside@: -@ -d1 $ outside 4 (rev) $ cat [s "bd bd sn",s "sn sn bd", s"lt lt sd", s "sd sd bd"] -@ +> d1 $ outside 4 (rev) $ cat [s "bd bd sn",s "sn sn bd", s"lt lt sd", s "sd sd bd"] The result is: -@ -d1 $ rev $ cat [s "bd sd sd", s "sd lt lt", s "sn sn bd", s "bd bd sn"] -@ +> d1 $ rev $ cat [s "bd sd sd", s "sd lt lt", s "sn sn bd", s "bd bd sn"] +Notice that the whole idea has been reversed. What this function is really doing +is ‘speeding up’ the pattern by a given factor, applying the given function to +it, and then ‘slowing it down’ by the same factor. In other words, this: + +> d1 $ slow 4 $ rev $ fast 4 +> $ cat [s "bd bd sn",s "sn sn bd", s"lt lt sd", s "sd sd bd"] + +This compresses the idea into a single cycle before rev operates and then slows it back to the original speed. -} outside :: Pattern Time -> (Pattern a1 -> Pattern a) -> Pattern a1 -> Pattern a outside np f p = innerJoin $ (\n -> _outside n f p) <$> np @@ -1389,6 +1612,15 @@ outside np f p = innerJoin $ (\n -> _outside n f p) <$> np _outside :: Time -> (Pattern a1 -> Pattern a) -> Pattern a1 -> Pattern a _outside n = _inside (1/n) +{-| + Takes a pattern and loops only the first cycle of the pattern. For example, the following code will only play the bass drum sample: + + > d1 $ loopFirst $ s "< cp*4>" + + This function combines with 'sometimes' to insert events from the first cycle randomly into subsequent cycles of the pattern: + + > d1 $ sometimes loopFirst $ s "< cp*4>" +-} loopFirst :: Pattern a -> Pattern a loopFirst p = splitQueries $ p {query = f} where f st = map @@ -1402,6 +1634,15 @@ loopFirst p = splitQueries $ p {query = f} timeLoop :: Pattern Time -> Pattern a -> Pattern a timeLoop n = outside n loopFirst +{-| + @seqPLoop@ will keep looping the sequence when it gets to the end: + + > d1 $ qtrigger $ seqPLoop + > [ (0, 12, sound "bd bd*2") + > , (4, 12, sound "hh*2 [sn cp] cp future*4") + > , (8, 12, sound (samples "arpy*8" (run 16))) + > ] +-} seqPLoop :: [(Time, Time, Pattern a)] -> Pattern a seqPLoop ps = timeLoop (pure $ maxT - minT) $ minT `rotL` seqP ps where minT = minimum $ map (\(x,_,_) -> x) ps @@ -1411,11 +1652,18 @@ seqPLoop ps = timeLoop (pure $ maxT - minT) $ minT `rotL` seqP ps @toScale@ lets you turn a pattern of notes within a scale (expressed as a list) to note numbers. -For example: @toScale [0, 4, 7] "0 1 2 3"@ will turn -into the pattern @"0 4 7 12"@. +For example: + +> toScale [0, 4, 7] "0 1 2 3" + +will turn into the pattern @"0 4 7 12"@. + +@toScale@ is handy for quickly applying a scale without naming it: + +> d1 $ n (toScale [0,2,3,5,7,8,10] "0 1 2 3 4 5 6 7") # sound "superpiano" -This function assumes your scale fits within an -octave; if that's not true, use 'toScale''. +This function assumes your scale fits within an octave; if that's not true, +use 'toScale''. @toScale = toScale' 12@ -} @@ -1433,8 +1681,14 @@ toScale' o s = fmap noteInScale noteInScale x = (s !!! x) + fromIntegral (o * octave x) -{- | `swingBy x n` divides a cycle into `n` slices and delays the notes in -the second half of each slice by `x` fraction of a slice. +{- | @swingBy x n@ divides a cycle into @n@ slices and delays the notes in the + second half of each slice by @x@ fraction of a slice. So if @x@ is 0 it does + nothing, 0.5 delays for half the note duration, and 1 will wrap around to + doing nothing again. The end result is a shuffle or swing-like rhythm. For + example, the following will delay every other @"hh"@ 1/3 of the way to the + next @"hh"@: + + > d1 $ swingBy (1/3) 4 $ sound "hh*8" -} swingBy :: Pattern Time -> Pattern Time -> Pattern a -> Pattern a swingBy x n = inside n (withinArc (Arc 0.5 1) (x ~>)) @@ -1445,8 +1699,11 @@ As 'swingBy', with the cycle division set to ⅓. swing :: Pattern Time -> Pattern a -> Pattern a swing = swingBy (pure $ 1%3) -{- | `cycleChoose` is like `choose` but only picks a new item from the list -once each cycle -} +{- | @cycleChoose@ is like `choose` but only picks a new item from the list + once each cycle. + + > d1 $ sound "drum ~ drum drum" # n (cycleChoose [0,2,3]) +-} cycleChoose :: [a] -> Pattern a cycleChoose = segment 1 . choose @@ -1461,8 +1718,10 @@ _rearrangeWith ipat n pat = innerJoin $ (\i -> _fast nT $ _repeatCycles n $ pats {- | @shuffle n p@ evenly divides one cycle of the pattern @p@ into @n@ parts, and returns a random permutation of the parts each cycle. For example, @shuffle 3 "a b c"@ could return @"a b c"@, @"a c b"@, @"b a c"@, @"b c a"@, -@"c a b"@, or @"c b a"@. But it will **never** return @"a a a"@, because that +@"c a b"@, or @"c b a"@. But it will /never/ return @"a a a"@, because that is not a permutation of the parts. + +This could also be called “sampling without replacement”. -} shuffle :: Pattern Int -> Pattern a -> Pattern a shuffle = tParam _shuffle @@ -1474,6 +1733,8 @@ _shuffle n = _rearrangeWith (randrun n) n of @p@ instead of making permutations. For example, @scramble 3 "a b c"@ will randomly select 3 parts from @"a"@ @"b"@ and @"c"@, possibly repeating a single part. + +This could also be called “sampling with replacement”. -} scramble :: Pattern Int -> Pattern a -> Pattern a scramble = tParam _scramble @@ -1524,7 +1785,7 @@ seqP ps = stack $ map (\(s, e, p) -> playFor s e (sam s `rotR` p)) ps {-| The @ur@ function is designed for longer form composition, by allowing you to -create ’patterns of patterns’ in a repeating loop. It takes four parameters: +create ‘patterns of patterns’ in a repeating loop. It takes four parameters: how long the loop will take, a pattern giving the structure of the composition, a lookup table for named patterns to feed into that structure, and a second lookup table for named transformations\/effects. @@ -1539,24 +1800,50 @@ do it: @ let pats = - [ - ("a", stack [n "c4 c5 g4 f4 f5 g4 e5 g4" # s "superpiano" # gain "0.7", - n "[c3,g4,c4]" # s "superpiano"# gain "0.7" - ] - ), - ("b", stack [n "d4 c5 g4 f4 f5 g4 e5 g4" # s "superpiano" # gain "0.7", - n "[d3,a4,d4]" # s "superpiano"# gain "0.7" - ] - ), - ("c", stack [n "f4 c5 g4 f4 f5 g4 e5 g4" # s "superpiano" # gain "0.7", - n "[f4,c5,f4]" # s "superpiano"# gain "0.7" - ] - ) - ] + [ ( "a", stack [ n "c4 c5 g4 f4 f5 g4 e5 g4" # s "superpiano" # gain "0.7" + , n "[c3,g4,c4]" # s "superpiano"# gain "0.7" + ] + ) + , ( "b", stack [ n "d4 c5 g4 f4 f5 g4 e5 g4" # s "superpiano" # gain "0.7" + , n "[d3,a4,d4]" # s "superpiano"# gain "0.7" + ] + ) + , ( "c", stack [ n "f4 c5 g4 f4 f5 g4 e5 g4" # s "superpiano" # gain "0.7" + , n "[f4,c5,f4]" # s "superpiano"# gain "0.7" + ] + ) + ] in d1 $ ur 12 "a b c" pats [] @ +In the above, the fourth parameter is given as an empty list, but that is where +you can put another lookup table, of functions rather than patterns this time. +For example: + +@ +let + pats = ... + fx = [ ("reverb", ( # (room 0.8 # sz 0.99 # orbit 1))) + , ("faster", fast 2) + ] +in +d1 $ ur 12 "a b:reverb c:faster" pats fx +@ + +In this example, @b@ has the function applied that’s named as reverb, while @c@ +is made to go faster. It’s also possible to schedule multiple patterns at once, +like in the following: + +@ +let pats = [ ("drums", s "drum cp*2") + , ("melody", s "arpy:2 arpy:3 arpy:5") + , ("craziness", s "cp:4*8" # speed ( sine + 0.5 )) + ] + fx = [("higher", ( # speed 2))] +in +d1 $ ur 8 "[drums, melody] [drums,craziness,melody] melody:higher" pats fx +@ -} ur :: Time -> Pattern String -> [(String, Pattern a)] -> [(String, Pattern a -> Pattern a)] -> Pattern a ur t outer_p ps fs = _slow t $ unwrap $ adjust <$> timedValues (getPat . split <$> outer_p) @@ -1573,7 +1860,25 @@ ur t outer_p ps fs = _slow t $ unwrap $ adjust <$> timedValues (getPat . split < matchF str = fromMaybe id $ lookup str fs timedValues = withEvent (\(Event c (Just a) a' v) -> Event c (Just a) a' (a,v)) . filterDigital --- | A simpler version of 'ur' that just provides name-value bindings that are reflected in the provided pattern. +{- | A simpler version of 'ur' that just provides name-value bindings that are + reflected in the provided pattern. + + @inhabit@ allows you to link patterns to some @String@, or in other words, + to give patterns a name and then call them from within another pattern of + @String@s. + + For example, we can make our own bassdrum, hi-hat and snaredrum kit: + + > do + > let drum = inhabit [ ("bd", s "sine" |- accelerate 1.5) + > , ("hh", s "alphabet:7" # begin 0.7 # hpf 7000) + > , ("sd", s "invaders:3" # speed 12) + > ] + > d1 $ drum "[bd*8?, [~hh]*4, sd(6,16)]" + + @inhabit@ can be very useful when using MIDI controlled drum machines, since you + can give understandable drum names to patterns of notes. +-} inhabit :: [(String, Pattern a)] -> Pattern String -> Pattern a inhabit ps p = squeezeJoin $ (\s -> fromMaybe silence $ lookup s ps) <$> p @@ -1586,13 +1891,32 @@ spaceOut xs p = _slow (toRational $ sum xs) $ stack $ map (`compressArc` p) spac spaceArcs = map (\(Arc a b) -> Arc (a/s) (b/s)) $ markOut 0 xs s = sum xs --- | @flatpat@ takes a 'Pattern' of lists and pulls the list elements as --- separate 'Event's. +{-| @flatpat@ takes a 'Pattern' of lists and pulls the list elements as + separate 'Event's. For example, the following code uses @flatpat@ in combination with @listToPat@ to create an alternating pattern of chords: + + > d1 $ n (flatpat $ listToPat [[0,4,7],[(-12),(-8),(-5)]]) + > # s "superpiano" # sustain 2 + + This code is equivalent to: + + > d1 $ n ("[0,4,7] [-12,-8,-5]") # s "superpiano" # sustain 2 +-} flatpat :: Pattern [a] -> Pattern a flatpat p = p {query = concatMap (\(Event c b b' xs) -> map (Event c b b') xs) . query p} --- | @layer@ takes a list of 'Pattern'-returning functions and a seed element, --- stacking the result of applying the seed element to each function in the list. +{- | @layer@ takes a list of 'Pattern'-returning functions and a seed element, +stacking the result of applying the seed element to each function in the list. + +It allows you to layer up multiple functions on one pattern. For example, the following +will play two versions of the pattern at the same time, one reversed and one at twice +the speed: + +> d1 $ layer [rev, fast 2] $ sound "arpy [~ arpy:4]" + +The original version of the pattern can be included by using the @id@ function: + +> d1 $ layer [id, rev, fast 2] $ sound "arpy [~ arpy:4]" +-} layer :: [a -> Pattern b] -> a -> Pattern b layer fs p = stack $ map ($ p) fs @@ -1631,7 +1955,7 @@ The different arpeggiate modes are: @ up down updown downup up&down down&up converge diverge disconverge pinkyup pinkyupdown -thumbup thumbupdown- +thumbup thumbupdown @ -} arp :: Pattern String -> Pattern a -> Pattern a @@ -1664,8 +1988,11 @@ _arp name p = arpWith f p thumbup xs = concatMap (\x -> [thumb,x]) $ tail xs where thumb = head xs -{- | `rolled` plays each note of a chord quickly in order, as opposed to simultaneously; to give a chord a harp-like effect. -This will played from the lowest note to the highest note of the chord: +{- | @rolled@ plays each note of a chord quickly in order, as opposed to +simultaneously; to give a chord a harp-like or strum effect. + +Notes are played low to high, and are evenly distributed within (1/4) of the chord event length, as opposed to arp/arpeggiate that spread the notes over the whole event. + @ rolled $ n "c'maj'4" # s "superpiano" @ @@ -1676,8 +2003,10 @@ rolled :: Pattern a -> Pattern a rolled = rolledBy (1/4) {- -As 'rolled', but allowing you to specify the length of the roll. The value in the passed pattern -is the divisor of the cycle length. A negative value will play the arpeggio in reverse order. +As 'rolled', but allows you to specify the length of the roll, i.e., the +fraction of the event that the notes will be spread over. The value in the +passed pattern is the divisor of the cycle length. A negative value will play +the arpeggio in reverse order. @ rolledBy "<1 -0.5 0.25 -0.125>" $ note "c'maj9" # s "superpiano" @@ -1722,7 +2051,28 @@ fill p' p = struct (splitQueries $ p {query = q}) p' tolerance = 0.01 -} --- | @ply n@ repeats each event @n@ times within its arc. +{- | @ply n@ repeats each event @n@ times within its arc. + +For example, the following are equivalent: + +@ +d1 $ ply 3 $ s "bd ~ sn cp" +d1 $ s "[bd bd bd] ~ [sn sn sn] [cp cp cp]" +@ + +The first parameter may be given as a pattern, so that the following are equivalent: + +@ +d1 $ ply "2 3" $ s "bd ~ sn cp" +d1 $ s "[bd bd] ~ [sn sn sn] [cp cp cp]" +@ + +Here is an example of it being used conditionally: + +@ +d1 $ every 3 (ply 4) $ s "bd ~ sn cp" +@ +-} ply :: Pattern Rational -> Pattern a -> Pattern a ply = tParam _ply @@ -1738,26 +2088,99 @@ _plyWith numPat f p = arpeggiate $ compound numPat where compound n | n <= 1 = p | otherwise = overlay p (f $ compound $ n-1) --- | Syncopates a rhythm, shifting each event halfway into its arc (aka timespan), e.g. @"a b [c d] e"@ becomes the equivalent of @"[~ a] [~ b] [[~ c] [~ d]] [~ e]"@ +{-| Syncopates a rhythm, shifting (delaying) each event halfway into its arc + (timespan). + + In mini-notation terms, it basically turns every instance of a into @[~ a]@, + e.g., @"a b [c d] e"@ becomes the equivalent of + @"[~ a] [~ b] [[~ c] [~ d]] [~ e]"@. + Every beat then becomes an offbeat, and so the overall effect is to + syncopate a pattern. + + In the following example, you can hear that the piano chords play between the + snare and the bass drum. In 4/4 time, they are playing in the 2 and a half, + and 4 and a half beats: + + > do + > resetCycles + > d1 $ stack [ + > press $ n "~ c'maj ~ c'maj" # s "superpiano" # gain 0.9 # pan 0.6, + > s "[bd,clap sd bd sd]" # pan 0.4 + > ] # cps (90/60/4) + + In the next example, the C major chord plays before the G major. As the slot + that occupies the C chord is that of one eighth note, it is displaced by press + only a sixteenth note: + + > do + > resetCycles + > d1 $ stack [ + > press $ n "~ [c'maj ~] ~ ~" # s "superpiano" # gain 0.9 # pan 0.6, + > press $ n "~ g'maj ~ ~" # s "superpiano" # gain 0.9 # pan 0.4, + > s "[bd,clap sd bd sd]" + > ] # cps (90/60/4) +-} press :: Pattern a -> Pattern a press = _pressBy 0.5 --- | Like @press@, but allows you to specify the amount in which each event is shifted. @pressBy 0.5@ is the same as @press@, while @pressBy (1/3)@ shifts each event by a third of its arc. +{-| Like @press@, but allows you to specify the amount in which each event is + shifted as a float from 0 to 1 (exclusive). + + @pressBy 0.5@ is the same as @press@, while @pressBy (1/3)@ shifts each event + by a third of its arc. + + You can pattern the displacement to create interesting rhythmic effects: + + > d1 $ stack [ + > s "bd sd bd sd", + > pressBy "<0 0.5>" $ s "co:2*4" + > ] + + > d1 $ stack [ + > s "[bd,co sd bd sd]", + > pressBy "<0 0.25 0.5 0.75>" $ s "cp" + > ] +-} pressBy :: Pattern Time -> Pattern a -> Pattern a pressBy = tParam _pressBy _pressBy :: Time -> Pattern a -> Pattern a _pressBy r pat = squeezeJoin $ (compressTo (r,1) . pure) <$> pat --- | Uses the first (binary) pattern to switch between the following --- two patterns. The resulting structure comes from the source patterns, not the --- binary pattern. See also @stitch@. +{- + Uses the first (binary) pattern to switch between the following + two patterns. The resulting structure comes from the source patterns, not the + binary pattern. See also `stitch`. + + The following will play the first pattern for the first half of a cycle, and + the second pattern for the other half; it combines two patterns of strings and + passes the result to the sound function: + + > d1 $ sound (sew "t f" "bd*8" "cp*8") + + It’s possible to sew together two control patterns: + + > d1 $ sew "t " + > (n "0 .. 15" # s "future") + > (s "cp:3*16" # speed saw + 1.2) + + You can also use Euclidean rhythm syntax in the boolean sequence: + + > d1 $ sew "t(11,16)" + > (n "0 .. 15" # s "future") + > (s "cp:3*16" # speed sine + 1.5) +-} sew :: Pattern Bool -> Pattern a -> Pattern a -> Pattern a sew pb a b = overlay (mask pb a) (mask (inv pb) b) --- | Uses the first (binary) pattern to switch between the following --- two patterns. The resulting structure comes from the binary --- pattern, not the source patterns. See also @sew@. +{-| Uses the first (binary) pattern to switch between the following + two patterns. The resulting structure comes from the binary + pattern, not the source patterns. (In 'sew', by contrast, the resulting structure comes from the source patterns.) + + The following uses a euclidean pattern to control CC0: + + > d1 $ ccv (stitch "t(7,16)" 127 0) # ccn 0 # "midi" +-} stitch :: Pattern Bool -> Pattern a -> Pattern a -> Pattern a stitch pb a b = overlay (struct pb a) (struct (inv pb) b) @@ -1773,34 +2196,27 @@ while b f pat = sew b (f pat) pat @stutter n t pat@ repeats each event in @pat@ @n@ times, separated by @t@ time (in fractions of a cycle). It is like 'Sound.Tidal.Control.echo' that doesn't reduce the volume, or 'ply' if you controlled the timing. -@ -d1 $ stutter 4 (1/16) $ s "bd cp" -@ +> d1 $ stutter 4 (1/16) $ s "bd cp" is functionally equivalent to -@ -d1 $ stut 4 1 (1/16) $ s "bd cp" -@ + +> d1 $ stut 4 1 (1/16) $ s "bd cp" -} stutter :: Integral i => i -> Time -> Pattern a -> Pattern a stutter n t p = stack $ map (\i -> (t * fromIntegral i) `rotR` p) [0 .. (n-1)] -{- | The `jux` function creates strange stereo effects, by applying a -function to a pattern, but only in the right-hand channel. For -example, the following reverses the pattern on the righthand side: +{- | The @jux@ function creates strange stereo effects by applying a + function to a pattern, but only in the right-hand channel. For + example, the following reverses the pattern on the righthand side: -@ -d1 $ slow 32 $ jux (rev) $ striateBy 32 (1/16) $ sound "bev" -@ + > d1 $ slow 32 $ jux (rev) $ striateBy 32 (1/16) $ sound "bev" -When passing pattern transforms to functions like [jux](#jux) and [every](#every), -it's possible to chain multiple transforms together with `.`, for -example this both reverses and halves the playback speed of the -pattern in the righthand channel: + When passing pattern transforms to functions like @jux@ and 'every', + it's possible to chain multiple transforms together with `.` (function + composition). For example this both reverses and halves the playback speed of + the pattern in the righthand channel: -@ -d1 $ slow 32 $ jux ((# speed "0.5") . rev) $ striateBy 32 (1/16) $ sound "bev" -@ + > d1 $ slow 32 $ jux ((# speed "0.5") . rev) $ striateBy 32 (1/16) $ sound "bev" -} jux :: (Pattern ValueMap -> Pattern ValueMap) @@ -1817,26 +2233,27 @@ juxcut' :: [t -> Pattern ValueMap] -> t -> Pattern ValueMap juxcut' fs p = stack $ map (\n -> ((fs !! n) p |+ P.cut (pure $ 1-n)) # P.pan (pure $ fromIntegral n / fromIntegral l)) [0 .. l-1] where l = length fs -{- | In addition to `jux`, `jux'` allows using a list of pattern transform. resulting patterns from each transformation will be spread via pan from left to right. - -For example: +{- | In addition to `jux`, `jux'` allows using a list of pattern + transformations. Resulting patterns from each transformation will be spread via + pan from left to right. -@ -d1 $ jux' [iter 4, chop 16, id, rev, palindrome] $ sound "bd sn" -@ + For example, the following will put @iter 4@ of the pattern to the far left + and `palindrome` to the far right. In the center, the original pattern will + play and the chopped and the reversed version will appear mid left and mid + right respectively. -will put `iter 4` of the pattern to the far left and `palindrome` to the far right. In the center the original pattern will play and mid left mid right the chopped and the reversed version will appear. + > d1 $ jux' [iter 4, chop 16, id, rev, palindrome] $ sound "bd sn" One could also write: @ -d1 $ stack [ - iter 4 $ sound "bd sn" # pan "0", - chop 16 $ sound "bd sn" # pan "0.25", - sound "bd sn" # pan "0.5", - rev $ sound "bd sn" # pan "0.75", - palindrome $ sound "bd sn" # pan "1", - ] +d1 $ stack + [ iter 4 $ sound "bd sn" # pan "0" + , chop 16 $ sound "bd sn" # pan "0.25" + , sound "bd sn" # pan "0.5" + , rev $ sound "bd sn" # pan "0.75" + , palindrome $ sound "bd sn" # pan "1" + ] @ -} @@ -1844,7 +2261,7 @@ jux' :: [t -> Pattern ValueMap] -> t -> Pattern ValueMap jux' fs p = stack $ map (\n -> (fs !! n) p |+ P.pan (pure $ fromIntegral n / fromIntegral l)) [0 .. l-1] where l = length fs --- | Multichannel variant of `jux`, _not sure what it does_ +-- | Multichannel variant of `jux`, /not sure what it does/ jux4 :: (Pattern ValueMap -> Pattern ValueMap) -> Pattern ValueMap -> Pattern ValueMap @@ -1853,13 +2270,11 @@ jux4 f p = stack [p # P.pan (pure (5/8)), f $ p # P.pan (pure (1/8))] {- | With `jux`, the original and effected versions of the pattern are panned hard left and right (i.e., panned at 0 and 1). This can be a -bit much, especially when listening on headphones. The variant `juxBy` +bit much, especially when listening on headphones. The variant @juxBy@ has an additional parameter, which brings the channel closer to the centre. For example: -@ -d1 $ juxBy 0.5 (density 2) $ sound "bd sn:1" -@ +> d1 $ juxBy 0.5 (fast 2) $ sound "bd sn:1" In the above, the two versions of the pattern would be panned at 0.25 and 0.75, rather than 0 and 1. @@ -1887,10 +2302,12 @@ create a pattern of strings corresponding to the sample at each name-index pair. An example: -@samples "jvbass [~ latibro] [jvbass [latibro jvbass]]" ((1%2) `rotL` slow 6 "[1 6 8 7 3]")@ + +> samples "jvbass [~ latibro] [jvbass [latibro jvbass]]" +> ((1%2) `rotL` slow 6 "[1 6 8 7 3]") The type signature is more general here, but you can consider this -to be a function of type @Pattern String -> Pattern Int -> Pattern String. +to be a function of type @Pattern String -> Pattern Int -> Pattern String@. @samples = liftA2 pick@ -} @@ -1939,10 +2356,13 @@ cross f p p' = Pattern $ \t -> concat [filter flt $ arc p t, {- | `range` will take a pattern which goes from 0 to 1 (like `sine`), and range it to a different range - between the first and second arguments. In the below example, `range 1 1.5` shifts the range of `sine1` from 0 - 1 to 1 - 1.5. -@ -d1 $ jux (iter 4) $ sound "arpy arpy:2*2" - |+ speed (slow 4 $ range 1 1.5 sine1) -@ +> d1 $ jux (iter 4) $ sound "arpy arpy:2*2" +> |+ speed (slow 4 $ range 1 1.5 sine1) + +The above is equivalent to: + +> d1 $ jux (iter 4) $ sound "arpy arpy:2*2" +> |+ speed (slow 4 $ sine1 * 0.5 + 1) -} range :: Num a => Pattern a -> Pattern a -> Pattern a -> Pattern a range fromP toP p = (\from to v -> ((v * (to-from)) + from)) <$> fromP *> toP *> p @@ -1951,10 +2371,35 @@ _range :: (Functor f, Num b) => b -> b -> f b -> f b _range from to p = (+ from) . (* (to-from)) <$> p {- | `rangex` is an exponential version of `range`, good for using with -frequencies. Do *not* use negative numbers or zero as arguments! -} +frequencies. For example, @range 20 2000 "0.5"@ will give @1010@ - halfway +between @20@ and @2000@. But @rangex 20 2000 0.5@ will give @200@ - halfway +between on a logarithmic scale. This usually sounds better if you’re using the +numbers as pitch frequencies. Since rangex uses logarithms, don’t try to scale +things to zero or less. +-} rangex :: (Functor f, Floating b) => b -> b -> f b -> f b rangex from to p = exp <$> _range (log from) (log to) p +{-| + @off@ is similar to 'superimpose', in that it applies a function to a pattern + and layers up the results on top of the original pattern. The difference + is that @off@ takes an extra pattern being a time (in cycles) to shift the + transformed version of the pattern by. + + The following plays a pattern on top of itself, but offset by an eighth of a + cycle, with a distorting bitcrush effect applied: + + > d1 $ off 0.125 (# crush 2) $ sound "bd [~ sn:2] mt lt*2" + + The following makes arpeggios by adding offset patterns that are shifted up + the scale: + + > d1 $ slow 2 + > $ n (off 0.25 (+12) + > $ off 0.125 (+7) + > $ slow 2 "c(3,8) a(3,8,2) f(3,8) e(3,8,4)") + > # sound "superpiano" +-} off :: Pattern Time -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a off tp f p = innerJoin $ (\tv -> _off tv f p) <$> tp @@ -1964,17 +2409,42 @@ _off t f p = superimpose (f . (t `rotR`)) p offadd :: Num a => Pattern Time -> Pattern a -> Pattern a -> Pattern a offadd tp pn p = off tp (+pn) p --- | Step sequencing +{- | + @step@ acts as a kind of simple step-sequencer using strings. For example, + @step "sn" "x x 12"@ is equivalent to the pattern of strings given by @"sn ~ + sn ~ sn:1 sn:2 ~"@. @step@ substitutes the given string for each @x@, for each number + it substitutes the string followed by a colon and the number, and for everything + else it puts in a rest. + + In other words, @step@ generates a pattern of strings in exactly the syntax you’d want for selecting samples and that can be fed directly into the 's' function. + + > d1 $ s (step "sn" "x x 12 ") +-} step :: String -> String -> Pattern String step s cs = fastcat $ map f cs where f c | c == 'x' = pure s | isDigit c = pure $ s ++ ":" ++ [c] | otherwise = silence +{- | @steps@ is like @step@ but it takes a list of pairs, like step would, and + it plays them all simultaneously. + + > d1 $ s (steps [("cp","x x x x x x"),("bd", "xxxx")]) +-} steps :: [(String, String)] -> Pattern String steps = stack . map (uncurry step) --- | like `step`, but allows you to specify an array of strings to use for 0,1,2... +{- | like `step`, but allows you to specify an array of strings to use for @0,1,2...@ + For example, + + > d1 $ s (step' ["superpiano","supermandolin"] "0 1 000 1") + > # sustain 4 # n 0 + + is equivalent to + + > d1 $ s "superpiano ~ supermandolin ~ superpiano!3 ~ supermandolin" + > # sustain 4 # n 0 +-} step' :: [String] -> String -> Pattern String step' ss cs = fastcat $ map f cs where f c | c == 'x' = pure $ head ss @@ -1986,19 +2456,36 @@ step' ss cs = fastcat $ map f cs ghost'' :: Time -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a ghost'' = ghostWith --- | Like 'ghost'', but a user-supplied function describes how to alter the pattern. +{-| Like 'ghost'', but a user-supplied function describes how to alter the pattern. + + In this example, ghost notes are applied to the snare hit, but these notes will + be louder, not quieter, and the sample will have its beginning slightly cut: + + > d1 $ slow 2 + > $ ghostWith (1/16) ((|*| gain 1.1) . (|> begin 0.05)) + > $ sound "sn" + +-} ghostWith :: Time -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a ghostWith a f p = superimpose (((a*2.5) `rotR`) . f) $ superimpose (((a*1.5) `rotR`) . f) p {- @ghost' t pat@ Adds quieter, pitch-shifted, copies of an event @t@ cycles after events in @pat@, emulating ghost notes that are common in drumming patterns. + +The following creates a kick snare pattern with ghost notes applied to the snare hit: + +> d1 $ stack [ ghost' 0.125 $ sound "~ sn", sound "bd*2 [~ bd]" ] -} ghost' :: Time -> Pattern ValueMap -> Pattern ValueMap ghost' a p = ghostWith a ((|*| P.gain (pure 0.7)) . (|> P.end (pure 0.2)) . (|*| P.speed (pure 1.25))) p -{-| As 'ghost', but with the copies set to appear one-eighth of a cycle afterwards. +{-| As 'ghost'', but with the copies set to appear one-eighth of a cycle afterwards. @ghost = ghost' 0.125@ + +The following creates a kick snare pattern with ghost notes applied to the snare hit: + +> d1 $ stack [ ghost $ sound "~ sn", sound "bd*2 [~ bd]" ] -} ghost :: Pattern ValueMap -> Pattern ValueMap ghost = ghost' 0.125 @@ -2022,37 +2509,68 @@ tabby nInt p p' = stack [maskedWarp, maskedWeft = mask (every 2 rev $ _fast (n % 2) $ fastCat [silence, pure True]) weftP maskedWarp = mask (every 2 rev $ _fast (n % 2) $ fastCat [pure True, silence]) warpP --- | chooses between a list of patterns, using a pattern of floats (from 0-1) +-- | Chooses from a list of patterns, using a pattern of floats (from 0 to 1). select :: Pattern Double -> [Pattern a] -> Pattern a select = tParam _select _select :: Double -> [Pattern a] -> Pattern a _select f ps = ps !! floor (max 0 (min 1 f) * fromIntegral (length ps - 1)) --- | chooses between a list of functions, using a pattern of floats (from 0-1) +-- | Chooses from a list of functions, using a pattern of floats (from 0 to 1). selectF :: Pattern Double -> [Pattern a -> Pattern a] -> Pattern a -> Pattern a selectF pf ps p = innerJoin $ (\f -> _selectF f ps p) <$> pf _selectF :: Double -> [Pattern a -> Pattern a] -> Pattern a -> Pattern a _selectF f ps p = (ps !! floor (max 0 (min 0.999999 f) * fromIntegral (length ps))) p --- | chooses between a list of functions, using a pattern of integers +-- | Chooses from a list of functions, using a pattern of integers. pickF :: Pattern Int -> [Pattern a -> Pattern a] -> Pattern a -> Pattern a pickF pInt fs pat = innerJoin $ (\i -> _pickF i fs pat) <$> pInt _pickF :: Int -> [Pattern a -> Pattern a] -> Pattern a -> Pattern a _pickF i fs p = (fs !!! i) p --- | @contrast p f f' p'@ splits the control pattern @p'@ in two, applying --- the function @f@ to one and @f'@ to the other. This depends on --- whether events in it contains values matching with those in @p@. --- For example in @contrast (# crush 3) (# vowel "a") (n "1") $ n "0 1" # s "bd sn" # speed 3@, --- the first event will have the vowel effect applied and the second --- will have the crush applied. +{- | @contrast f f' p p'@ splits the control pattern @p'@ in two, applying + the function @f@ to one and @f'@ to the other. This depends on + whether events in @p'@ contain values matching with those in @p@. + For example, in + + > contrast (# crush 3) (# vowel "a") (n "1") $ n "0 1" # s "bd sn" # speed 3 + + the first event will have the vowel effect applied and the second will have + the crush applied. + + @contrast@ is like an if-else-statement over patterns. For @contrast t f p@ + you can think of @t@ as the true branch, @f@ as the false branch, and @p@ as + the test. + + You can use any control pattern as a test of equality, e.g., @n "<0 1>", speed + "0.5"@, or things like that. This lets you choose specific properties of the + pattern you’re transforming for testing, like in the following example, + + > d1 $ contrast (|+ n 12) (|- n 12) (n "c") $ n (run 4) # s "superpiano" + + where every note that isn’t middle-c will be shifted down an octave but + middle-c will be shifted up to c5. + + Since the test given to contrast is also a pattern, you can do things like have + it alternate between options: + + > d1 $ contrast (|+ n 12) (|- n 12) (s "") + > $ s "superpiano superchip" # n 0 + + If you listen to this you’ll hear that which instrument is shifted up and which + instrument is shifted down alternates between cycles. +-} contrast :: (ControlPattern -> ControlPattern) -> (ControlPattern -> ControlPattern) -> ControlPattern -> ControlPattern -> ControlPattern contrast = contrastBy (==) +{-| + @contrastBy@ is contrastBy is the general version of 'contrast', in which you can specify an abritrary boolean function that will be used to compare the control patterns. + + > d2 $ contrastBy (>=) (|+ n 12) (|- n 12) (n "2") $ n "0 1 2 [3 4]" # s "superpiano" +-} contrastBy :: (a -> Value -> Bool) -> (ControlPattern -> Pattern b) -> (ControlPattern -> Pattern b) @@ -2079,15 +2597,45 @@ contrastRange = contrastBy f f (VS s, VS e) (VS v) = v == s && v == e f _ _ = False --- | Like @contrast@, but one function is given, and applied to events with matching controls. +{- | + The @fix@ function applies another function to matching events in a pattern of + controls. @fix@ is 'contrast' where the false-branching function is set to the + identity 'id'. It is like 'contrast', but one function is given and applied to + events with matching controls. + + For example, the following only adds the 'crush' control when the @n@ control + is set to either 1 or 4: + + > d1 $ slow 2 + > $ fix (# crush 3) (n "[1,4]") + > $ n "0 1 2 3 4 5 6" + > # sound "arpy" + + You can be quite specific; for example, the following applies the function + @'hurry' 2@ to sample 1 of the drum sample set, and leaves the rest as they are: + + > fix (hurry 2) (s "drum" # n "1") +-} fix :: (ControlPattern -> ControlPattern) -> ControlPattern -> ControlPattern -> ControlPattern fix f = contrast f id --- | Like @contrast@, but one function is given, and applied to events --- with controls which don't match. +-- | Like 'contrast', but one function is given, and applied to events with +-- controls which don't match. @unfix@ is 'fix' but only applies when the +-- testing pattern is /not/ a match. unfix :: (ControlPattern -> ControlPattern) -> ControlPattern -> ControlPattern -> ControlPattern unfix = contrast id +{-| + The @fixRange@ function isn’t very user-friendly at the moment, but you can + create a @fix@ variant with a range condition. Any value of a 'ControlPattern' + wich matches the values will apply the passed function. + + > d1 $ ( fixRange ( (# distort 1) . (# gain 0.8) ) + > ( pure $ Map.singleton "note" ((VN 0, VN 7)) ) + > ) + > $ s "superpiano" + > <| note "1 12 7 11" +-} fixRange :: (ControlPattern -> Pattern ValueMap) -> Pattern (Map.Map String (Value, Value)) -> ControlPattern @@ -2100,8 +2648,27 @@ unfixRange :: (ControlPattern -> Pattern ValueMap) -> ControlPattern unfixRange = contrastRange id --- | Limits values in a Pattern (or other Functor) to n equally spaced --- divisions of 1. +{- | @quantise@ limits values in a Pattern (or other Functor) to @n@ equally spaced +divisions of 1. + +It is useful for rounding a collection of numbers to some particular base +fraction. For example, + +> quantise 5 [0, 1.3 ,2.6,3.2,4.7,5] + +It will round all the values to the nearest @(1/5)=0.2@ and thus will output +the list @[0.0,1.2,2.6,3.2,4.8,5.0]@. You can use this function to force a +continuous pattern like sine into specific values. In the following example: + +> d1 $ s "superchip*8" # n (quantise 1 $ range (-10) (10) $ slow 8 $ cosine) +> # release (quantise 5 $ slow 8 $ sine + 0.1) + +all the releases selected be rounded to the nearest @0.1@ and the notes selected +to the nearest @1@. + +@quantise@ with fractional inputs does the consistent thing: @quantise 0.5@ +rounds values to the nearest @2@, @quantise 0.25@ rounds the nearest @4@, etc. +-} quantise :: (Functor f, RealFrac b) => b -> f b -> f b quantise n = fmap ((/n) . (fromIntegral :: RealFrac b => Int -> b) . round . (*n)) @@ -2140,12 +2707,9 @@ mono p = Pattern $ \(State a cm) -> flatten $ query p (State a cm) where {-| @smooth@ receives a pattern of numbers and linearly goes from one to the next, passing through all of them. As time is cycle-based, after reaching the last number in the pattern, it will smoothly go to the first one again. -@ - d1 $ sound "bd*4" # pan (slow 4 $ smooth "0 1 0.5 1") -@ +> d1 $ sound "bd*4" # pan (slow 4 $ smooth "0 1 0.5 1") This sound will pan gradually from left to right, then to the center, then to the right again, and finally comes back to the left. - -} -- serialize the given pattern @@ -2190,17 +2754,24 @@ swap things p = filterJust $ (`lookup` things) <$> p it will then transform the pattern and combine it with the last transformation until the depth is reached. This is like putting an effect (like a filter) in the feedback of a delay line; each echo is more affected. - @d1 $ note (scale "hexDorian" $ snowball 8 (+) (slow 2 . rev) "0 ~ . -1 . 5 3 4 . ~ -2") # s "gtr"@ + > d1 $ note ( scale "hexDorian" + > $ snowball 8 (+) (slow 2 . rev) "0 ~ . -1 . 5 3 4 . ~ -2" + > ) + > # s "gtr" -} snowball :: Int -> (Pattern a -> Pattern a -> Pattern a) -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a snowball depth combinationFunction f pattern = cat $ take depth $ scanl combinationFunction pattern $ drop 1 $ iterate f pattern -{- @soak@ | - applies a function to a pattern and cats the resulting pattern, - then continues applying the function until the depth is reached - this can be used to create a pattern that wanders away from - the original pattern by continually adding random numbers - d1 $ note (scale "hexDorian" mutateBy (+ (range -1 1 $ irand 2)) 8 $ "0 1 . 2 3 4") # s "gtr" +{- | + Applies a function to a pattern and cats the resulting pattern, then continues + applying the function until the depth is reached this can be used to create + a pattern that wanders away from the original pattern by continually adding + random numbers. + + > d1 $ note ( scale "hexDorian" mutateBy (+ (range -1 1 $ irand 2)) 8 + > $ "0 1 . 2 3 4" + > ) + > # s "gtr" -} soak :: Int -> (Pattern a -> Pattern a) -> Pattern a -> Pattern a soak depth f pattern = cat $ take depth $ iterate f pattern @@ -2223,6 +2794,21 @@ deconstruct n p = intercalate " " $ map showStep $ toList p {- | @bite n ipat pat@ slices a pattern @pat@ into @n@ pieces, then uses the @ipat@ pattern of integers to index into those slices. So @bite 4 "0 2*2" (run 8)@ is the same as @"[0 1] [4 5]*2"@. + + I.e., it allows you to slice each cycle into a given number of equal sized + bits, and then pattern those bits by number. It’s similar to @slice@, but is + for slicing up patterns, rather than samples. The following slices the pattern + into four bits, and then plays those bits in turn: + + > d1 $ bite 4 "0 1 2 3" $ n "0 .. 7" # sound "arpy" + + Of course that doesn’t actually change anything, but then you can reorder those bits: + + > d1 $ bite 4 "2 0 1 3" $ n "0 .. 7" # sound "arpy" + + The slices bits of pattern will be squeezed or contracted to fit: + + > d1 $ bite 4 "2 [0 3] 1*4 1" $ n "0 .. 7" # sound "arpy" -} bite :: Pattern Int -> Pattern Int -> Pattern a -> Pattern a bite npat ipat pat = innerJoin $ (\n -> _bite n ipat pat) <$> npat @@ -2232,8 +2818,7 @@ _bite n ipat pat = squeezeJoin $ zoompat <$> ipat where zoompat i = zoom (i'/(fromIntegral n), (i'+1)/(fromIntegral n)) pat where i' = fromIntegral $ i `mod` n -{- | @squeeze@ uses a pattern of integers to index into a list of patterns. --} +-- | Chooses from a list of patterns, using a pattern of integers. squeeze :: Pattern Int -> [Pattern a] -> Pattern a squeeze _ [] = silence squeeze ipat pats = squeezeJoin $ (pats !!!) <$> ipat @@ -2257,7 +2842,11 @@ _chew n ipat pat = (squeezeJoinUp $ zoompat <$> ipat) |/ P.speed (pure $ fromInt where i' = fromIntegral $ i `mod` n {-| -@chew@ works the same as 'bite', but speeds up\/slows down playback of sounds as well as squeezing/contracting the slices of the provided pattern. + @chew@ works the same as 'bite', but speeds up\/slows down playback of sounds as + well as squeezing\/contracting the slices of the provided pattern. Compare: + + > d1 $ 'bite' 4 "0 1*2 2*2 [~ 3]" $ n "0 .. 7" # sound "drum" + > d1 $ chew 4 "0 1*2 2*2 [~ 3]" $ n "0 .. 7" # sound "drum" -} -- TODO maybe _chew could pattern the first parameter directly.. @@ -2282,18 +2871,26 @@ binary = binaryN 8 ascii :: Pattern String -> Pattern Bool ascii p = squeezeJoin $ (listToPat . concatMap (__binary 8 . ord)) <$> p --- | Given a start point and a duration (both specified in cycles), this --- generates a control pattern that makes a sound begin at the start --- point and last the duration. --- --- @grain s d = 'Sound.Tidal.Params.begin' s # 'Sound.Tidal.Params.end' (s+d)@ +{- | Given a start point and a duration (both specified in cycles), this + generates a control pattern that makes a sound begin at the start + point and last the duration. + + The following are equivalent: + + > d1 $ slow 2 $ s "bev" # grain 0.2 0.1 # legato 1 + > d1 $ slow 2 $ s "bev" # begin 0.2 # end 0.3 # legato 1 + + @grain@ is defined as: + + > grain s d = 'Sound.Tidal.Params.begin' s # 'Sound.Tidal.Params.end' (s+d) +-} grain :: Pattern Double -> Pattern Double -> ControlPattern grain s w = P.begin b # P.end e where b = s e = s + w -- | For specifying a boolean pattern according to a list of offsets --- (aka inter-onset intervals). For example `necklace 12 [4,2]` is +-- (aka inter-onset intervals). For example @necklace 12 [4,2]@ is -- the same as "t f f f t f t f f f t f". That is, 12 steps per cycle, -- with true values alternating between every 4 and every 2 steps. necklace :: Rational -> [Int] -> Pattern Bool diff --git a/src/Sound/Tidal/Version.hs b/src/Sound/Tidal/Version.hs index 02a93fb00..cbe3c0748 100644 --- a/src/Sound/Tidal/Version.hs +++ b/src/Sound/Tidal/Version.hs @@ -21,7 +21,7 @@ import Paths_tidal -} tidal_version :: String -tidal_version = "1.9.4" +tidal_version = "1.9.5" tidal_status :: IO () tidal_status = tidal_status_string >>= putStrLn diff --git a/stack.yaml b/stack.yaml index b12824c46..7962e96b1 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-20.5 +resolver: lts-22.8 packages: - '.' @@ -8,6 +8,6 @@ packages: extra-deps: - hosc-0.20 - - haskellish-0.3.2.1 + - haskellish-0.3.2.2 diff --git a/test/dontcrash.hs b/test/dontcrash.hs index 166ebd956..e6194110b 100644 --- a/test/dontcrash.hs +++ b/test/dontcrash.hs @@ -9,7 +9,7 @@ import Sound.Tidal.Context main = do - tidal <- startTidal (superdirtTarget {oLatency = 0.1, oAddress = "127.0.0.1", oPort = 57120}) (defaultConfig {cFrameTimespan = 1/20}) + tidal <- startTidal (superdirtTarget {oLatency = 0.1, oAddress = "127.0.0.1", oPort = 57120}) (defaultConfig) let p = streamReplace tidal d1 = p 1 . (|< orbit 0) diff --git a/tidal-link/link/.appveyor.yml b/tidal-link/link/.appveyor.yml index 27214e28d..aff8de98c 100644 --- a/tidal-link/link/.appveyor.yml +++ b/tidal-link/link/.appveyor.yml @@ -12,15 +12,15 @@ environment: - APPVEYOR_BUILD_WORKER_IMAGE: macos-catalina CONFIGURATION: Release XCODE_VERSION: 11.7 - - APPVEYOR_BUILD_WORKER_IMAGE: macos-catalina + - APPVEYOR_BUILD_WORKER_IMAGE: macos-bigsur CONFIGURATION: Debug - XCODE_VERSION: 12.3 + XCODE_VERSION: 12.5.1 - APPVEYOR_BUILD_WORKER_IMAGE: macos-monterey CONFIGURATION: Release - XCODE_VERSION: 12.5.1 + XCODE_VERSION: 13.4.1 - APPVEYOR_BUILD_WORKER_IMAGE: macos-monterey CONFIGURATION: Release - XCODE_VERSION: 13.2.1 + XCODE_VERSION: 14.1 - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu2004 AUDIO_DRIVER: Jack CONFIGURATION: Debug @@ -52,20 +52,10 @@ environment: GENERATOR: Ninja CXX: g++-7 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - AUDIO_DRIVER: Asio - THREAD_DESCRIPTION: OFF - CONFIGURATION: Release - GENERATOR: Visual Studio 14 2015 - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - AUDIO_DRIVER: Asio + AUDIO_DRIVER: Wasapi THREAD_DESCRIPTION: OFF CONFIGURATION: Debug GENERATOR: Visual Studio 14 2015 Win64 - - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 - AUDIO_DRIVER: Asio - THREAD_DESCRIPTION: OFF - CONFIGURATION: Release - GENERATOR: Visual Studio 14 2015 Win64 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 AUDIO_DRIVER: Wasapi THREAD_DESCRIPTION: OFF @@ -88,7 +78,7 @@ environment: GENERATOR: Visual Studio 17 2022 - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu2004 ESP_IDF: true - IDF_RELEASE: v4.3.1 + IDF_RELEASE: v5.1.1 - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu2004 FORMATTING: true @@ -100,6 +90,7 @@ for: only: - APPVEYOR_BUILD_WORKER_IMAGE: macos-mojave - APPVEYOR_BUILD_WORKER_IMAGE: macos-catalina + - APPVEYOR_BUILD_WORKER_IMAGE: macos-bigsur - APPVEYOR_BUILD_WORKER_IMAGE: macos-monterey build_script: - sudo xcode-select -s /Applications/Xcode-$XCODE_VERSION.app @@ -114,7 +105,6 @@ for: - GENERATOR: Ninja install: - git submodule update --init --recursive - - sudo apt-get update - sudo apt-get install -y libjack-dev portaudio19-dev valgrind build_script: - python3 ci/configure.py --audio-driver $AUDIO_DRIVER --generator "$GENERATOR" --configuration $CONFIGURATION @@ -129,6 +119,7 @@ for: - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2022 build_script: + - py -3 -m pip install setuptools - py -3 ci/configure.py --audio-driver %AUDIO_DRIVER% --thread-description %THREAD_DESCRIPTION% --generator "%GENERATOR%" --flags="-DCMAKE_SYSTEM_VERSION=10.0.18362.0" - py -3 ci/build.py --configuration %CONFIGURATION% test_script: diff --git a/tidal-link/link/Ableton Link Guidelines.pdf b/tidal-link/link/Ableton Link Guidelines.pdf new file mode 100644 index 000000000..09cf86ae3 Binary files /dev/null and b/tidal-link/link/Ableton Link Guidelines.pdf differ diff --git a/tidal-link/link/AbletonLinkConfig.cmake b/tidal-link/link/AbletonLinkConfig.cmake index 43b66e7d3..b036deb17 100644 --- a/tidal-link/link/AbletonLinkConfig.cmake +++ b/tidal-link/link/AbletonLinkConfig.cmake @@ -36,6 +36,11 @@ elseif(CMAKE_SYSTEM_NAME MATCHES "Linux|kFreeBSD|GNU") INTERFACE_COMPILE_DEFINITIONS LINK_PLATFORM_LINUX=1 ) + set_property(TARGET Ableton::Link APPEND PROPERTY + INTERFACE_LINK_LIBRARIES + atomic + pthread + ) endif() include(${CMAKE_CURRENT_LIST_DIR}/cmake_include/AsioStandaloneConfig.cmake) diff --git a/tidal-link/link/CMakeLists.txt b/tidal-link/link/CMakeLists.txt index 5924722da..52187f572 100644 --- a/tidal-link/link/CMakeLists.txt +++ b/tidal-link/link/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.5) project(Link) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) @@ -22,6 +22,8 @@ if(WIN32) option(LINK_BUILD_VLD "Build with VLD support (VLD must be installed separately)" OFF) endif() +option(LINK_BUILD_TESTS "Build unit test binaries" ON) + # ____ _ _ # | _ \ __ _| |_| |__ ___ # | |_) / _` | __| '_ \/ __| @@ -36,7 +38,9 @@ include(AbletonLinkConfig.cmake) include(extensions/abl_link/abl_link.cmake) add_subdirectory(include) +if(LINK_BUILD_TESTS) add_subdirectory(src) +endif() add_subdirectory(examples) add_subdirectory(extensions/abl_link) diff --git a/tidal-link/link/README.md b/tidal-link/link/README.md index ee2c6b1d9..094c2f997 100644 --- a/tidal-link/link/README.md +++ b/tidal-link/link/README.md @@ -108,7 +108,7 @@ implementations. Please see: [platforms/darwin/Clock.hpp](include/ableton/platforms/darwin/Clock.hpp) - Windows clock implementation in [platforms/windows/Clock.hpp](include/ableton/platforms/windows/Clock.hpp) -- C++ standard library `std::chrono::high_resolution_clock`-based implementation in +- C++ standard library `std::chrono::steady_clock`-based implementation in [platforms/stl/Clock.hpp](include/ableton/platforms/stl/Clock.hpp) Using the system time correctly in the context of an audio callback gets a little diff --git a/tidal-link/link/ci/build.py b/tidal-link/link/ci/build.py old mode 100644 new mode 100755 diff --git a/tidal-link/link/ci/check-formatting.py b/tidal-link/link/ci/check-formatting.py old mode 100644 new mode 100755 diff --git a/tidal-link/link/ci/configure.py b/tidal-link/link/ci/configure.py old mode 100644 new mode 100755 diff --git a/tidal-link/link/ci/run-tests.py b/tidal-link/link/ci/run-tests.py old mode 100644 new mode 100755 diff --git a/tidal-link/link/ci/run_valgrind_tests.sh b/tidal-link/link/ci/run_valgrind_tests.sh old mode 100644 new mode 100755 diff --git a/tidal-link/link/cmake_include/ConfigureCompileFlags.cmake b/tidal-link/link/cmake_include/ConfigureCompileFlags.cmake index 63bdfec57..ec6cd55e3 100644 --- a/tidal-link/link/cmake_include/ConfigureCompileFlags.cmake +++ b/tidal-link/link/cmake_include/ConfigureCompileFlags.cmake @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.5) set(build_flags_COMMON_LIST) set(build_flags_DEBUG_LIST) @@ -128,6 +128,8 @@ elseif(${CMAKE_CXX_COMPILER_ID} STREQUAL MSVC) "/wd4868" # Compiler may not enforce left-to-right evaluation order in braced initializer list "/wd5026" # Move constructor was implicitly defined as deleted "/wd5027" # Move assignment operator was implicitly defined as deleted + "/wd5262" # implicit fall-through + "/wd5264" # 'variable-name': 'const' variable is not used ) endif() diff --git a/tidal-link/link/examples/CMakeLists.txt b/tidal-link/link/examples/CMakeLists.txt index f75b00b1b..775b1dfd0 100644 --- a/tidal-link/link/examples/CMakeLists.txt +++ b/tidal-link/link/examples/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.5) project(LinkExamples) # _ ____ ___ ___ @@ -11,7 +11,7 @@ project(LinkExamples) if(WIN32) function(configure_asio asio_sdk_path_OUT) # ASIO-related path/file variables - set(asio_download_root "https:/download.steinberg.net/sdk_downloads") + set(asio_download_root "https://download.steinberg.net/sdk_downloads") set(asio_file_name "asiosdk_2.3.3_2019-06-14.zip") set(asio_dir_name "asiosdk_2.3.3_2019-06-14") set(asio_working_dir "${CMAKE_BINARY_DIR}/modules") @@ -96,10 +96,6 @@ source_group("Audio Sources" FILES ${linkhut_audio_SOURCES}) # function(configure_linkhut_executable target) - if(CMAKE_SYSTEM_NAME MATCHES "Linux|kFreeBSD|GNU") - target_link_libraries(${target} atomic pthread) - endif() - target_link_libraries(${target} Ableton::Link) endfunction() diff --git a/tidal-link/link/examples/esp32/.gitignore b/tidal-link/link/examples/esp32/.gitignore index d054d8439..38c3a5f9e 100644 --- a/tidal-link/link/examples/esp32/.gitignore +++ b/tidal-link/link/examples/esp32/.gitignore @@ -1,3 +1,4 @@ build sdkconfig sdkconfig.old +managed_components diff --git a/tidal-link/link/examples/esp32/main/idf_component.yml b/tidal-link/link/examples/esp32/main/idf_component.yml new file mode 100644 index 000000000..75eccbfe8 --- /dev/null +++ b/tidal-link/link/examples/esp32/main/idf_component.yml @@ -0,0 +1,17 @@ +## IDF Component Manager Manifest File +dependencies: + espressif/asio: "*" + ## Required IDF version + idf: + version: ">=4.1.0" + # # Put list of dependencies here + # # For components maintained by Espressif: + # component: "~1.0.0" + # # For 3rd party components: + # username/component: ">=1.0.0,<2.0.0" + # username2/component2: + # version: "~1.0.0" + # # For transient dependencies `public` flag can be set. + # # `public` flag doesn't have an effect dependencies of the `main` component. + # # All dependencies of `main` are public by default. + # public: true diff --git a/tidal-link/link/examples/esp32/main/main.cpp b/tidal-link/link/examples/esp32/main/main.cpp index b44f45923..0a5c56ba2 100644 --- a/tidal-link/link/examples/esp32/main/main.cpp +++ b/tidal-link/link/examples/esp32/main/main.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include #include #include #include @@ -21,38 +21,6 @@ char* if_indextoname(unsigned int ifIndex, char* ifName) return nullptr; } -void IRAM_ATTR timer_group0_isr(void* userParam) -{ - static BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - TIMERG0.int_clr_timers.t0 = 1; - TIMERG0.hw_timer[0].config.alarm_en = 1; - - xSemaphoreGiveFromISR(userParam, &xHigherPriorityTaskWoken); - if (xHigherPriorityTaskWoken) - { - portYIELD_FROM_ISR(); - } -} - -void timerGroup0Init(int timerPeriodUS, void* userParam) -{ - timer_config_t config = {.alarm_en = TIMER_ALARM_EN, - .counter_en = TIMER_PAUSE, - .intr_type = TIMER_INTR_LEVEL, - .counter_dir = TIMER_COUNT_UP, - .auto_reload = TIMER_AUTORELOAD_EN, - .divider = 80}; - - timer_init(TIMER_GROUP_0, TIMER_0, &config); - timer_set_counter_value(TIMER_GROUP_0, TIMER_0, 0); - timer_set_alarm_value(TIMER_GROUP_0, TIMER_0, timerPeriodUS); - timer_enable_intr(TIMER_GROUP_0, TIMER_0); - timer_isr_register(TIMER_GROUP_0, TIMER_0, &timer_group0_isr, userParam, 0, nullptr); - - timer_start(TIMER_GROUP_0, TIMER_0); -} - void printTask(void* userParam) { auto link = static_cast(userParam); @@ -73,7 +41,6 @@ void printTask(void* userParam) void tickTask(void* userParam) { - SemaphoreHandle_t handle = static_cast(userParam); ableton::Link link(120.0f); link.enable(true); @@ -86,12 +53,10 @@ void tickTask(void* userParam) while (true) { - xSemaphoreTake(handle, portMAX_DELAY); - const auto state = link.captureAudioSessionState(); const auto phase = state.phaseAtTime(link.clock().micros(), 1.); gpio_set_level(LED, fmodf(phase, 1.) < 0.1); - portYIELD(); + vTaskDelay(1); } } @@ -102,8 +67,5 @@ extern "C" void app_main() ESP_ERROR_CHECK(esp_event_loop_create_default()); ESP_ERROR_CHECK(example_connect()); - SemaphoreHandle_t tickSemphr = xSemaphoreCreateBinary(); - timerGroup0Init(100, tickSemphr); - - xTaskCreate(tickTask, "tick", 8192, tickSemphr, configMAX_PRIORITIES - 1, nullptr); + xTaskCreate(tickTask, "tick", 8192, nullptr, configMAX_PRIORITIES - 1, nullptr); } diff --git a/tidal-link/link/examples/esp32/sdkconfig.defaults b/tidal-link/link/examples/esp32/sdkconfig.defaults index 75ebeae1c..33b93f576 100644 --- a/tidal-link/link/examples/esp32/sdkconfig.defaults +++ b/tidal-link/link/examples/esp32/sdkconfig.defaults @@ -1 +1,3 @@ CONFIG_COMPILER_CXX_EXCEPTIONS=y +CONFIG_PARTITION_TABLE_SINGLE_APP_LARGE=y + diff --git a/tidal-link/link/extensions/abl_link/abl_link.cmake b/tidal-link/link/extensions/abl_link/abl_link.cmake index 00efd1ee2..8e52a063b 100644 --- a/tidal-link/link/extensions/abl_link/abl_link.cmake +++ b/tidal-link/link/extensions/abl_link/abl_link.cmake @@ -13,7 +13,3 @@ target_include_directories(abl_link PUBLIC set_property(TARGET abl_link PROPERTY C_STANDARD 11) target_link_libraries(abl_link Ableton::Link) - -if(CMAKE_SYSTEM_NAME MATCHES "Linux|kFreeBSD|GNU") - target_link_libraries(abl_link atomic pthread) -endif() diff --git a/tidal-link/link/include/CMakeLists.txt b/tidal-link/link/include/CMakeLists.txt index 1c7b5ed96..2cf37b8f0 100644 --- a/tidal-link/link/include/CMakeLists.txt +++ b/tidal-link/link/include/CMakeLists.txt @@ -1,4 +1,4 @@ -cmake_minimum_required(VERSION 3.0) +cmake_minimum_required(VERSION 3.5) project(LinkCore) # ____ @@ -19,6 +19,7 @@ set(link_core_HEADERS ${link_core_DIR}/LinearRegression.hpp ${link_core_DIR}/Measurement.hpp ${link_core_DIR}/MeasurementEndpointV4.hpp + ${link_core_DIR}/MeasurementEndpointV6.hpp ${link_core_DIR}/MeasurementService.hpp ${link_core_DIR}/Median.hpp ${link_core_DIR}/NodeId.hpp @@ -49,8 +50,9 @@ set(link_core_HEADERS set(link_discovery_DIR ${CMAKE_CURRENT_SOURCE_DIR}/ableton/discovery) set(link_discovery_HEADERS + ${link_discovery_DIR}/AsioTypes.hpp ${link_discovery_DIR}/InterfaceScanner.hpp - ${link_discovery_DIR}/IpV4Interface.hpp + ${link_discovery_DIR}/IpInterface.hpp ${link_discovery_DIR}/MessageTypes.hpp ${link_discovery_DIR}/NetworkByteStreamSerializable.hpp ${link_discovery_DIR}/Payload.hpp @@ -77,7 +79,6 @@ set(link_platform_HEADERS ${link_platform_DIR}/asio/Context.hpp ${link_platform_DIR}/asio/LockFreeCallbackDispatcher.hpp ${link_platform_DIR}/asio/Socket.hpp - ${link_platform_DIR}/asio/Util.hpp ) if(ESP_PLATFORM) diff --git a/tidal-link/link/include/ableton/Link.ipp b/tidal-link/link/include/ableton/Link.ipp index f8cbce832..28fb1e471 100644 --- a/tidal-link/link/include/ableton/Link.ipp +++ b/tidal-link/link/include/ableton/Link.ipp @@ -225,19 +225,33 @@ inline void BasicLink::SessionState::requestBeatAtTime( forceBeatAtTime(beat, time, quantum); } -template -inline void BasicLink::SessionState::forceBeatAtTime( - const double beat, const std::chrono::microseconds time, const double quantum) +inline void forceBeatAtTimeImpl(link::Timeline& timeline, + const link::Beats beat, + const std::chrono::microseconds time, + const link::Beats quantum) { // There are two components to the beat adjustment: a phase shift // and a beat magnitude adjustment. - const auto curBeatAtTime = link::Beats{beatAtTime(time, quantum)}; - const auto closestInPhase = - link::closestPhaseMatch(curBeatAtTime, link::Beats{beat}, link::Beats{quantum}); - mState.timeline = shiftClientTimeline(mState.timeline, closestInPhase - curBeatAtTime); + const auto curBeatAtTime = link::toPhaseEncodedBeats(timeline, time, quantum); + const auto closestInPhase = link::closestPhaseMatch(curBeatAtTime, beat, quantum); + timeline = shiftClientTimeline(timeline, closestInPhase - curBeatAtTime); // Now adjust the magnitude - mState.timeline.beatOrigin = - mState.timeline.beatOrigin + (link::Beats{beat} - closestInPhase); + timeline.beatOrigin = timeline.beatOrigin + beat - closestInPhase; +} + +template +inline void BasicLink::SessionState::forceBeatAtTime( + const double beat, std::chrono::microseconds time, const double quantum) +{ + forceBeatAtTimeImpl(mState.timeline, link::Beats{beat}, time, link::Beats{quantum}); + + // Due to quantization errors the resulting BeatTime at 'time' after forcing can be + // bigger than 'beat' which then violates intended behavior of the API and can lead + // i.e. to missing a downbeat. Thus we have to shift the timeline forwards. + if (beatAtTime(time, quantum) > beat) + { + forceBeatAtTimeImpl(mState.timeline, link::Beats{beat}, ++time, link::Beats{quantum}); + } } template diff --git a/tidal-link/link/include/ableton/platforms/asio/Util.hpp b/tidal-link/link/include/ableton/discovery/AsioTypes.hpp similarity index 61% rename from tidal-link/link/include/ableton/platforms/asio/Util.hpp rename to tidal-link/link/include/ableton/discovery/AsioTypes.hpp index b974c10cc..fe0e9a7a3 100644 --- a/tidal-link/link/include/ableton/platforms/asio/Util.hpp +++ b/tidal-link/link/include/ableton/discovery/AsioTypes.hpp @@ -1,4 +1,4 @@ -/* Copyright 2016, Ableton AG, Berlin. All rights reserved. +/* Copyright 2023, Ableton AG, Berlin. All rights reserved. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,16 +19,19 @@ #pragma once -#include +#include namespace ableton { -namespace platforms -{ -namespace asio +namespace discovery { -// Utility for making v4 or v6 ip addresses from raw bytes in network byte-order +using IpAddress = LINK_ASIO_NAMESPACE::ip::address; +using IpAddressV4 = LINK_ASIO_NAMESPACE::ip::address_v4; +using IpAddressV6 = LINK_ASIO_NAMESPACE::ip::address_v6; +using UdpSocket = LINK_ASIO_NAMESPACE::ip::udp::socket; +using UdpEndpoint = LINK_ASIO_NAMESPACE::ip::udp::endpoint; + template AsioAddrType makeAddress(const char* pAddr) { @@ -38,6 +41,14 @@ AsioAddrType makeAddress(const char* pAddr) return AsioAddrType{bytes}; } -} // namespace asio -} // namespace platforms +template +AsioAddrType makeAddress(const char* pAddr, uint32_t scopeId) +{ + using namespace std; + typename AsioAddrType::bytes_type bytes; + copy(pAddr, pAddr + bytes.size(), begin(bytes)); + return AsioAddrType{bytes, scopeId}; +} + +} // namespace discovery } // namespace ableton diff --git a/tidal-link/link/include/ableton/discovery/InterfaceScanner.hpp b/tidal-link/link/include/ableton/discovery/InterfaceScanner.hpp index cb3adad56..c3a37f2b9 100644 --- a/tidal-link/link/include/ableton/discovery/InterfaceScanner.hpp +++ b/tidal-link/link/include/ableton/discovery/InterfaceScanner.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include #include @@ -29,7 +29,7 @@ namespace ableton namespace discovery { -// Callback takes a range of asio::ip:address which is +// Callback takes a range of IpAddress which is // guaranteed to be sorted and unique template class InterfaceScanner @@ -64,7 +64,7 @@ class InterfaceScanner using namespace std; debug(mIo->log()) << "Scanning network interfaces"; // Rescan the hardware for available network interface addresses - vector addrs = mIo->scanNetworkInterfaces(); + vector addrs = mIo->scanNetworkInterfaces(); // Sort and unique them to guarantee consistent comparison sort(begin(addrs), end(addrs)); addrs.erase(unique(begin(addrs), end(addrs)), end(addrs)); diff --git a/tidal-link/link/include/ableton/discovery/IpV4Interface.hpp b/tidal-link/link/include/ableton/discovery/IpInterface.hpp similarity index 73% rename from tidal-link/link/include/ableton/discovery/IpV4Interface.hpp rename to tidal-link/link/include/ableton/discovery/IpInterface.hpp index 9967f5125..00a59db4c 100644 --- a/tidal-link/link/include/ableton/discovery/IpV4Interface.hpp +++ b/tidal-link/link/include/ableton/discovery/IpInterface.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include namespace ableton @@ -27,9 +27,17 @@ namespace ableton namespace discovery { -inline asio::ip::udp::endpoint multicastEndpoint() +inline UdpEndpoint multicastEndpointV4() { - return {asio::ip::address_v4::from_string("224.76.78.75"), 20808}; + return {IpAddressV4::from_string("224.76.78.75"), 20808}; +} + +inline UdpEndpoint multicastEndpointV6(uint64_t scopeId) +{ + // This is a non-permanently-assigned link-local multicast address (RFC4291) + return { + ::LINK_ASIO_NAMESPACE::ip::make_address("ff12::8080%" + std::to_string(scopeId)), + 20808}; } // Type tags for dispatching between unicast and multicast packets @@ -41,22 +49,22 @@ struct UnicastTag }; template -class IpV4Interface +class IpInterface { public: using Socket = typename util::Injected::type::template Socket; - IpV4Interface(util::Injected io, const asio::ip::address_v4& addr) + IpInterface(util::Injected io, const IpAddress& addr) : mIo(std::move(io)) , mMulticastReceiveSocket(mIo->template openMulticastSocket(addr)) , mSendSocket(mIo->template openUnicastSocket(addr)) { } - IpV4Interface(const IpV4Interface&) = delete; - IpV4Interface& operator=(const IpV4Interface&) = delete; + IpInterface(const IpInterface&) = delete; + IpInterface& operator=(const IpInterface&) = delete; - IpV4Interface(IpV4Interface&& rhs) + IpInterface(IpInterface&& rhs) : mIo(std::move(rhs.mIo)) , mMulticastReceiveSocket(std::move(rhs.mMulticastReceiveSocket)) , mSendSocket(std::move(rhs.mSendSocket)) @@ -65,7 +73,7 @@ class IpV4Interface std::size_t send( - const uint8_t* const pData, const size_t numBytes, const asio::ip::udp::endpoint& to) + const uint8_t* const pData, const size_t numBytes, const UdpEndpoint& to) { return mSendSocket.send(pData, numBytes, to); } @@ -83,7 +91,7 @@ class IpV4Interface SocketReceiver(std::move(handler))); } - asio::ip::udp::endpoint endpoint() const + UdpEndpoint endpoint() const { return mSendSocket.endpoint(); } @@ -98,8 +106,7 @@ class IpV4Interface } template - void operator()( - const asio::ip::udp::endpoint& from, const It messageBegin, const It messageEnd) + void operator()(const UdpEndpoint& from, const It messageBegin, const It messageEnd) { mHandler(Tag{}, from, messageBegin, messageEnd); } @@ -113,8 +120,8 @@ class IpV4Interface }; template -IpV4Interface makeIpV4Interface( - util::Injected io, const asio::ip::address_v4& addr) +IpInterface makeIpInterface( + util::Injected io, const IpAddress& addr) { return {std::move(io), addr}; } diff --git a/tidal-link/link/include/ableton/discovery/NetworkByteStreamSerializable.hpp b/tidal-link/link/include/ableton/discovery/NetworkByteStreamSerializable.hpp index 49a119530..6a39bba92 100644 --- a/tidal-link/link/include/ableton/discovery/NetworkByteStreamSerializable.hpp +++ b/tidal-link/link/include/ableton/discovery/NetworkByteStreamSerializable.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #if defined(LINK_PLATFORM_MACOSX) #include #elif defined(LINK_PLATFORM_LINUX) diff --git a/tidal-link/link/include/ableton/discovery/Payload.hpp b/tidal-link/link/include/ableton/discovery/Payload.hpp index 1d48caa7e..f29467288 100644 --- a/tidal-link/link/include/ableton/discovery/Payload.hpp +++ b/tidal-link/link/include/ableton/discovery/Payload.hpp @@ -82,6 +82,11 @@ struct PayloadEntry template friend It toNetworkByteStream(const PayloadEntry& entry, It out) { + // Don't serialize Entry if its value is of size zero + if (sizeInByteStream(entry.value) == 0) + { + return out; + } return toNetworkByteStream( entry.value, toNetworkByteStream(entry.header, std::move(out))); } diff --git a/tidal-link/link/include/ableton/discovery/PeerGateway.hpp b/tidal-link/link/include/ableton/discovery/PeerGateway.hpp index db434394c..6b4db27c1 100644 --- a/tidal-link/link/include/ableton/discovery/PeerGateway.hpp +++ b/tidal-link/link/include/ableton/discovery/PeerGateway.hpp @@ -216,7 +216,7 @@ PeerGateway makePeerGateway( // IpV4 gateway types template using IpV4Messenger = UdpMessenger< - IpV4Interface::type&, v1::kMaxMessageSize>, + IpInterface::type&, v1::kMaxMessageSize>, StateQuery, IoContext>; @@ -226,11 +226,11 @@ using IpV4Gateway = PeerObserver, IoContext>; -// Factory function to bind a PeerGateway to an IpV4Interface with the given address. +// Factory function to bind a PeerGateway to an IpInterface with the given address. template IpV4Gateway makeIpV4Gateway( util::Injected io, - const asio::ip::address_v4& addr, + const IpAddress& addr, util::Injected observer, NodeState state) { @@ -240,7 +240,7 @@ IpV4Gateway makeIpV4Gateway( const uint8_t ttl = 5; const uint8_t ttlRatio = 20; - auto iface = makeIpV4Interface(injectRef(*io), addr); + auto iface = makeIpInterface(injectRef(*io), addr); auto messenger = makeUdpMessenger( injectVal(std::move(iface)), std::move(state), injectRef(*io), ttl, ttlRatio); diff --git a/tidal-link/link/include/ableton/discovery/PeerGateways.hpp b/tidal-link/link/include/ableton/discovery/PeerGateways.hpp index bdefbaef2..959d7fd29 100644 --- a/tidal-link/link/include/ableton/discovery/PeerGateways.hpp +++ b/tidal-link/link/include/ableton/discovery/PeerGateways.hpp @@ -19,8 +19,8 @@ #pragma once +#include #include -#include #include namespace ableton @@ -28,16 +28,17 @@ namespace ableton namespace discovery { -// GatewayFactory must have an operator()(NodeState, IoRef, asio::ip::address) +// GatewayFactory must have an operator()(NodeState, IoRef, IpAddress) // that constructs a new PeerGateway on a given interface address. template class PeerGateways { public: using IoType = typename util::Injected::type; - using Gateway = typename std::result_of, asio::ip::address)>::type; - using GatewayMap = std::map; + using Gateway = decltype(std::declval()(std::declval(), + std::declval>(), + std::declval())); + using GatewayMap = std::map; PeerGateways(const std::chrono::seconds rescanPeriod, NodeState state, @@ -86,7 +87,7 @@ class PeerGateways // If a gateway has become non-responsive or is throwing exceptions, // this method can be invoked to either fix it or discard it. - void repairGateway(const asio::ip::address& gatewayAddr) + void repairGateway(const IpAddress& gatewayAddr) { if (mpScannerCallback->mGateways.erase(gatewayAddr)) { @@ -111,18 +112,18 @@ class PeerGateways { using namespace std; // Get the set of current addresses. - vector curAddrs; + vector curAddrs; curAddrs.reserve(mGateways.size()); transform(std::begin(mGateways), std::end(mGateways), back_inserter(curAddrs), [](const typename GatewayMap::value_type& vt) { return vt.first; }); // Now use set_difference to determine the set of addresses that // are new and the set of cur addresses that are no longer there - vector newAddrs; + vector newAddrs; set_difference(std::begin(range), std::end(range), std::begin(curAddrs), std::end(curAddrs), back_inserter(newAddrs)); - vector staleAddrs; + vector staleAddrs; set_difference(std::begin(curAddrs), std::end(curAddrs), std::begin(range), std::end(range), back_inserter(staleAddrs)); @@ -137,12 +138,8 @@ class PeerGateways { try { - // Only handle v4 for now - if (addr.is_v4()) - { - info(mIo.log()) << "initializing peer gateway on interface " << addr; - mGateways.emplace(addr, mFactory(mState, util::injectRef(mIo), addr.to_v4())); - } + info(mIo.log()) << "initializing peer gateway on interface " << addr; + mGateways.emplace(addr, mFactory(mState, util::injectRef(mIo), addr)); } catch (const runtime_error& e) { diff --git a/tidal-link/link/include/ableton/discovery/Service.hpp b/tidal-link/link/include/ableton/discovery/Service.hpp index 8898fce43..678811d96 100644 --- a/tidal-link/link/include/ableton/discovery/Service.hpp +++ b/tidal-link/link/include/ableton/discovery/Service.hpp @@ -59,7 +59,7 @@ class Service // Repair the gateway with the given address if possible. Its // sockets may have been closed, for example, and the gateway needs // to be regenerated. - void repairGateway(const asio::ip::address& gatewayAddr) + void repairGateway(const IpAddress& gatewayAddr) { mGateways.repairGateway(gatewayAddr); } diff --git a/tidal-link/link/include/ableton/discovery/UdpMessenger.hpp b/tidal-link/link/include/ableton/discovery/UdpMessenger.hpp index c15c6943a..cca36ae4c 100644 --- a/tidal-link/link/include/ableton/discovery/UdpMessenger.hpp +++ b/tidal-link/link/include/ableton/discovery/UdpMessenger.hpp @@ -19,10 +19,10 @@ #pragma once -#include +#include +#include #include #include -#include #include #include #include @@ -37,15 +37,23 @@ namespace discovery // interface through which the sending failed. struct UdpSendException : std::runtime_error { - UdpSendException(const std::runtime_error& e, asio::ip::address ifAddr) + UdpSendException(const std::runtime_error& e, IpAddress ifAddr) : std::runtime_error(e.what()) , interfaceAddr(std::move(ifAddr)) { } - asio::ip::address interfaceAddr; + IpAddress interfaceAddr; }; +template +UdpEndpoint ipV6Endpoint(Interface& iface, const UdpEndpoint& endpoint) +{ + auto v6Address = endpoint.address().to_v6(); + v6Address.scope_id(iface.endpoint().address().to_v6().scope_id()); + return {v6Address, endpoint.port()}; +} + // Throws UdpSendException template void sendUdpMessage(Interface& iface, @@ -53,7 +61,7 @@ void sendUdpMessage(Interface& iface, const uint8_t ttl, const v1::MessageType messageType, const Payload& payload, - const asio::ip::udp::endpoint& to) + const UdpEndpoint& to) { using namespace std; v1::MessageBuffer buffer; @@ -176,8 +184,16 @@ class UdpMessenger void sendByeBye() { - sendUdpMessage( - *mInterface, mState.ident(), 0, v1::kByeBye, makePayload(), multicastEndpoint()); + if (mInterface->endpoint().address().is_v4()) + { + sendUdpMessage(*mInterface, mState.ident(), 0, v1::kByeBye, makePayload(), + multicastEndpointV4()); + } + if (mInterface->endpoint().address().is_v6()) + { + sendUdpMessage(*mInterface, mState.ident(), 0, v1::kByeBye, makePayload(), + multicastEndpointV6(mInterface->endpoint().address().to_v6().scope_id())); + } } void updateState(NodeState state) @@ -213,21 +229,29 @@ class UdpMessenger if (delay < milliseconds{1}) { debug(mIo->log()) << "Broadcasting state"; - sendPeerState(v1::kAlive, multicastEndpoint()); + if (mInterface->endpoint().address().is_v4()) + { + sendPeerState(v1::kAlive, multicastEndpointV4()); + } + if (mInterface->endpoint().address().is_v6()) + { + sendPeerState(v1::kAlive, + multicastEndpointV6(mInterface->endpoint().address().to_v6().scope_id())); + } } } - void sendPeerState( - const v1::MessageType messageType, const asio::ip::udp::endpoint& to) + void sendPeerState(const v1::MessageType messageType, const UdpEndpoint& to) { sendUdpMessage( *mInterface, mState.ident(), mTtl, messageType, toPayload(mState), to); mLastBroadcastTime = mTimer.now(); } - void sendResponse(const asio::ip::udp::endpoint& to) + void sendResponse(const UdpEndpoint& to) { - sendPeerState(v1::kResponse, to); + const auto endpoint = to.address().is_v4() ? to : ipV6Endpoint(*mInterface, to); + sendPeerState(v1::kResponse, endpoint); } template @@ -237,10 +261,8 @@ class UdpMessenger } template - void operator()(Tag tag, - const asio::ip::udp::endpoint& from, - const It messageBegin, - const It messageEnd) + void operator()( + Tag tag, const UdpEndpoint& from, const It messageBegin, const It messageEnd) { auto result = v1::parseMessageHeader(messageBegin, messageEnd); diff --git a/tidal-link/link/include/ableton/discovery/test/Interface.hpp b/tidal-link/link/include/ableton/discovery/test/Interface.hpp index f538856ff..9f11b7527 100644 --- a/tidal-link/link/include/ableton/discovery/test/Interface.hpp +++ b/tidal-link/link/include/ableton/discovery/test/Interface.hpp @@ -31,9 +31,8 @@ namespace test class Interface { public: - void send(const uint8_t* const bytes, - const size_t numBytes, - const asio::ip::udp::endpoint& endpoint) + void send( + const uint8_t* const bytes, const size_t numBytes, const UdpEndpoint& endpoint) { sentMessages.push_back( std::make_pair(std::vector{bytes, bytes + numBytes}, endpoint)); @@ -42,31 +41,30 @@ class Interface template void receive(Callback callback, Tag tag) { - mCallback = [callback, tag](const asio::ip::udp::endpoint& from, - const std::vector& buffer) { + mCallback = [callback, tag]( + const UdpEndpoint& from, const std::vector& buffer) { callback(tag, from, begin(buffer), end(buffer)); }; } template - void incomingMessage( - const asio::ip::udp::endpoint& from, It messageBegin, It messageEnd) + void incomingMessage(const UdpEndpoint& from, It messageBegin, It messageEnd) { std::vector buffer{messageBegin, messageEnd}; mCallback(from, buffer); } - asio::ip::udp::endpoint endpoint() const + UdpEndpoint endpoint() const { - return asio::ip::udp::endpoint({}, 0); + return UdpEndpoint({}, 0); } - using SentMessage = std::pair, asio::ip::udp::endpoint>; + using SentMessage = std::pair, UdpEndpoint>; std::vector sentMessages; private: using ReceiveCallback = - std::function&)>; + std::function&)>; ReceiveCallback mCallback; }; diff --git a/tidal-link/link/include/ableton/discovery/test/Socket.hpp b/tidal-link/link/include/ableton/discovery/test/Socket.hpp index 2983bcefb..513d1a043 100644 --- a/tidal-link/link/include/ableton/discovery/test/Socket.hpp +++ b/tidal-link/link/include/ableton/discovery/test/Socket.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include @@ -37,12 +37,12 @@ class Socket { } - friend void configureUnicastSocket(Socket&, const asio::ip::address_v4&) + friend void configureUnicastSocket(Socket&, const IpAddressV4&) { } std::size_t send( - const uint8_t* const pData, const size_t numBytes, const asio::ip::udp::endpoint& to) + const uint8_t* const pData, const size_t numBytes, const discovery::UdpEndpoint& to) { sentMessages.push_back( std::make_pair(std::vector{pData, pData + numBytes}, to)); @@ -52,31 +52,29 @@ class Socket template void receive(Handler handler) { - mCallback = [handler](const asio::ip::udp::endpoint& from, - const std::vector& buffer) { + mCallback = [handler](const UdpEndpoint& from, const std::vector& buffer) { handler(from, begin(buffer), end(buffer)); }; } template - void incomingMessage( - const asio::ip::udp::endpoint& from, It messageBegin, It messageEnd) + void incomingMessage(const UdpEndpoint& from, It messageBegin, It messageEnd) { std::vector buffer{messageBegin, messageEnd}; mCallback(from, buffer); } - asio::ip::udp::endpoint endpoint() const + UdpEndpoint endpoint() const { - return asio::ip::udp::endpoint({}, 0); + return UdpEndpoint({}, 0); } - using SentMessage = std::pair, asio::ip::udp::endpoint>; + using SentMessage = std::pair, UdpEndpoint>; std::vector sentMessages; private: using ReceiveCallback = - std::function&)>; + std::function&)>; ReceiveCallback mCallback; }; diff --git a/tidal-link/link/include/ableton/link/Controller.hpp b/tidal-link/link/include/ableton/link/Controller.hpp index 2922f46f0..a0a3c1454 100644 --- a/tidal-link/link/include/ableton/link/Controller.hpp +++ b/tidal-link/link/include/ableton/link/Controller.hpp @@ -717,18 +717,11 @@ class Controller { GatewayPtr operator()(std::pair state, util::Injected io, - const asio::ip::address& addr) + const discovery::IpAddress& addr) { - if (addr.is_v4()) - { - return GatewayPtr{new ControllerGateway{std::move(io), addr.to_v4(), - util::injectVal(makeGatewayObserver(mController.mPeers, addr)), - std::move(state.first), std::move(state.second), mController.mClock}}; - } - else - { - throw std::runtime_error("Could not create peer gateway on non-ipV4 address"); - } + return GatewayPtr{new ControllerGateway{std::move(io), addr, + util::injectVal(makeGatewayObserver(mController.mPeers, addr)), + std::move(state.first), std::move(state.second), mController.mClock}}; } Controller& mController; diff --git a/tidal-link/link/include/ableton/link/Gateway.hpp b/tidal-link/link/include/ableton/link/Gateway.hpp index 16d6abdea..635227285 100644 --- a/tidal-link/link/include/ableton/link/Gateway.hpp +++ b/tidal-link/link/include/ableton/link/Gateway.hpp @@ -33,7 +33,7 @@ class Gateway { public: Gateway(util::Injected io, - asio::ip::address_v4 addr, + discovery::IpAddress addr, util::Injected observer, NodeState nodeState, GhostXForm ghostXForm, diff --git a/tidal-link/link/include/ableton/link/Measurement.hpp b/tidal-link/link/include/ableton/link/Measurement.hpp index 299ca24b6..6867360ae 100644 --- a/tidal-link/link/include/ableton/link/Measurement.hpp +++ b/tidal-link/link/include/ableton/link/Measurement.hpp @@ -45,7 +45,7 @@ struct Measurement Measurement(const PeerState& state, Callback callback, - asio::ip::address_v4 address, + discovery::IpAddress address, Clock clock, util::Injected io) : mIo(std::move(io)) @@ -69,12 +69,11 @@ struct Measurement Impl(const PeerState& state, Callback callback, - asio::ip::address_v4 address, + discovery::IpAddress address, Clock clock, util::Injected io) : mSocket(io->template openUnicastSocket(address)) , mSessionId(state.nodeState.sessionId) - , mEndpoint(state.endpoint) , mCallback(std::move(callback)) , mClock(std::move(clock)) , mTimer(io->makeTimer()) @@ -82,6 +81,17 @@ struct Measurement , mLog(channel(io->log(), "Measurement on gateway@" + address.to_string())) , mSuccess(false) { + if (state.endpoint.address().is_v4()) + { + mEndpoint = state.endpoint; + } + else + { + auto v6Address = state.endpoint.address().to_v6(); + v6Address.scope_id(address.to_v6().scope_id()); + mEndpoint = {v6Address, state.endpoint.port()}; + } + const auto ht = HostTime{mClock.micros()}; sendPing(mEndpoint, discovery::makePayload(ht)); resetTimer(); @@ -117,7 +127,7 @@ struct Measurement // Operator to handle incoming messages on the interface template void operator()( - const asio::ip::udp::endpoint& from, const It messageBegin, const It messageEnd) + const discovery::UdpEndpoint& from, const It messageBegin, const It messageEnd) { using namespace std; const auto result = v1::parseMessageHeader(messageBegin, messageEnd); @@ -197,7 +207,7 @@ struct Measurement } template - void sendPing(asio::ip::udp::endpoint to, const Payload& payload) + void sendPing(discovery::UdpEndpoint to, const Payload& payload) { v1::MessageBuffer buffer; const auto msgBegin = std::begin(buffer); @@ -232,7 +242,7 @@ struct Measurement Socket mSocket; SessionId mSessionId; - asio::ip::udp::endpoint mEndpoint; + discovery::UdpEndpoint mEndpoint; std::vector mData; Callback mCallback; Clock mClock; diff --git a/tidal-link/link/include/ableton/link/MeasurementEndpointV4.hpp b/tidal-link/link/include/ableton/link/MeasurementEndpointV4.hpp index 958aad958..fbec55f3c 100644 --- a/tidal-link/link/include/ableton/link/MeasurementEndpointV4.hpp +++ b/tidal-link/link/include/ableton/link/MeasurementEndpointV4.hpp @@ -19,8 +19,9 @@ #pragma once +#include #include -#include +#include namespace ableton { @@ -35,6 +36,10 @@ struct MeasurementEndpointV4 // Model the NetworkByteStreamSerializable concept friend std::uint32_t sizeInByteStream(const MeasurementEndpointV4 mep) { + if (mep.ep.address().is_v6()) + { + return 0; + } return discovery::sizeInByteStream( static_cast(mep.ep.address().to_v4().to_ulong())) + discovery::sizeInByteStream(mep.ep.port()); @@ -43,6 +48,7 @@ struct MeasurementEndpointV4 template friend It toNetworkByteStream(const MeasurementEndpointV4 mep, It out) { + assert(mep.ep.address().is_v4()); return discovery::toNetworkByteStream(mep.ep.port(), discovery::toNetworkByteStream( static_cast(mep.ep.address().to_v4().to_ulong()), std::move(out))); @@ -58,11 +64,11 @@ struct MeasurementEndpointV4 std::move(addrRes.second), end); return make_pair( MeasurementEndpointV4{ - {asio::ip::address_v4{std::move(addrRes.first)}, std::move(portRes.first)}}, + {discovery::IpAddressV4{std::move(addrRes.first)}, std::move(portRes.first)}}, std::move(portRes.second)); } - asio::ip::udp::endpoint ep; + discovery::UdpEndpoint ep; }; } // namespace link diff --git a/tidal-link/link/include/ableton/link/MeasurementEndpointV6.hpp b/tidal-link/link/include/ableton/link/MeasurementEndpointV6.hpp new file mode 100644 index 000000000..6c319ed1f --- /dev/null +++ b/tidal-link/link/include/ableton/link/MeasurementEndpointV6.hpp @@ -0,0 +1,75 @@ +/* Copyright 2023, Ableton AG, Berlin. All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * If you would like to incorporate Link into a proprietary software application, + * please contact . + */ + +#pragma once + +#include +#include +#include + +namespace ableton +{ +namespace link +{ + +struct MeasurementEndpointV6 +{ + static const std::int32_t key = 'mep6'; + static_assert(key == 0x6d657036, "Unexpected byte order"); + + // Model the NetworkByteStreamSerializable concept + friend std::uint32_t sizeInByteStream(const MeasurementEndpointV6 mep) + { + if (mep.ep.address().is_v4()) + { + return 0; + } + return discovery::sizeInByteStream(mep.ep.address().to_v6().to_bytes()) + + discovery::sizeInByteStream(mep.ep.port()); + } + + template + friend It toNetworkByteStream(const MeasurementEndpointV6 mep, It out) + { + assert(mep.ep.address().is_v6()); + return discovery::toNetworkByteStream( + mep.ep.port(), discovery::toNetworkByteStream( + mep.ep.address().to_v6().to_bytes(), std::move(out))); + } + + template + static std::pair fromNetworkByteStream(It begin, It end) + { + using namespace std; + auto addrRes = + discovery::Deserialize::fromNetworkByteStream( + std::move(begin), end); + auto portRes = discovery::Deserialize::fromNetworkByteStream( + std::move(addrRes.second), end); + return make_pair( + MeasurementEndpointV6{ + {discovery::IpAddressV6{std::move(addrRes.first)}, std::move(portRes.first)}}, + std::move(portRes.second)); + } + + discovery::UdpEndpoint ep; +}; + +} // namespace link +} // namespace ableton diff --git a/tidal-link/link/include/ableton/link/MeasurementService.hpp b/tidal-link/link/include/ableton/link/MeasurementService.hpp index 22bf46d52..5ed77ba5f 100644 --- a/tidal-link/link/include/ableton/link/MeasurementService.hpp +++ b/tidal-link/link/include/ableton/link/MeasurementService.hpp @@ -42,7 +42,7 @@ class MeasurementService using IoType = util::Injected; using MeasurementInstance = Measurement; - MeasurementService(asio::ip::address_v4 address, + MeasurementService(discovery::IpAddress address, SessionId sessionId, GhostXForm ghostXForm, Clock clock, @@ -65,7 +65,7 @@ class MeasurementService mPingResponder.updateNodeState(sessionId, xform); } - asio::ip::udp::endpoint endpoint() const + discovery::UdpEndpoint endpoint() const { return mPingResponder.endpoint(); } @@ -77,7 +77,7 @@ class MeasurementService using namespace std; const auto nodeId = state.nodeState.nodeId; - auto addr = mPingResponder.endpoint().address().to_v4(); + auto addr = mPingResponder.endpoint().address(); auto callback = CompletionCallback{*this, nodeId, handler}; try diff --git a/tidal-link/link/include/ableton/link/PeerState.hpp b/tidal-link/link/include/ableton/link/PeerState.hpp index 291c27891..1cad18dcf 100644 --- a/tidal-link/link/include/ableton/link/PeerState.hpp +++ b/tidal-link/link/include/ableton/link/PeerState.hpp @@ -21,6 +21,7 @@ #include #include +#include #include namespace ableton @@ -61,12 +62,16 @@ struct PeerState return lhs.nodeState == rhs.nodeState && lhs.endpoint == rhs.endpoint; } - friend auto toPayload(const PeerState& state) - -> decltype(std::declval() - + discovery::makePayload(MeasurementEndpointV4{{}})) + friend auto toPayload(const PeerState& state) -> decltype( + std::declval() + discovery::makePayload(MeasurementEndpointV4{{}}) + + discovery::makePayload(MeasurementEndpointV6{{}})) { + // This implements a switch if either an IPv4 or IPv6 endpoint is serialized. + // MeasurementEndpoints that contain an endpoint that does not match the IP protocol + // version return a sizeInByteStream() of zero and won't be serialized. return toPayload(state.nodeState) - + discovery::makePayload(MeasurementEndpointV4{state.endpoint}); + + discovery::makePayload(MeasurementEndpointV4{state.endpoint}) + + discovery::makePayload(MeasurementEndpointV6{state.endpoint}); } template @@ -75,15 +80,16 @@ struct PeerState using namespace std; auto peerState = PeerState{NodeState::fromPayload(std::move(id), begin, end), {}}; - discovery::parsePayload( - std::move(begin), std::move(end), [&peerState](MeasurementEndpointV4 me4) { - peerState.endpoint = std::move(me4.ep); - }); + discovery::parsePayload( + std::move(begin), std::move(end), + [&peerState](MeasurementEndpointV4 me4) { peerState.endpoint = std::move(me4.ep); }, + [&peerState]( + MeasurementEndpointV6 me6) { peerState.endpoint = std::move(me6.ep); }); return peerState; } NodeState nodeState; - asio::ip::udp::endpoint endpoint; + discovery::UdpEndpoint endpoint; }; } // namespace link diff --git a/tidal-link/link/include/ableton/link/Peers.hpp b/tidal-link/link/include/ableton/link/Peers.hpp index b633ec363..e35670021 100644 --- a/tidal-link/link/include/ableton/link/Peers.hpp +++ b/tidal-link/link/include/ableton/link/Peers.hpp @@ -47,7 +47,7 @@ class Peers struct Impl; public: - using Peer = std::pair; + using Peer = std::pair; Peers(util::Injected io, SessionMembershipCallback membership, @@ -119,7 +119,7 @@ class Peers using GatewayObserverNodeState = PeerState; using GatewayObserverNodeId = NodeId; - GatewayObserver(std::shared_ptr pImpl, asio::ip::address addr) + GatewayObserver(std::shared_ptr pImpl, discovery::IpAddress addr) : mpImpl(std::move(pImpl)) , mAddr(std::move(addr)) { @@ -165,11 +165,11 @@ class Peers } std::shared_ptr mpImpl; - asio::ip::address mAddr; + discovery::IpAddress mAddr; }; // Factory function for the gateway observer - friend GatewayObserver makeGatewayObserver(Peers& peers, asio::ip::address addr) + friend GatewayObserver makeGatewayObserver(Peers& peers, discovery::IpAddress addr) { return GatewayObserver{peers.mpImpl, std::move(addr)}; } @@ -188,7 +188,7 @@ class Peers { } - void sawPeerOnGateway(PeerState peerState, asio::ip::address gatewayAddr) + void sawPeerOnGateway(PeerState peerState, discovery::IpAddress gatewayAddr) { using namespace std; @@ -255,7 +255,7 @@ class Peers } } - void peerLeftGateway(const NodeId& nodeId, const asio::ip::address& gatewayAddr) + void peerLeftGateway(const NodeId& nodeId, const discovery::IpAddress& gatewayAddr) { using namespace std; @@ -276,7 +276,7 @@ class Peers } } - void gatewayClosed(const asio::ip::address& gatewayAddr) + void gatewayClosed(const discovery::IpAddress& gatewayAddr) { using namespace std; diff --git a/tidal-link/link/include/ableton/link/PingResponder.hpp b/tidal-link/link/include/ableton/link/PingResponder.hpp index a8f455fe5..4d107bd8a 100644 --- a/tidal-link/link/include/ableton/link/PingResponder.hpp +++ b/tidal-link/link/include/ableton/link/PingResponder.hpp @@ -40,7 +40,7 @@ class PingResponder using Socket = typename IoType::type::template Socket; public: - PingResponder(asio::ip::address_v4 address, + PingResponder(discovery::IpAddress address, SessionId sessionId, GhostXForm ghostXForm, Clock clock, @@ -64,12 +64,12 @@ class PingResponder mpImpl->mGhostXForm = std::move(xform); } - asio::ip::udp::endpoint endpoint() const + discovery::UdpEndpoint endpoint() const { return mpImpl->mSocket.endpoint(); } - asio::ip::address address() const + discovery::IpAddress address() const { return endpoint().address(); } @@ -82,7 +82,7 @@ class PingResponder private: struct Impl : std::enable_shared_from_this { - Impl(asio::ip::address_v4 address, + Impl(discovery::IpAddress address, SessionId sessionId, GhostXForm ghostXForm, Clock clock, @@ -102,7 +102,7 @@ class PingResponder // Operator to handle incoming messages on the interface template - void operator()(const asio::ip::udp::endpoint& from, const It begin, const It end) + void operator()(const discovery::UdpEndpoint& from, const It begin, const It end) { using namespace discovery; @@ -136,7 +136,7 @@ class PingResponder } template - void reply(It begin, It end, const asio::ip::udp::endpoint& to) + void reply(It begin, It end, const discovery::UdpEndpoint& to) { using namespace discovery; diff --git a/tidal-link/link/include/ableton/link/SessionState.hpp b/tidal-link/link/include/ableton/link/SessionState.hpp index 183c8a9c6..616a5b40c 100644 --- a/tidal-link/link/include/ableton/link/SessionState.hpp +++ b/tidal-link/link/include/ableton/link/SessionState.hpp @@ -23,6 +23,7 @@ #include #include #include +#include namespace ableton { diff --git a/tidal-link/link/include/ableton/platforms/Config.hpp b/tidal-link/link/include/ableton/platforms/Config.hpp index 9deba58bd..22f4bd30e 100644 --- a/tidal-link/link/include/ableton/platforms/Config.hpp +++ b/tidal-link/link/include/ableton/platforms/Config.hpp @@ -62,31 +62,33 @@ namespace platform using Clock = platforms::windows::Clock; using Random = platforms::stl::Random; #if defined(LINK_WINDOWS_SETTHREADDESCRIPTION) -using IoContext = platforms::asio::Context; +using IoContext = + platforms::LINK_ASIO_NAMESPACE::Context; #else using IoContext = - platforms::asio::Context; + platforms::LINK_ASIO_NAMESPACE::Context; #endif #elif defined(LINK_PLATFORM_MACOSX) using Clock = platforms::darwin::Clock; -using IoContext = platforms::asio::Context; using Random = platforms::stl::Random; #elif defined(LINK_PLATFORM_LINUX) -using Clock = platforms::linux::ClockMonotonicRaw; +using Clock = platforms::linux_::ClockMonotonicRaw; using Random = platforms::stl::Random; #ifdef __linux__ -using IoContext = platforms::asio::Context; + platforms::linux_::ThreadFactory>; #else using IoContext = - platforms::asio::Context; + platforms::LINK_ASIO_NAMESPACE::Context; #endif #elif defined(ESP_PLATFORM) diff --git a/tidal-link/link/include/ableton/platforms/asio/AsioTimer.hpp b/tidal-link/link/include/ableton/platforms/asio/AsioTimer.hpp index e2c71b011..76bca025b 100644 --- a/tidal-link/link/include/ableton/platforms/asio/AsioTimer.hpp +++ b/tidal-link/link/include/ableton/platforms/asio/AsioTimer.hpp @@ -27,7 +27,7 @@ namespace ableton { namespace platforms { -namespace asio +namespace LINK_ASIO_NAMESPACE { // This implementation is based on the boost::asio::system_timer concept. @@ -41,11 +41,14 @@ namespace asio class AsioTimer { public: - using ErrorCode = ::asio::error_code; + using ErrorCode = ::LINK_ASIO_NAMESPACE::error_code; using TimePoint = std::chrono::system_clock::time_point; + using IoService = ::LINK_ASIO_NAMESPACE::io_service; + using SystemTimer = ::LINK_ASIO_NAMESPACE::system_timer; - AsioTimer(::asio::io_service& io) - : mpTimer(new ::asio::system_timer(io)) + + AsioTimer(IoService& io) + : mpTimer(new SystemTimer(io)) , mpAsyncHandler(std::make_shared()) { } @@ -123,10 +126,10 @@ class AsioTimer std::function mpHandler; }; - std::unique_ptr<::asio::system_timer> mpTimer; + std::unique_ptr mpTimer; std::shared_ptr mpAsyncHandler; }; -} // namespace asio +} // namespace LINK_ASIO_NAMESPACE } // namespace platforms } // namespace ableton diff --git a/tidal-link/link/include/ableton/platforms/asio/AsioWrapper.hpp b/tidal-link/link/include/ableton/platforms/asio/AsioWrapper.hpp index 1f3dc4d4e..2ea362a5e 100644 --- a/tidal-link/link/include/ableton/platforms/asio/AsioWrapper.hpp +++ b/tidal-link/link/include/ableton/platforms/asio/AsioWrapper.hpp @@ -26,12 +26,19 @@ * by Link. */ -#if !defined(ESP_PLATFORM) +#if defined(ESP_PLATFORM) + +#define LINK_ASIO_NAMESPACE asio + +#else + #pragma push_macro("ASIO_STANDALONE") -#define ASIO_STANDALONE 1 #pragma push_macro("ASIO_NO_TYPEID") #define ASIO_NO_TYPEID 1 +#define asio link_asio_1_28_0 +#define LINK_ASIO_NAMESPACE link_asio_1_28_0 +#define ASIO_STANDALONE 1 #endif #if defined(LINK_PLATFORM_WINDOWS) @@ -75,11 +82,6 @@ #pragma pop_macro("INCL_EXTRA_HTON_FUNCTIONS") #endif -#if !defined(ESP_PLATFORM) -#pragma pop_macro("ASIO_STANDALONE") -#pragma pop_macro("ASIO_NO_TYPEID") -#endif - #if defined(_MSC_VER) #pragma warning(pop) #undef _SCL_SECURE_NO_WARNINGS @@ -88,3 +90,5 @@ #if defined(__clang__) #pragma clang diagnostic pop #endif + +#undef asio diff --git a/tidal-link/link/include/ableton/platforms/asio/Context.hpp b/tidal-link/link/include/ableton/platforms/asio/Context.hpp index 7c10a4bc5..f0909df1f 100644 --- a/tidal-link/link/include/ableton/platforms/asio/Context.hpp +++ b/tidal-link/link/include/ableton/platforms/asio/Context.hpp @@ -19,9 +19,8 @@ #pragma once -#include +#include #include -#include #include #include #include @@ -31,7 +30,7 @@ namespace ableton { namespace platforms { -namespace asio +namespace LINK_ASIO_NAMESPACE { namespace { @@ -51,7 +50,7 @@ template @@ -59,7 +58,9 @@ class Context LockFreeCallbackDispatcher; template - using Socket = asio::Socket; + using Socket = Socket; + using IoService = ::LINK_ASIO_NAMESPACE::io_service; + using Work = IoService::work; Context() : Context(DefaultHandler{}) @@ -68,11 +69,11 @@ class Context template explicit Context(ExceptionHandler exceptHandler) - : mpService(new ::asio::io_service()) - , mpWork(new ::asio::io_service::work(*mpService)) + : mpService(new IoService()) + , mpWork(new Work(*mpService)) { mThread = ThreadFactoryT::makeThread("Link Main", - [](::asio::io_service& service, ExceptionHandler handler) { + [](IoService& service, ExceptionHandler handler) { for (;;) { try @@ -121,34 +122,79 @@ class Context template - Socket openUnicastSocket(const ::asio::ip::address_v4& addr) + Socket openUnicastSocket(const discovery::IpAddress addr) { - auto socket = Socket{*mpService}; + auto socket = + addr.is_v4() ? Socket{*mpService, ::LINK_ASIO_NAMESPACE::ip::udp::v4()} + : Socket{*mpService, ::LINK_ASIO_NAMESPACE::ip::udp::v6()}; socket.mpImpl->mSocket.set_option( - ::asio::ip::multicast::enable_loopback(addr.is_loopback())); - socket.mpImpl->mSocket.set_option(::asio::ip::multicast::outbound_interface(addr)); - socket.mpImpl->mSocket.bind(::asio::ip::udp::endpoint{addr, 0}); + ::LINK_ASIO_NAMESPACE::ip::multicast::enable_loopback(addr.is_loopback())); + if (addr.is_v4()) + { + socket.mpImpl->mSocket.set_option( + ::LINK_ASIO_NAMESPACE::ip::multicast::outbound_interface(addr.to_v4())); + socket.mpImpl->mSocket.bind( + ::LINK_ASIO_NAMESPACE::ip::udp::endpoint{addr.to_v4(), 0}); + } + else if (addr.is_v6()) + { + const auto scopeId = addr.to_v6().scope_id(); + socket.mpImpl->mSocket.set_option( + ::LINK_ASIO_NAMESPACE::ip::multicast::outbound_interface( + static_cast(scopeId))); + socket.mpImpl->mSocket.bind( + ::LINK_ASIO_NAMESPACE::ip::udp::endpoint{addr.to_v6(), 0}); + } + else + { + throw(std::runtime_error("Unknown Protocol")); + } return socket; } template - Socket openMulticastSocket(const ::asio::ip::address_v4& addr) + Socket openMulticastSocket(const discovery::IpAddress& addr) { - auto socket = Socket{*mpService}; - socket.mpImpl->mSocket.set_option(::asio::ip::udp::socket::reuse_address(true)); + auto socket = + addr.is_v4() ? Socket{*mpService, ::LINK_ASIO_NAMESPACE::ip::udp::v4()} + : Socket{*mpService, ::LINK_ASIO_NAMESPACE::ip::udp::v6()}; + + socket.mpImpl->mSocket.set_option( + ::LINK_ASIO_NAMESPACE::ip::udp::socket::reuse_address(true)); socket.mpImpl->mSocket.set_option( - ::asio::socket_base::broadcast(!addr.is_loopback())); + ::LINK_ASIO_NAMESPACE::socket_base::broadcast(!addr.is_loopback())); socket.mpImpl->mSocket.set_option( - ::asio::ip::multicast::enable_loopback(addr.is_loopback())); - socket.mpImpl->mSocket.set_option(::asio::ip::multicast::outbound_interface(addr)); - socket.mpImpl->mSocket.bind({::asio::ip::address::from_string("0.0.0.0"), - discovery::multicastEndpoint().port()}); - socket.mpImpl->mSocket.set_option(::asio::ip::multicast::join_group( - discovery::multicastEndpoint().address().to_v4(), addr)); + ::LINK_ASIO_NAMESPACE::ip::multicast::enable_loopback(addr.is_loopback())); + + if (addr.is_v4()) + { + socket.mpImpl->mSocket.set_option( + ::LINK_ASIO_NAMESPACE::ip::multicast::outbound_interface(addr.to_v4())); + socket.mpImpl->mSocket.bind({::LINK_ASIO_NAMESPACE::ip::address_v4::any(), + discovery::multicastEndpointV4().port()}); + socket.mpImpl->mSocket.set_option(::LINK_ASIO_NAMESPACE::ip::multicast::join_group( + discovery::multicastEndpointV4().address().to_v4(), addr.to_v4())); + } + else if (addr.is_v6()) + { + const auto scopeId = addr.to_v6().scope_id(); + socket.mpImpl->mSocket.set_option( + ::LINK_ASIO_NAMESPACE::ip::multicast::outbound_interface( + static_cast(scopeId))); + const auto multicastEndpoint = discovery::multicastEndpointV6(scopeId); + socket.mpImpl->mSocket.bind( + {::LINK_ASIO_NAMESPACE::ip::address_v6::any(), multicastEndpoint.port()}); + socket.mpImpl->mSocket.set_option(::LINK_ASIO_NAMESPACE::ip::multicast::join_group( + multicastEndpoint.address().to_v6(), scopeId)); + } + else + { + throw(std::runtime_error("Unknown Protocol")); + } return socket; } - std::vector<::asio::ip::address> scanNetworkInterfaces() + std::vector scanNetworkInterfaces() { return mScanIpIfAddrs(); } @@ -184,13 +230,13 @@ class Context } }; - std::unique_ptr<::asio::io_service> mpService; - std::unique_ptr<::asio::io_service::work> mpWork; + std::unique_ptr<::LINK_ASIO_NAMESPACE::io_service> mpService; + std::unique_ptr<::LINK_ASIO_NAMESPACE::io_service::work> mpWork; std::thread mThread; Log mLog; ScanIpIfAddrs mScanIpIfAddrs; }; -} // namespace asio +} // namespace LINK_ASIO_NAMESPACE } // namespace platforms } // namespace ableton diff --git a/tidal-link/link/include/ableton/platforms/asio/LockFreeCallbackDispatcher.hpp b/tidal-link/link/include/ableton/platforms/asio/LockFreeCallbackDispatcher.hpp index 189a6f7ce..e23574713 100644 --- a/tidal-link/link/include/ableton/platforms/asio/LockFreeCallbackDispatcher.hpp +++ b/tidal-link/link/include/ableton/platforms/asio/LockFreeCallbackDispatcher.hpp @@ -27,7 +27,7 @@ namespace ableton { namespace platforms { -namespace asio +namespace LINK_ASIO_NAMESPACE { // Utility to signal invocation of a callback on another thread in a lock free manner. @@ -83,6 +83,6 @@ class LockFreeCallbackDispatcher std::thread mThread; }; -} // namespace asio +} // namespace LINK_ASIO_NAMESPACE } // namespace platforms } // namespace ableton diff --git a/tidal-link/link/include/ableton/platforms/asio/Socket.hpp b/tidal-link/link/include/ableton/platforms/asio/Socket.hpp index 8992f6d00..4fa469230 100644 --- a/tidal-link/link/include/ableton/platforms/asio/Socket.hpp +++ b/tidal-link/link/include/ableton/platforms/asio/Socket.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include #include @@ -28,14 +28,14 @@ namespace ableton { namespace platforms { -namespace asio +namespace LINK_ASIO_NAMESPACE { template struct Socket { - Socket(::asio::io_service& io) - : mpImpl(std::make_shared(io)) + Socket(::LINK_ASIO_NAMESPACE::io_service& io, ::LINK_ASIO_NAMESPACE::ip::udp protocol) + : mpImpl(std::make_shared(io, protocol)) { } @@ -47,12 +47,11 @@ struct Socket { } - std::size_t send(const uint8_t* const pData, - const size_t numBytes, - const ::asio::ip::udp::endpoint& to) + std::size_t send( + const uint8_t* const pData, const size_t numBytes, const discovery::UdpEndpoint& to) { assert(numBytes < MaxPacketSize); - return mpImpl->mSocket.send_to(::asio::buffer(pData, numBytes), to); + return mpImpl->mSocket.send_to(::LINK_ASIO_NAMESPACE::buffer(pData, numBytes), to); } template @@ -60,19 +59,19 @@ struct Socket { mpImpl->mHandler = std::move(handler); mpImpl->mSocket.async_receive_from( - ::asio::buffer(mpImpl->mReceiveBuffer, MaxPacketSize), mpImpl->mSenderEndpoint, - util::makeAsyncSafe(mpImpl)); + ::LINK_ASIO_NAMESPACE::buffer(mpImpl->mReceiveBuffer, MaxPacketSize), + mpImpl->mSenderEndpoint, util::makeAsyncSafe(mpImpl)); } - ::asio::ip::udp::endpoint endpoint() const + discovery::UdpEndpoint endpoint() const { return mpImpl->mSocket.local_endpoint(); } struct Impl { - Impl(::asio::io_service& io) - : mSocket(io, ::asio::ip::udp::v4()) + Impl(::LINK_ASIO_NAMESPACE::io_service& io, ::LINK_ASIO_NAMESPACE::ip::udp protocol) + : mSocket(io, protocol) { } @@ -80,12 +79,13 @@ struct Socket { // Ignore error codes in shutdown and close as the socket may // have already been forcibly closed - ::asio::error_code ec; - mSocket.shutdown(::asio::ip::udp::socket::shutdown_both, ec); + ::LINK_ASIO_NAMESPACE::error_code ec; + mSocket.shutdown(::LINK_ASIO_NAMESPACE::ip::udp::socket::shutdown_both, ec); mSocket.close(ec); } - void operator()(const ::asio::error_code& error, const std::size_t numBytes) + void operator()( + const ::LINK_ASIO_NAMESPACE::error_code& error, const std::size_t numBytes) { if (!error && numBytes > 0 && numBytes <= MaxPacketSize) { @@ -94,17 +94,17 @@ struct Socket } } - ::asio::ip::udp::socket mSocket; - ::asio::ip::udp::endpoint mSenderEndpoint; + discovery::UdpSocket mSocket; + discovery::UdpEndpoint mSenderEndpoint; using Buffer = std::array; Buffer mReceiveBuffer; using ByteIt = typename Buffer::const_iterator; - std::function mHandler; + std::function mHandler; }; std::shared_ptr mpImpl; }; -} // namespace asio +} // namespace LINK_ASIO_NAMESPACE } // namespace platforms } // namespace ableton diff --git a/tidal-link/link/include/ableton/platforms/darwin/Clock.hpp b/tidal-link/link/include/ableton/platforms/darwin/Clock.hpp index dd40ff4b2..3164e68c9 100644 --- a/tidal-link/link/include/ableton/platforms/darwin/Clock.hpp +++ b/tidal-link/link/include/ableton/platforms/darwin/Clock.hpp @@ -19,6 +19,7 @@ #pragma once +#include #include #include @@ -49,6 +50,8 @@ struct Clock Ticks microsToTicks(const Micros micros) const { + // Negative Micros can not be represented in Ticks + assert(micros.count() >= 0); return static_cast(micros.count() / mTicksToMicros); } diff --git a/tidal-link/link/include/ableton/platforms/esp32/Context.hpp b/tidal-link/link/include/ableton/platforms/esp32/Context.hpp index 0c1cd00b5..ccf02fe5f 100644 --- a/tidal-link/link/include/ableton/platforms/esp32/Context.hpp +++ b/tidal-link/link/include/ableton/platforms/esp32/Context.hpp @@ -19,12 +19,12 @@ #pragma once -#include +#include +#include #include -#include #include #include -#include +#include #include #include @@ -40,7 +40,6 @@ class Context { class ServiceRunner { - static void run(void* userParams) { auto runner = static_cast(userParams); @@ -60,11 +59,7 @@ class Context static void IRAM_ATTR timerIsr(void* userParam) { static BaseType_t xHigherPriorityTaskWoken = pdFALSE; - - timer_group_clr_intr_status_in_isr(TIMER_GROUP_0, TIMER_1); - timer_group_enable_alarm_in_isr(TIMER_GROUP_0, TIMER_1); - - vTaskNotifyGiveFromISR(userParam, &xHigherPriorityTaskWoken); + vTaskNotifyGiveFromISR(*((TaskHandle_t*)userParam), &xHigherPriorityTaskWoken); if (xHigherPriorityTaskWoken) { portYIELD_FROM_ISR(); @@ -79,24 +74,21 @@ class Context xTaskCreatePinnedToCore(run, "link", 8192, this, 2 | portPRIVILEGE_BIT, &mTaskHandle, LINK_ESP_TASK_CORE_ID); - timer_config_t config = {.alarm_en = TIMER_ALARM_EN, - .counter_en = TIMER_PAUSE, - .intr_type = TIMER_INTR_LEVEL, - .counter_dir = TIMER_COUNT_UP, - .auto_reload = TIMER_AUTORELOAD_EN, - .divider = 80}; + const esp_timer_create_args_t timerArgs = { + .callback = &timerIsr, + .arg = (void*)&mTaskHandle, + .dispatch_method = ESP_TIMER_TASK, + .name = "link", + .skip_unhandled_events = true, + }; - timer_init(TIMER_GROUP_0, TIMER_1, &config); - timer_set_counter_value(TIMER_GROUP_0, TIMER_1, 0); - timer_set_alarm_value(TIMER_GROUP_0, TIMER_1, 100); - timer_enable_intr(TIMER_GROUP_0, TIMER_1); - timer_isr_register(TIMER_GROUP_0, TIMER_1, &timerIsr, mTaskHandle, 0, nullptr); - - timer_start(TIMER_GROUP_0, TIMER_1); + ESP_ERROR_CHECK(esp_timer_create(&timerArgs, &mTimer)); + ESP_ERROR_CHECK(esp_timer_start_periodic(mTimer, 100)); } ~ServiceRunner() { + esp_timer_delete(mTimer); vTaskDelete(mTaskHandle); } @@ -113,6 +105,7 @@ class Context private: TaskHandle_t mTaskHandle; + esp_timer_handle_t mTimer; std::unique_ptr<::asio::io_service> mpService; std::unique_ptr<::asio::io_service::work> mpWork; }; @@ -150,30 +143,72 @@ class Context } template - Socket openUnicastSocket(const ::asio::ip::address_v4& addr) + Socket openUnicastSocket(const ::asio::ip::address& addr) { - auto socket = Socket{serviceRunner().service()}; + auto socket = + addr.is_v4() ? Socket{serviceRunner().service(), ::asio::ip::udp::v4()} + : Socket{serviceRunner().service(), ::asio::ip::udp::v6()}; socket.mpImpl->mSocket.set_option( ::asio::ip::multicast::enable_loopback(addr.is_loopback())); - socket.mpImpl->mSocket.set_option(::asio::ip::multicast::outbound_interface(addr)); - socket.mpImpl->mSocket.bind(::asio::ip::udp::endpoint{addr, 0}); + if (addr.is_v4()) + { + socket.mpImpl->mSocket.set_option( + ::asio::ip::multicast::outbound_interface(addr.to_v4())); + socket.mpImpl->mSocket.bind( + ::LINK_ASIO_NAMESPACE::ip::udp::endpoint{addr.to_v4(), 0}); + } + else if (addr.is_v6()) + { + const auto scopeId = addr.to_v6().scope_id(); + socket.mpImpl->mSocket.set_option( + ::asio::ip::multicast::outbound_interface(static_cast(scopeId))); + socket.mpImpl->mSocket.bind( + ::LINK_ASIO_NAMESPACE::ip::udp::endpoint{addr.to_v6(), 0}); + } + else + { + throw(std::runtime_error("Unknown Protocol")); + } return socket; } template - Socket openMulticastSocket(const ::asio::ip::address_v4& addr) + Socket openMulticastSocket(const ::asio::ip::address& addr) { - auto socket = Socket{serviceRunner().service()}; + auto socket = + addr.is_v4() ? Socket{serviceRunner().service(), ::asio::ip::udp::v4()} + : Socket{serviceRunner().service(), ::asio::ip::udp::v6()}; + socket.mpImpl->mSocket.set_option(::asio::ip::udp::socket::reuse_address(true)); socket.mpImpl->mSocket.set_option( ::asio::socket_base::broadcast(!addr.is_loopback())); socket.mpImpl->mSocket.set_option( ::asio::ip::multicast::enable_loopback(addr.is_loopback())); - socket.mpImpl->mSocket.set_option(::asio::ip::multicast::outbound_interface(addr)); - socket.mpImpl->mSocket.bind({::asio::ip::address::from_string("0.0.0.0"), - discovery::multicastEndpoint().port()}); - socket.mpImpl->mSocket.set_option(::asio::ip::multicast::join_group( - discovery::multicastEndpoint().address().to_v4(), addr)); + + if (addr.is_v4()) + { + socket.mpImpl->mSocket.set_option( + ::asio::ip::multicast::outbound_interface(addr.to_v4())); + socket.mpImpl->mSocket.bind( + {::asio::ip::address_v4::any(), discovery::multicastEndpointV4().port()}); + socket.mpImpl->mSocket.set_option(::asio::ip::multicast::join_group( + discovery::multicastEndpointV4().address().to_v4(), addr.to_v4())); + } + else if (addr.is_v6()) + { + const auto scopeId = addr.to_v6().scope_id(); + socket.mpImpl->mSocket.set_option( + ::asio::ip::multicast::outbound_interface(static_cast(scopeId))); + const auto multicastEndpoint = discovery::multicastEndpointV6(scopeId); + socket.mpImpl->mSocket.bind( + {::asio::ip::address_v6::any(), multicastEndpoint.port()}); + socket.mpImpl->mSocket.set_option( + ::asio::ip::multicast::join_group(multicastEndpoint.address().to_v6(), scopeId)); + } + else + { + throw(std::runtime_error("Unknown Protocol")); + } return socket; } diff --git a/tidal-link/link/include/ableton/platforms/esp32/ScanIpIfAddrs.hpp b/tidal-link/link/include/ableton/platforms/esp32/ScanIpIfAddrs.hpp index 527d080a5..a9e5c9a4b 100644 --- a/tidal-link/link/include/ableton/platforms/esp32/ScanIpIfAddrs.hpp +++ b/tidal-link/link/include/ableton/platforms/esp32/ScanIpIfAddrs.hpp @@ -17,7 +17,7 @@ #pragma once -#include +#include #include #include #include @@ -33,9 +33,9 @@ namespace esp32 // ESP32 implementation of ip interface address scanner struct ScanIpIfAddrs { - std::vector<::asio::ip::address> operator()() + std::vector operator()() { - std::vector<::asio::ip::address> addrs; + std::vector addrs; // Get first network interface esp_netif_t* esp_netif = esp_netif_next(NULL); while (esp_netif) diff --git a/tidal-link/link/include/ableton/platforms/linux/Clock.hpp b/tidal-link/link/include/ableton/platforms/linux/Clock.hpp index accfe4720..5ea60ed87 100644 --- a/tidal-link/link/include/ableton/platforms/linux/Clock.hpp +++ b/tidal-link/link/include/ableton/platforms/linux/Clock.hpp @@ -28,15 +28,11 @@ namespace ableton namespace platforms { -#ifdef linux -#undef linux -#endif - #if defined(__FreeBSD_kernel__) #define CLOCK_MONOTONIC_RAW CLOCK_MONOTONIC #endif -namespace linux +namespace linux_ { template @@ -55,6 +51,6 @@ class Clock using ClockMonotonic = Clock; using ClockMonotonicRaw = Clock; -} // namespace linux +} // namespace linux_ } // namespace platforms } // namespace ableton diff --git a/tidal-link/link/include/ableton/platforms/linux/ThreadFactory.hpp b/tidal-link/link/include/ableton/platforms/linux/ThreadFactory.hpp index 81988f90b..4d8679aa5 100644 --- a/tidal-link/link/include/ableton/platforms/linux/ThreadFactory.hpp +++ b/tidal-link/link/include/ableton/platforms/linux/ThreadFactory.hpp @@ -26,7 +26,7 @@ namespace ableton { namespace platforms { -namespace linux +namespace linux_ { struct ThreadFactory @@ -40,6 +40,6 @@ struct ThreadFactory } }; -} // namespace linux +} // namespace linux_ } // namespace platforms } // namespace ableton diff --git a/tidal-link/link/include/ableton/platforms/posix/ScanIpIfAddrs.hpp b/tidal-link/link/include/ableton/platforms/posix/ScanIpIfAddrs.hpp index 8d24bc2f4..ba07dc5f0 100644 --- a/tidal-link/link/include/ableton/platforms/posix/ScanIpIfAddrs.hpp +++ b/tidal-link/link/include/ableton/platforms/posix/ScanIpIfAddrs.hpp @@ -19,11 +19,12 @@ #pragma once -#include -#include +#include #include #include +#include #include +#include #include namespace ableton @@ -75,34 +76,49 @@ struct ScanIpIfAddrs { // Scan active network interfaces and return corresponding addresses // for all ip-based interfaces. - std::vector<::asio::ip::address> operator()() + std::vector operator()() { - std::vector<::asio::ip::address> addrs; + std::vector addrs; + std::map IpInterfaceNames; detail::GetIfAddrs getIfAddrs; - getIfAddrs.withIfAddrs([&addrs](const struct ifaddrs& interfaces) { + getIfAddrs.withIfAddrs([&addrs, &IpInterfaceNames](const struct ifaddrs& interfaces) { const struct ifaddrs* interface; for (interface = &interfaces; interface; interface = interface->ifa_next) { auto addr = reinterpret_cast(interface->ifa_addr); - if (addr && interface->ifa_flags & IFF_UP) + if (addr && interface->ifa_flags & IFF_RUNNING && addr->sin_family == AF_INET) { - if (addr->sin_family == AF_INET) - { - auto bytes = reinterpret_cast(&addr->sin_addr); - addrs.emplace_back(asio::makeAddress<::asio::ip::address_v4>(bytes)); - } - else if (addr->sin_family == AF_INET6) + auto bytes = reinterpret_cast(&addr->sin_addr); + auto address = discovery::makeAddress(bytes); + addrs.emplace_back(std::move(address)); + IpInterfaceNames.insert(std::make_pair(interface->ifa_name, address)); + } + } + }); + + getIfAddrs.withIfAddrs([&addrs, &IpInterfaceNames](const struct ifaddrs& interfaces) { + const struct ifaddrs* interface; + for (interface = &interfaces; interface; interface = interface->ifa_next) + { + auto addr = reinterpret_cast(interface->ifa_addr); + if (addr && interface->ifa_flags & IFF_RUNNING && addr->sin_family == AF_INET6) + { + auto addr6 = reinterpret_cast(addr); + auto bytes = reinterpret_cast(&addr6->sin6_addr); + auto scopeId = addr6->sin6_scope_id; + auto address = discovery::makeAddress(bytes, scopeId); + if (IpInterfaceNames.find(interface->ifa_name) != IpInterfaceNames.end() + && !address.is_loopback() && address.is_link_local()) { - auto addr6 = reinterpret_cast(addr); - auto bytes = reinterpret_cast(&addr6->sin6_addr); - addrs.emplace_back(asio::makeAddress<::asio::ip::address_v6>(bytes)); + addrs.emplace_back(std::move(address)); } } } }); + return addrs; - } + }; }; } // namespace posix diff --git a/tidal-link/link/include/ableton/platforms/windows/ScanIpIfAddrs.hpp b/tidal-link/link/include/ableton/platforms/windows/ScanIpIfAddrs.hpp index e2b6f8459..229486e9a 100644 --- a/tidal-link/link/include/ableton/platforms/windows/ScanIpIfAddrs.hpp +++ b/tidal-link/link/include/ableton/platforms/windows/ScanIpIfAddrs.hpp @@ -19,10 +19,11 @@ #pragma once -#include -#include +#include #include +#include #include +#include #include #include #include @@ -99,12 +100,13 @@ struct ScanIpIfAddrs { // Scan active network interfaces and return corresponding addresses // for all ip-based interfaces. - std::vector<::asio::ip::address> operator()() + std::vector operator()() { - std::vector<::asio::ip::address> addrs; + std::vector addrs; + std::map IpInterfaceNames; detail::GetIfAddrs getIfAddrs; - getIfAddrs.withIfAddrs([&addrs](const IP_ADAPTER_ADDRESSES& interfaces) { + getIfAddrs.withIfAddrs([&](const IP_ADAPTER_ADDRESSES& interfaces) { const IP_ADAPTER_ADDRESSES* networkInterface; for (networkInterface = &interfaces; networkInterface; networkInterface = networkInterface->Next) @@ -119,18 +121,41 @@ struct ScanIpIfAddrs SOCKADDR_IN* addr4 = reinterpret_cast(address->Address.lpSockaddr); auto bytes = reinterpret_cast(&addr4->sin_addr); - addrs.emplace_back(asio::makeAddress<::asio::ip::address_v4>(bytes)); + auto ipv4address = discovery::makeAddress(bytes); + addrs.emplace_back(ipv4address); + IpInterfaceNames.insert( + std::make_pair(networkInterface->AdapterName, ipv4address)); } - else if (AF_INET6 == family) + } + } + }); + + getIfAddrs.withIfAddrs([&](const IP_ADAPTER_ADDRESSES& interfaces) { + const IP_ADAPTER_ADDRESSES* networkInterface; + for (networkInterface = &interfaces; networkInterface; + networkInterface = networkInterface->Next) + { + for (IP_ADAPTER_UNICAST_ADDRESS* address = networkInterface->FirstUnicastAddress; + NULL != address; address = address->Next) + { + auto family = address->Address.lpSockaddr->sa_family; + if (AF_INET6 == family + && IpInterfaceNames.find(networkInterface->AdapterName) + != IpInterfaceNames.end()) { - SOCKADDR_IN6* addr6 = + SOCKADDR_IN6* sockAddr = reinterpret_cast(address->Address.lpSockaddr); - auto bytes = reinterpret_cast(&addr6->sin6_addr); - addrs.emplace_back(asio::makeAddress<::asio::ip::address_v6>(bytes)); + auto bytes = reinterpret_cast(&sockAddr->sin6_addr); + auto addr6 = discovery::makeAddress(bytes); + if (!addr6.is_loopback() && addr6.is_link_local()) + { + addrs.emplace_back(addr6); + } } } } }); + return addrs; } }; diff --git a/tidal-link/link/include/ableton/test/serial_io/Context.hpp b/tidal-link/link/include/ableton/test/serial_io/Context.hpp index f450fbb79..f8f19bf20 100644 --- a/tidal-link/link/include/ableton/test/serial_io/Context.hpp +++ b/tidal-link/link/include/ableton/test/serial_io/Context.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include #include @@ -37,7 +37,7 @@ class Context { public: Context(const SchedulerTree::TimePoint& now, - const std::vector<::asio::ip::address>& ifAddrs, + const std::vector& ifAddrs, std::shared_ptr pScheduler) : mNow(now) , mIfAddrs(ifAddrs) @@ -91,14 +91,14 @@ class Context return mLog; } - std::vector<::asio::ip::address> scanNetworkInterfaces() + std::vector scanNetworkInterfaces() { return mIfAddrs; } private: const SchedulerTree::TimePoint& mNow; - const std::vector<::asio::ip::address>& mIfAddrs; + const std::vector& mIfAddrs; std::shared_ptr mpScheduler; Log mLog; SchedulerTree::TimerId mNextTimerId; diff --git a/tidal-link/link/include/ableton/test/serial_io/Fixture.hpp b/tidal-link/link/include/ableton/test/serial_io/Fixture.hpp index 316c44d0c..5983899a5 100644 --- a/tidal-link/link/include/ableton/test/serial_io/Fixture.hpp +++ b/tidal-link/link/include/ableton/test/serial_io/Fixture.hpp @@ -19,7 +19,7 @@ #pragma once -#include +#include #include #include #include @@ -50,7 +50,7 @@ class Fixture Fixture(Fixture&&) = delete; Fixture& operator=(Fixture&&) = delete; - void setNetworkInterfaces(std::vector<::asio::ip::address> ifAddrs) + void setNetworkInterfaces(std::vector ifAddrs) { mIfAddrs = std::move(ifAddrs); } @@ -84,7 +84,7 @@ class Fixture private: std::shared_ptr mpScheduler; SchedulerTree::TimePoint mNow; - std::vector<::asio::ip::address> mIfAddrs; + std::vector mIfAddrs; }; } // namespace serial_io diff --git a/tidal-link/link/modules/asio-standalone/.appveyor.yml b/tidal-link/link/modules/asio-standalone/.appveyor.yml index d7865c5a2..db7b09b3f 100644 --- a/tidal-link/link/modules/asio-standalone/.appveyor.yml +++ b/tidal-link/link/modules/asio-standalone/.appveyor.yml @@ -17,7 +17,6 @@ environment: SEPARATE_COMPILATION: 1 MSVC: 1 - STANDALONE: 1 - SEPARATE_COMPILATION: 1 MINGW: 1 - STANDALONE: 1 CXXLATEST: 1 @@ -37,7 +36,6 @@ environment: SEPARATE_COMPILATION: 1 MSVC: 1 - USING_BOOST: 1 - SEPARATE_COMPILATION: 1 MINGW: 1 for: diff --git a/tidal-link/link/modules/asio-standalone/.cirrus.yml b/tidal-link/link/modules/asio-standalone/.cirrus.yml index 3a7dafc39..9ace7fc90 100644 --- a/tidal-link/link/modules/asio-standalone/.cirrus.yml +++ b/tidal-link/link/modules/asio-standalone/.cirrus.yml @@ -1,5 +1,5 @@ freebsd_instance: - image_family: freebsd-12-1 + image_family: freebsd-13-0 cpu: 1 env: @@ -7,7 +7,7 @@ env: task: install_script: - - pkg install -y autoconf automake + - pkg install -y autoconf automake pkgconf build_script: - cd asio - ./autogen.sh diff --git a/tidal-link/link/modules/asio-standalone/.github/workflows/ci.yml b/tidal-link/link/modules/asio-standalone/.github/workflows/ci.yml new file mode 100644 index 000000000..3fa02cf7b --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/.github/workflows/ci.yml @@ -0,0 +1,380 @@ +name: asio CI + +on: + push: + branches: [ master, citest-* ] + +jobs: + build: + strategy: + fail-fast: false + matrix: + build-type: ['sanity'] + runs-on: [ubuntu-20.04, ubuntu-22.04, macos-latest] + compiler: [g++-7, g++-8, g++-9, g++-10, g++-11, g++-12, clang++-10, clang++-14, g++] + cxx-std: ['c++03', 'c++11', 'c++14', 'c++17', 'c++2a', 'c++20'] + separate-compilation: ['', '--enable-separate-compilation'] + optim-level: ['-O0'] + no-deprecated: [''] + select-reactor: ['', '-DASIO_DISABLE_EPOLL', '-DASIO_DISABLE_KQUEUE'] + handler-tracking: [''] + boost: [''] + boost-url: [''] + exclude: + # New compilers don't run on ubuntu 20.04 + - runs-on: ubuntu-20.04 + compiler: g++-12 + - runs-on: ubuntu-20.04 + compiler: clang++-14 + # Older compilers don't run on ubuntu 22.04 + - runs-on: ubuntu-22.04 + compiler: g++-7 + - runs-on: ubuntu-22.04 + compiler: g++-8 + - runs-on: ubuntu-22.04 + compiler: clang++-10 + # Unversioned g++ doesn't run on ubuntu + - runs-on: ubuntu-20.04 + compiler: g++ + - runs-on: ubuntu-22.04 + compiler: g++ + # Versioned g++ and clang++ don't run on macOS + - runs-on: macos-latest + compiler: g++-7 + - runs-on: macos-latest + compiler: g++-8 + - runs-on: macos-latest + compiler: g++-9 + - runs-on: macos-latest + compiler: g++-10 + - runs-on: macos-latest + compiler: g++-11 + - runs-on: macos-latest + compiler: g++-12 + - runs-on: macos-latest + compiler: clang++-10 + - runs-on: macos-latest + compiler: clang++-14 + # Older compilers don't support newer std variants + - compiler: g++-7 + cxx-std: c++2a + - compiler: g++-7 + cxx-std: c++20 + - compiler: g++-8 + cxx-std: c++20 + - compiler: g++-9 + cxx-std: c++20 + - compiler: g++-10 + cxx-std: c++2a + - compiler: g++-11 + cxx-std: c++2a + - compiler: g++-12 + cxx-std: c++2a + - compiler: clang++-10 + cxx-std: c++20 + - compiler: clang++-14 + cxx-std: c++2a + - runs-on: macos-latest + cxx-std: c++20 + # Specifying the select reactor is OS-specific + - runs-on: ubuntu-20.04 + select-reactor: -DASIO_DISABLE_KQUEUE + - runs-on: ubuntu-22.04 + select-reactor: -DASIO_DISABLE_KQUEUE + - runs-on: macos-latest + select-reactor: -DASIO_DISABLE_EPOLL + # Trim builds that use separate compilation + - compiler: g++-7 + separate-compilation: --enable-separate-compilation + - compiler: g++-8 + separate-compilation: --enable-separate-compilation + - compiler: g++-9 + separate-compilation: --enable-separate-compilation + - compiler: g++-10 + separate-compilation: --enable-separate-compilation + - compiler: g++-11 + separate-compilation: --enable-separate-compilation + - runs-on: macos-latest + cxx-std: c++14 + separate-compilation: --enable-separate-compilation + - runs-on: macos-latest + cxx-std: c++17 + separate-compilation: --enable-separate-compilation + # Trim builds that use select reactor + - compiler: g++-7 + select-reactor: -DASIO_DISABLE_EPOLL + - compiler: g++-8 + select-reactor: -DASIO_DISABLE_EPOLL + - compiler: g++-9 + select-reactor: -DASIO_DISABLE_EPOLL + - compiler: g++-10 + select-reactor: -DASIO_DISABLE_EPOLL + - compiler: g++-11 + select-reactor: -DASIO_DISABLE_EPOLL + # C++03 builds are always explicitly included + - cxx-std: c++03 + include: + # + # Linux / g++-12 -std=c++20 -fcoroutines / -O2 / standalone + # + - build-type: full + runs-on: ubuntu-22.04 + compiler: g++-12 + cxx-std: c++20 -fcoroutines + optim-level: -O2 + # + # Linux / g++-12 -std=c++17 / -O2 / boost 1.73 + # + - build-type: full + runs-on: ubuntu-22.04 + compiler: g++-12 + cxx-std: c++17 + optim-level: -O2 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_73_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.73.0/source/boost_1_73_0.tar.bz2 + # + # Linux / g++-11 -std=c++14 / -O0 / standalone / separate compilation + # + - build-type: full + runs-on: ubuntu-22.04 + compiler: g++-11 + cxx-std: c++14 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + # + # Linux / g++-10 / -O2 / standalone + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + optim-level: -O2 + # + # Linux / g++-10 / -O0 / standalone / handler tracking + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + optim-level: -O0 + handler-tracking: -DASIO_ENABLE_HANDLER_TRACKING + # + # Linux / g++-10 / -O0 / standalone / epoll disabled + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + optim-level: -O0 + select-reactor: -DASIO_DISABLE_EPOLL + # + # Linux / g++-10 / -O0 / standalone / separate compilation / handler tracking + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + handler-tracking: -DASIO_ENABLE_HANDLER_TRACKING + # + # Linux / g++-10 / -O0 / standalone / separate compilation / epoll disabled + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + select-reactor: -DASIO_DISABLE_EPOLL + # + # Linux / g++-10 / -O2 / boost 1.80 + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + optim-level: -O2 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + # + # Linux / g++-10 / -O0 / boost 1.80 / epoll disabled + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + optim-level: -O0 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + select-reactor: -DASIO_DISABLE_EPOLL + # + # Linux / g++-10 / -O0 / boost 1.80 / separate compilation + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-10 + cxx-std: c++14 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + # + # Linux / g++-7 / -O2 / standalone + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-7 + cxx-std: c++11 + optim-level: -O2 + # + # Linux / g++-7 / -O0 / standalone / separate compilation + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-7 + cxx-std: c++11 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + # + # Linux / g++-7 / -O2 / boost 1.80 + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-7 + cxx-std: c++03 + separate-compilation: --enable-separate-compilation + optim-level: -O2 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + # + # Linux / g++-7 -std=c++11 / -O2 / boost 1.80 + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: g++-7 + cxx-std: c++11 + separate-compilation: --enable-separate-compilation + optim-level: -O2 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + # + # Linux / clang++-14 -std=c++2a / -O2 / standalone + # + - build-type: full + runs-on: ubuntu-22.04 + compiler: clang++-14 + cxx-std: c++2a + optim-level: -O2 + # + # Linux / clang++-14 -std=c++11 / -O0 / standalone / separate compilation + # + - build-type: full + runs-on: ubuntu-22.04 + compiler: clang++-14 + cxx-std: c++11 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + # + # Linux / clang++-10 -std=c++11 / -O2 / standalone + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: clang++-10 + cxx-std: c++11 + optim-level: -O2 + # + # Linux / clang++-10 -std=c++11 / -O0 / boost 1.80 / separate compilation + # + - build-type: full + runs-on: ubuntu-20.04 + compiler: clang++-10 + cxx-std: c++03 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + # + # macOS / c++2a -fcoroutines-ts / -O2 / standalone + # + - build-type: full + runs-on: macos-latest + compiler: g++ + cxx-std: c++2a -fcoroutines-ts + optim-level: -O2 + # + # macOS / c++11 / -O2 / standalone + # + - build-type: full + runs-on: macos-latest + compiler: g++ + cxx-std: c++11 + optim-level: -O2 + # + # macOS / c++11 / -O0 / standalone / kqueue disabled + # + - build-type: full + runs-on: macos-latest + compiler: g++ + cxx-std: c++11 + optim-level: -O0 + select-reactor: -DASIO_DISABLE_KQUEUE + # + # macOS / c++11 / -O0 / standalone / separate compilation + # + - build-type: full + runs-on: macos-latest + compiler: g++ + cxx-std: c++11 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + # + # macOS / c++03 / -O2 / boost 1.80 + # + - build-type: full + runs-on: macos-latest + compiler: g++ + cxx-std: c++03 + optim-level: -O2 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + # + # macOS / c++03 / -O2 / boost 1.80 / separate compilation + # + - build-type: full + runs-on: macos-latest + compiler: g++ + cxx-std: c++03 + separate-compilation: --enable-separate-compilation + optim-level: -O0 + with-boost: --with-boost=$GITHUB_WORKSPACE/boost_1_80_0 + boost-url: https://boostorg.jfrog.io/artifactory/main/release/1.80.0/source/boost_1_80_0.tar.bz2 + runs-on: ${{ matrix.runs-on }} + env: + CXX: ${{ matrix.compiler }} + CXXFLAGS: -std=${{ matrix.cxx-std }} ${{ matrix.optim-level }} -Wall -Wextra ${{ matrix.no-deprecated }} ${{ matrix.select-reactor }} ${{ matrix.handler-tracking }} + steps: + - uses: actions/checkout@v2 + - name: Install autotools + if: startsWith(matrix.runs-on, 'macos') + run: brew install automake + - name: Install compiler + if: startsWith(matrix.runs-on, 'ubuntu') + run: sudo apt-get install -y ${{ matrix.compiler }} + - name: Install boost + if: startsWith(matrix.with-boost, '--with-boost=$GITHUB_WORKSPACE') + run: | + wget --quiet -O - ${{ matrix.boost-url }} | tar -xj + - name: Configure + working-directory: asio + run: | + ./autogen.sh + ./configure ${{ matrix.separate-compilation }} ${{ matrix.with-boost }} + - name: Sanity check + if: startsWith(matrix.build-type, 'sanity') + working-directory: asio/src/tests + run: make unit/io_context.log unit/ip/tcp.log unit/ts/net.log + - name: Build + if: startsWith(matrix.build-type, 'full') + working-directory: asio + run: make && make check diff --git a/tidal-link/link/modules/asio-standalone/.travis.yml b/tidal-link/link/modules/asio-standalone/.travis.yml deleted file mode 100644 index 06fb4b9a7..000000000 --- a/tidal-link/link/modules/asio-standalone/.travis.yml +++ /dev/null @@ -1,372 +0,0 @@ -language: cpp -os: linux -dist: xenial - -cache: - directories: - - ${TRAVIS_BUILD_DIR}/boost_1_64_0 - - ${TRAVIS_BUILD_DIR}/boost_1_73_0 - -matrix: - include: - # - #--------------------------------------------------------------------------- - # Linux / g++-9 - #--------------------------------------------------------------------------- - # - # Linux / g++-9 -std=c++2a / -O2 / standalone - # - - os: linux - dist: bionic - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-9 - env: - - CXXFLAGS="-std=c++2a -fconcepts -Wall -Wextra -O2" - - CONFIGFLAGS="--with-boost=no" - - MATRIX_EVAL="CC=gcc-9 CXX=g++-9" - compiler: gcc - # - # Linux / g++-9 -std=c++17 / -O2 / boost 1.73 - # - - os: linux - dist: bionic - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-9 - env: - - BOOST_DIR="boost_1_73_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.73.0/boost_1_73_0.tar.bz2/download" - - CXXFLAGS="-std=c++17 -Wall -Wextra -O2" - - CONFIGFLAGS="--with-boost=$PWD/$BOOST_DIR" - - MATRIX_EVAL="CC=gcc-9 CXX=g++-9" - compiler: gcc - # - # Linux / g++-9 -std=c++14 / -O0 / standalone / separate compilation - # - - os: linux - dist: bionic - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-9 - env: - - CXXFLAGS="-std=c++14 -Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--with-boost=no --enable-separate-compilation" - - MATRIX_EVAL="CC=gcc-9 CXX=g++-9" - compiler: gcc - # - #--------------------------------------------------------------------------- - # Linux / g++-6 - #--------------------------------------------------------------------------- - # - # Linux / g++-6 / -O2 / standalone - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - CXXFLAGS="-Wall -Wextra -O2" - - CONFIGFLAGS="--with-boost=no" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O0 / standalone / handler tracking - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline -DASIO_ENABLE_HANDLER_TRACKING" - - CONFIGFLAGS="--with-boost=no" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O0 / standalone / epoll disabled - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline -DASIO_DISABLE_EPOLL" - - CONFIGFLAGS="--with-boost=no" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O0 / standalone / separate compilation / handler tracking - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline -DASIO_ENABLE_HANDLER_TRACKING" - - CONFIGFLAGS="--with-boost=no --enable-separate-compilation" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O0 / standalone / separate compilation / epoll disabled - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline -DASIO_DISABLE_EPOLL" - - CONFIGFLAGS="--with-boost=no --enable-separate-compilation" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O2 / boost 1.64 - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-Wall -Wextra -O2" - - CONFIGFLAGS="" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O0 / boost 1.64 / epoll disabled - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline -DASIO_DISABLE_EPOLL" - - CONFIGFLAGS="" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - # Linux / g++-6 / -O0 / boost 1.64 / separate compilation - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-6 - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--enable-separate-compilation" - - MATRIX_EVAL="CC=gcc-6 CXX=g++-6" - compiler: gcc - # - #--------------------------------------------------------------------------- - # Linux / g++-4.8 - #--------------------------------------------------------------------------- - # - # Linux / g++-4.8 / -O2 / standalone - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - env: - - CXXFLAGS="-Wall -Wextra -O2" - - CONFIGFLAGS="--with-boost=no" - - MATRIX_EVAL="CC=gcc-4.8 CXX=g++-4.8" - compiler: gcc - # - # Linux / g++-4.8 / -O0 / standalone / separate compilation - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--with-boost=no --enable-separate-compilation" - - MATRIX_EVAL="CC=gcc-4.8 CXX=g++-4.8" - compiler: gcc - # - # Linux / g++-4.8 / -O2 / boost 1.64 - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-Wall -Wextra -O2" - - CONFIGFLAGS="" - - MATRIX_EVAL="CC=gcc-4.8 CXX=g++-4.8" - compiler: gcc - # - # Linux / g++-4.8 -std=c++11 / -O2 / boost 1.64 - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - packages: - - g++-4.8 - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-std=c++11 -Wall -Wextra -O2" - - CONFIGFLAGS="" - - MATRIX_EVAL="CC=gcc-4.8 CXX=g++-4.8" - compiler: gcc - # - #--------------------------------------------------------------------------- - # Linux / clang-3.8 - #--------------------------------------------------------------------------- - # - # Linux / clang-3.8 / -O2 / standalone" - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - - llvm-toolchain-precise-3.8 - packages: - - clang-3.8 - env: - - CXXFLAGS="-Wall -Wextra -O2" - - CONFIGFLAGS="--with-boost=no" - - MATRIX_EVAL="CC=clang-3.8 CXX=clang++-3.8" - compiler: clang - # - # Linux / clang-3.8 / -O0 / standalone / separate compilation - # - - os: linux - addons: - apt: - sources: - - ubuntu-toolchain-r-test - - llvm-toolchain-precise-3.8 - packages: - - clang-3.8 - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--with-boost=no --enable-separate-compilation" - - MATRIX_EVAL="CC=clang-3.8 CXX=clang++-3.8" - compiler: clang - # - #--------------------------------------------------------------------------- - # macOS / xcode10.1 - #--------------------------------------------------------------------------- - # - # macOS / xcode10.1 / -std=c++2a -fcoroutines-ts -O2 / standalone - # - - os: osx - env: - - CXXFLAGS="-std=c++2a -fcoroutines-ts -Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--with-boost=no" - osx_image: xcode10.1 - # - # macOS / xcode10.1 / -O2 / standalone - # - - os: osx - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--with-boost=no" - osx_image: xcode10.1 - # - # macOS / xcode10.1 / -O0 / standalone / kqueue disabled - # - - os: osx - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline -DASIO_DISABLE_KQUEUE" - - CONFIGFLAGS="--with-boost=no" - osx_image: xcode10.1 - # - # macOS / xcode10.1 / -O0 / standalone / separate compilation - # - - os: osx - env: - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--with-boost=no --enable-separate-compilation" - osx_image: xcode10.1 - # - # macOS / xcode10.1 / -O2 / boost 1.64 - # - - os: osx - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-Wall -Wextra -O2" - - CONFIGFLAGS="" - osx_image: xcode10.1 - # - # macOS / xcode10.1 / -O0 / boost 1.64 / separate compilation - # - - os: osx - env: - - BOOST_DIR="boost_1_64_0" - - BOOST_URL="https://sourceforge.net/projects/boost/files/boost/1.64.0/boost_1_64_0.tar.bz2/download" - - CXXFLAGS="-Wall -Wextra -O0 -fno-inline" - - CONFIGFLAGS="--enable-separate-compilation" - osx_image: xcode10.1 - -before_install: - - eval "${MATRIX_EVAL}" - -install: - - | - if [[ "${BOOST_URL}" != "" ]]; then - if [[ -z "$(ls -A ${BOOST_DIR})" ]]; then - { travis_retry wget --quiet -O - ${BOOST_URL} | tar -xj; } || exit 1 - fi - fi - -script: - - cd asio && ./autogen.sh && ./configure $CONFIGFLAGS && make && make check - -notifications: - email: false diff --git a/tidal-link/link/modules/asio-standalone/asio/.gitignore b/tidal-link/link/modules/asio-standalone/asio/.gitignore index 55db11878..39252178e 100644 --- a/tidal-link/link/modules/asio-standalone/asio/.gitignore +++ b/tidal-link/link/modules/asio-standalone/asio/.gitignore @@ -1,6 +1,7 @@ Makefile Makefile.in aclocal.m4 +asio.pc autom4te.cache compile config.guess diff --git a/tidal-link/link/modules/asio-standalone/asio/COPYING b/tidal-link/link/modules/asio-standalone/asio/COPYING index 2bb5eb20d..4540e01fc 100644 --- a/tidal-link/link/modules/asio-standalone/asio/COPYING +++ b/tidal-link/link/modules/asio-standalone/asio/COPYING @@ -1,4 +1,4 @@ -Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) +Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) diff --git a/tidal-link/link/modules/asio-standalone/asio/INSTALL b/tidal-link/link/modules/asio-standalone/asio/INSTALL index f045678c4..1dd78db18 100644 --- a/tidal-link/link/modules/asio-standalone/asio/INSTALL +++ b/tidal-link/link/modules/asio-standalone/asio/INSTALL @@ -1,5 +1,5 @@ See doc/index.html for information on: - External dependencies - - Using asio + - Using, building, and configuring Asio - Supported platforms - How to build the tests and examples diff --git a/tidal-link/link/modules/asio-standalone/asio/Makefile.am b/tidal-link/link/modules/asio-standalone/asio/Makefile.am index 0acdc02d9..b7760851b 100644 --- a/tidal-link/link/modules/asio-standalone/asio/Makefile.am +++ b/tidal-link/link/modules/asio-standalone/asio/Makefile.am @@ -1,5 +1,7 @@ AUTOMAKE_OPTIONS = foreign dist-bzip2 dist-zip +pkgconfig_DATA = asio.pc + SUBDIRS = include src MAINTAINERCLEANFILES = \ diff --git a/tidal-link/link/modules/asio-standalone/asio/README b/tidal-link/link/modules/asio-standalone/asio/README index 92472f52e..6ef60c29a 100644 --- a/tidal-link/link/modules/asio-standalone/asio/README +++ b/tidal-link/link/modules/asio-standalone/asio/README @@ -1,4 +1,4 @@ -asio version 1.17.0 -Released Friday, 10 July 2020. +asio version 1.28.0 +Released Wednesday, 26 April 2023. See doc/index.html for API documentation and a tutorial. diff --git a/tidal-link/link/modules/asio-standalone/asio/asio.manifest b/tidal-link/link/modules/asio-standalone/asio/asio.manifest index 440b974eb..ae98bebb7 100644 --- a/tidal-link/link/modules/asio-standalone/asio/asio.manifest +++ b/tidal-link/link/modules/asio-standalone/asio/asio.manifest @@ -1,5 +1,6 @@ / /aclocal.m4 +/asio.pc.in /compile /config.guess /config.sub @@ -8,30 +9,52 @@ /COPYING /depcomp /doc/ +/doc/1.png +/doc/2.png +/doc/3.png +/doc/4.png +/doc/5.png +/doc/6.png +/doc/7.png +/doc/8.png /doc/asio/ /doc/asio/examples/ /doc/asio/examples/cpp03_examples.html /doc/asio/examples/cpp11_examples.html /doc/asio/examples/cpp14_examples.html /doc/asio/examples/cpp17_examples.html +/doc/asio/examples/cpp20_examples.html /doc/asio/examples.html /doc/asio/history.html /doc/asio/index.html /doc/asio/net_ts.html /doc/asio/overview/ +/doc/asio/overview/basics.html +/doc/asio/overview/channels.html +/doc/asio/overview/composition/ +/doc/asio/overview/composition/compose.html +/doc/asio/overview/composition/coro.html +/doc/asio/overview/composition/coroutine.html +/doc/asio/overview/composition/cpp20_coroutines.html +/doc/asio/overview/composition/deferred.html +/doc/asio/overview/composition/futures.html +/doc/asio/overview/composition.html +/doc/asio/overview/composition/immediate_completion.html +/doc/asio/overview/composition/parallel_group.html +/doc/asio/overview/composition/promises.html +/doc/asio/overview/composition/spawn.html +/doc/asio/overview/composition/token_adapters.html +/doc/asio/overview/composition/type_erasure.html /doc/asio/overview/core/ /doc/asio/overview/core/allocation.html /doc/asio/overview/core/async.html -/doc/asio/overview/core/basics.html /doc/asio/overview/core/buffers.html +/doc/asio/overview/core/cancellation.html /doc/asio/overview/core/concurrency_hint.html -/doc/asio/overview/core/coroutine.html -/doc/asio/overview/core/coroutines_ts.html /doc/asio/overview/core/handler_tracking.html /doc/asio/overview/core.html /doc/asio/overview/core/line_based.html /doc/asio/overview/core/reactor.html -/doc/asio/overview/core/spawn.html /doc/asio/overview/core/strands.html /doc/asio/overview/core/streams.html /doc/asio/overview/core/threads.html @@ -39,21 +62,34 @@ /doc/asio/overview/cpp2011/array.html /doc/asio/overview/cpp2011/atomic.html /doc/asio/overview/cpp2011/chrono.html -/doc/asio/overview/cpp2011/futures.html /doc/asio/overview/cpp2011.html /doc/asio/overview/cpp2011/move_handlers.html /doc/asio/overview/cpp2011/move_objects.html /doc/asio/overview/cpp2011/shared_ptr.html /doc/asio/overview/cpp2011/system_error.html /doc/asio/overview/cpp2011/variadic.html +/doc/asio/overview/files.html /doc/asio/overview.html /doc/asio/overview/implementation.html +/doc/asio/overview/model/ +/doc/asio/overview/model/allocators.html +/doc/asio/overview/model/associators.html +/doc/asio/overview/model/async_agents.html +/doc/asio/overview/model/async_ops.html +/doc/asio/overview/model/cancellation.html +/doc/asio/overview/model/child_agents.html +/doc/asio/overview/model/completion_tokens.html +/doc/asio/overview/model/executors.html +/doc/asio/overview/model/higher_levels.html +/doc/asio/overview/model.html +/doc/asio/overview/model/library_elements.html /doc/asio/overview/networking/ /doc/asio/overview/networking/bsd_sockets.html /doc/asio/overview/networking.html /doc/asio/overview/networking/iostreams.html /doc/asio/overview/networking/other_protocols.html /doc/asio/overview/networking/protocols.html +/doc/asio/overview/pipes.html /doc/asio/overview/posix/ /doc/asio/overview/posix/fork.html /doc/asio/overview/posix.html @@ -73,7 +109,201 @@ /doc/asio/reference/ /doc/asio/reference/AcceptableProtocol.html /doc/asio/reference/AcceptHandler.html +/doc/asio/reference/AcceptToken.html +/doc/asio/reference/allocator_binder/ +/doc/asio/reference/allocator_binder/allocator_binder/ +/doc/asio/reference/allocator_binder/_allocator_binder.html +/doc/asio/reference/allocator_binder/allocator_binder.html +/doc/asio/reference/allocator_binder/allocator_binder/overload1.html +/doc/asio/reference/allocator_binder/allocator_binder/overload2.html +/doc/asio/reference/allocator_binder/allocator_binder/overload3.html +/doc/asio/reference/allocator_binder/allocator_binder/overload4.html +/doc/asio/reference/allocator_binder/allocator_binder/overload5.html +/doc/asio/reference/allocator_binder/allocator_binder/overload6.html +/doc/asio/reference/allocator_binder/allocator_binder/overload7.html +/doc/asio/reference/allocator_binder/allocator_binder/overload8.html +/doc/asio/reference/allocator_binder/allocator_binder/overload9.html +/doc/asio/reference/allocator_binder/allocator_type.html +/doc/asio/reference/allocator_binder/argument_type.html +/doc/asio/reference/allocator_binder/first_argument_type.html +/doc/asio/reference/allocator_binder/get/ +/doc/asio/reference/allocator_binder/get_allocator.html +/doc/asio/reference/allocator_binder/get.html +/doc/asio/reference/allocator_binder/get/overload1.html +/doc/asio/reference/allocator_binder/get/overload2.html +/doc/asio/reference/allocator_binder.html +/doc/asio/reference/allocator_binder/operator_lp__rp_/ +/doc/asio/reference/allocator_binder/operator_lp__rp_.html +/doc/asio/reference/allocator_binder/operator_lp__rp_/overload1.html +/doc/asio/reference/allocator_binder/operator_lp__rp_/overload2.html +/doc/asio/reference/allocator_binder/result_type.html +/doc/asio/reference/allocator_binder/second_argument_type.html +/doc/asio/reference/allocator_binder/target_type.html +/doc/asio/reference/any_completion_executor/ +/doc/asio/reference/any_completion_executor/any_completion_executor/ +/doc/asio/reference/any_completion_executor/_any_completion_executor.html +/doc/asio/reference/any_completion_executor/any_completion_executor.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload10.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload1.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload2.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload3.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload4.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload5.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload6.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload7.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload8.html +/doc/asio/reference/any_completion_executor/any_completion_executor/overload9.html +/doc/asio/reference/any_completion_executor/context.html +/doc/asio/reference/any_completion_executor/execute.html +/doc/asio/reference/any_completion_executor.html +/doc/asio/reference/any_completion_executor/operator_bool.html +/doc/asio/reference/any_completion_executor/operator_eq_/ +/doc/asio/reference/any_completion_executor/operator_eq__eq_/ +/doc/asio/reference/any_completion_executor/operator_eq__eq_.html +/doc/asio/reference/any_completion_executor/operator_eq__eq_/overload1.html +/doc/asio/reference/any_completion_executor/operator_eq__eq_/overload2.html +/doc/asio/reference/any_completion_executor/operator_eq__eq_/overload3.html +/doc/asio/reference/any_completion_executor/operator_eq_.html +/doc/asio/reference/any_completion_executor/operator_eq_/overload1.html +/doc/asio/reference/any_completion_executor/operator_eq_/overload2.html +/doc/asio/reference/any_completion_executor/operator_eq_/overload3.html +/doc/asio/reference/any_completion_executor/operator_not__eq_/ +/doc/asio/reference/any_completion_executor/operator_not__eq_.html +/doc/asio/reference/any_completion_executor/operator_not__eq_/overload1.html +/doc/asio/reference/any_completion_executor/operator_not__eq_/overload2.html +/doc/asio/reference/any_completion_executor/operator_not__eq_/overload3.html +/doc/asio/reference/any_completion_executor/prefer/ +/doc/asio/reference/any_completion_executor/prefer.html +/doc/asio/reference/any_completion_executor/prefer/overload1.html +/doc/asio/reference/any_completion_executor/prefer/overload2.html +/doc/asio/reference/any_completion_executor/prefer/overload3.html +/doc/asio/reference/any_completion_executor/prefer/overload4.html +/doc/asio/reference/any_completion_executor/prefer/overload5.html +/doc/asio/reference/any_completion_executor/prefer/overload6.html +/doc/asio/reference/any_completion_executor/query.html +/doc/asio/reference/any_completion_executor/require/ +/doc/asio/reference/any_completion_executor/require.html +/doc/asio/reference/any_completion_executor/require/overload1.html +/doc/asio/reference/any_completion_executor/require/overload2.html +/doc/asio/reference/any_completion_executor/swap/ +/doc/asio/reference/any_completion_executor/swap.html +/doc/asio/reference/any_completion_executor/swap/overload1.html +/doc/asio/reference/any_completion_executor/swap/overload2.html +/doc/asio/reference/any_completion_executor/target/ +/doc/asio/reference/any_completion_executor/target.html +/doc/asio/reference/any_completion_executor/target/overload1.html +/doc/asio/reference/any_completion_executor/target/overload2.html +/doc/asio/reference/any_completion_executor/target_type.html +/doc/asio/reference/any_completion_handler/ +/doc/asio/reference/any_completion_handler_allocator/ +/doc/asio/reference/any_completion_handler_allocator/allocate.html +/doc/asio/reference/any_completion_handler_allocator/any_completion_handler_allocator.html +/doc/asio/reference/any_completion_handler_allocator/deallocate.html +/doc/asio/reference/any_completion_handler_allocator.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/ +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/any_completion_handler_allocator.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/operator_eq__eq_.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/operator_not__eq_.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt___rebind/ +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt___rebind.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt___rebind/other.html +/doc/asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/value_type.html +/doc/asio/reference/any_completion_handler_allocator/operator_eq__eq_.html +/doc/asio/reference/any_completion_handler_allocator/operator_not__eq_.html +/doc/asio/reference/any_completion_handler_allocator__rebind/ +/doc/asio/reference/any_completion_handler_allocator__rebind.html +/doc/asio/reference/any_completion_handler_allocator__rebind/other.html +/doc/asio/reference/any_completion_handler_allocator/value_type.html +/doc/asio/reference/any_completion_handler/any_completion_handler/ +/doc/asio/reference/any_completion_handler/_any_completion_handler.html +/doc/asio/reference/any_completion_handler/any_completion_handler.html +/doc/asio/reference/any_completion_handler/any_completion_handler/overload1.html +/doc/asio/reference/any_completion_handler/any_completion_handler/overload2.html +/doc/asio/reference/any_completion_handler/any_completion_handler/overload3.html +/doc/asio/reference/any_completion_handler/any_completion_handler/overload4.html +/doc/asio/reference/any_completion_handler/get_allocator.html +/doc/asio/reference/any_completion_handler/get_cancellation_slot.html +/doc/asio/reference/any_completion_handler.html +/doc/asio/reference/any_completion_handler/operator_bool.html +/doc/asio/reference/any_completion_handler/operator_eq_/ +/doc/asio/reference/any_completion_handler/operator_eq__eq_/ +/doc/asio/reference/any_completion_handler/operator_eq__eq_.html +/doc/asio/reference/any_completion_handler/operator_eq__eq_/overload1.html +/doc/asio/reference/any_completion_handler/operator_eq__eq_/overload2.html +/doc/asio/reference/any_completion_handler/operator_eq_.html +/doc/asio/reference/any_completion_handler/operator_eq_/overload1.html +/doc/asio/reference/any_completion_handler/operator_eq_/overload2.html +/doc/asio/reference/any_completion_handler/operator_lp__rp_.html +/doc/asio/reference/any_completion_handler/operator_not__eq_/ +/doc/asio/reference/any_completion_handler/operator_not__eq_.html +/doc/asio/reference/any_completion_handler/operator_not__eq_/overload1.html +/doc/asio/reference/any_completion_handler/operator_not__eq_/overload2.html +/doc/asio/reference/any_completion_handler/operator_not_.html +/doc/asio/reference/any_completion_handler/swap.html +/doc/asio/reference/any_io_executor/ +/doc/asio/reference/any_io_executor/any_io_executor/ +/doc/asio/reference/any_io_executor/_any_io_executor.html +/doc/asio/reference/any_io_executor/any_io_executor.html +/doc/asio/reference/any_io_executor/any_io_executor/overload10.html +/doc/asio/reference/any_io_executor/any_io_executor/overload1.html +/doc/asio/reference/any_io_executor/any_io_executor/overload2.html +/doc/asio/reference/any_io_executor/any_io_executor/overload3.html +/doc/asio/reference/any_io_executor/any_io_executor/overload4.html +/doc/asio/reference/any_io_executor/any_io_executor/overload5.html +/doc/asio/reference/any_io_executor/any_io_executor/overload6.html +/doc/asio/reference/any_io_executor/any_io_executor/overload7.html +/doc/asio/reference/any_io_executor/any_io_executor/overload8.html +/doc/asio/reference/any_io_executor/any_io_executor/overload9.html +/doc/asio/reference/any_io_executor/context.html +/doc/asio/reference/any_io_executor/execute.html /doc/asio/reference/any_io_executor.html +/doc/asio/reference/any_io_executor/operator_bool.html +/doc/asio/reference/any_io_executor/operator_eq_/ +/doc/asio/reference/any_io_executor/operator_eq__eq_/ +/doc/asio/reference/any_io_executor/operator_eq__eq_.html +/doc/asio/reference/any_io_executor/operator_eq__eq_/overload1.html +/doc/asio/reference/any_io_executor/operator_eq__eq_/overload2.html +/doc/asio/reference/any_io_executor/operator_eq__eq_/overload3.html +/doc/asio/reference/any_io_executor/operator_eq_.html +/doc/asio/reference/any_io_executor/operator_eq_/overload1.html +/doc/asio/reference/any_io_executor/operator_eq_/overload2.html +/doc/asio/reference/any_io_executor/operator_eq_/overload3.html +/doc/asio/reference/any_io_executor/operator_not__eq_/ +/doc/asio/reference/any_io_executor/operator_not__eq_.html +/doc/asio/reference/any_io_executor/operator_not__eq_/overload1.html +/doc/asio/reference/any_io_executor/operator_not__eq_/overload2.html +/doc/asio/reference/any_io_executor/operator_not__eq_/overload3.html +/doc/asio/reference/any_io_executor/prefer/ +/doc/asio/reference/any_io_executor/prefer.html +/doc/asio/reference/any_io_executor/prefer/overload1.html +/doc/asio/reference/any_io_executor/prefer/overload2.html +/doc/asio/reference/any_io_executor/prefer/overload3.html +/doc/asio/reference/any_io_executor/prefer/overload4.html +/doc/asio/reference/any_io_executor/prefer/overload5.html +/doc/asio/reference/any_io_executor/prefer/overload6.html +/doc/asio/reference/any_io_executor/prefer/overload7.html +/doc/asio/reference/any_io_executor/query.html +/doc/asio/reference/any_io_executor/require/ +/doc/asio/reference/any_io_executor/require.html +/doc/asio/reference/any_io_executor/require/overload1.html +/doc/asio/reference/any_io_executor/require/overload2.html +/doc/asio/reference/any_io_executor/require/overload3.html +/doc/asio/reference/any_io_executor/swap/ +/doc/asio/reference/any_io_executor/swap.html +/doc/asio/reference/any_io_executor/swap/overload1.html +/doc/asio/reference/any_io_executor/swap/overload2.html +/doc/asio/reference/any_io_executor/target/ +/doc/asio/reference/any_io_executor/target.html +/doc/asio/reference/any_io_executor/target/overload1.html +/doc/asio/reference/any_io_executor/target/overload2.html +/doc/asio/reference/any_io_executor/target_type.html +/doc/asio/reference/append.html +/doc/asio/reference/append_t/ +/doc/asio/reference/append_t/append_t.html +/doc/asio/reference/append_t.html +/doc/asio/reference/append_t/token_.html +/doc/asio/reference/append_t/values_.html /doc/asio/reference/asio_handler_allocate.html /doc/asio/reference/asio_handler_deallocate.html /doc/asio/reference/asio_handler_invoke/ @@ -82,13 +312,74 @@ /doc/asio/reference/asio_handler_invoke/overload2.html /doc/asio/reference/asio_handler_is_continuation.html /doc/asio/reference/associated_allocator/ -/doc/asio/reference/associated_allocator/get.html +/doc/asio/reference/associated_allocator/decltype/ +/doc/asio/reference/associated_allocator/decltype.html +/doc/asio/reference/associated_allocator/decltype/overload1.html +/doc/asio/reference/associated_allocator/decltype/overload2.html /doc/asio/reference/associated_allocator.html +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/ +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get/ +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get.html +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get/overload1.html +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get/overload2.html +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_.html +/doc/asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/type.html +/doc/asio/reference/associated_allocator/noexcept.html /doc/asio/reference/associated_allocator/type.html +/doc/asio/reference/associated_cancellation_slot/ +/doc/asio/reference/associated_cancellation_slot/decltype/ +/doc/asio/reference/associated_cancellation_slot/decltype.html +/doc/asio/reference/associated_cancellation_slot/decltype/overload1.html +/doc/asio/reference/associated_cancellation_slot/decltype/overload2.html +/doc/asio/reference/associated_cancellation_slot.html +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/ +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get/ +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get.html +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get/overload1.html +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get/overload2.html +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_.html +/doc/asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/type.html +/doc/asio/reference/associated_cancellation_slot/noexcept.html +/doc/asio/reference/associated_cancellation_slot/type.html /doc/asio/reference/associated_executor/ -/doc/asio/reference/associated_executor/get.html +/doc/asio/reference/associated_executor/decltype/ +/doc/asio/reference/associated_executor/decltype.html +/doc/asio/reference/associated_executor/decltype/overload1.html +/doc/asio/reference/associated_executor/decltype/overload2.html /doc/asio/reference/associated_executor.html +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/ +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get/ +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get.html +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get/overload1.html +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get/overload2.html +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_.html +/doc/asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/type.html +/doc/asio/reference/associated_executor/noexcept.html /doc/asio/reference/associated_executor/type.html +/doc/asio/reference/associated_immediate_executor/ +/doc/asio/reference/associated_immediate_executor/decltype.html +/doc/asio/reference/associated_immediate_executor.html +/doc/asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/ +/doc/asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get.html +/doc/asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_.html +/doc/asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/type.html +/doc/asio/reference/associated_immediate_executor/noexcept.html +/doc/asio/reference/associated_immediate_executor/type.html +/doc/asio/reference/associator.html +/doc/asio/reference/as_tuple.html +/doc/asio/reference/as_tuple_t/ +/doc/asio/reference/as_tuple_t/as_default_on.html +/doc/asio/reference/as_tuple_t/as_tuple_t/ +/doc/asio/reference/as_tuple_t/as_tuple_t.html +/doc/asio/reference/as_tuple_t/as_tuple_t/overload1.html +/doc/asio/reference/as_tuple_t/as_tuple_t/overload2.html +/doc/asio/reference/as_tuple_t__default_constructor_tag.html +/doc/asio/reference/as_tuple_t__executor_with_default/ +/doc/asio/reference/as_tuple_t__executor_with_default/default_completion_token_type.html +/doc/asio/reference/as_tuple_t__executor_with_default/executor_with_default.html +/doc/asio/reference/as_tuple_t__executor_with_default.html +/doc/asio/reference/as_tuple_t.html +/doc/asio/reference/as_tuple_t/token_.html /doc/asio/reference/async_completion/ /doc/asio/reference/async_completion/async_completion.html /doc/asio/reference/async_completion/completion_handler.html @@ -146,6 +437,11 @@ /doc/asio/reference/async_result/get.html /doc/asio/reference/async_result.html /doc/asio/reference/async_result/initiate.html +/doc/asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/ +/doc/asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/handler_type.html +/doc/asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_.html +/doc/asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/initiate.html +/doc/asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/return_type.html /doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/ /doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/async_result.html /doc/asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/completion_handler_type.html @@ -178,6 +474,7 @@ /doc/asio/reference/awaitable/awaitable/overload2.html /doc/asio/reference/awaitable/executor_type.html /doc/asio/reference/awaitable.html +/doc/asio/reference/awaitable/operator_eq_.html /doc/asio/reference/awaitable/valid.html /doc/asio/reference/awaitable/value_type.html /doc/asio/reference/bad_executor/ @@ -257,7 +554,6 @@ /doc/asio/reference/basic_datagram_socket/get_option/overload1.html /doc/asio/reference/basic_datagram_socket/get_option/overload2.html /doc/asio/reference/basic_datagram_socket.html -/doc/asio/reference/basic_datagram_socket/impl_.html /doc/asio/reference/basic_datagram_socket/io_control/ /doc/asio/reference/basic_datagram_socket/io_control.html /doc/asio/reference/basic_datagram_socket/io_control/overload1.html @@ -397,6 +693,81 @@ /doc/asio/reference/basic_deadline_timer/wait.html /doc/asio/reference/basic_deadline_timer/wait/overload1.html /doc/asio/reference/basic_deadline_timer/wait/overload2.html +/doc/asio/reference/basic_file/ +/doc/asio/reference/basic_file/append.html +/doc/asio/reference/basic_file/assign/ +/doc/asio/reference/basic_file/assign.html +/doc/asio/reference/basic_file/assign/overload1.html +/doc/asio/reference/basic_file/assign/overload2.html +/doc/asio/reference/basic_file/basic_file/ +/doc/asio/reference/basic_file/_basic_file.html +/doc/asio/reference/basic_file/basic_file.html +/doc/asio/reference/basic_file/basic_file/overload10.html +/doc/asio/reference/basic_file/basic_file/overload1.html +/doc/asio/reference/basic_file/basic_file/overload2.html +/doc/asio/reference/basic_file/basic_file/overload3.html +/doc/asio/reference/basic_file/basic_file/overload4.html +/doc/asio/reference/basic_file/basic_file/overload5.html +/doc/asio/reference/basic_file/basic_file/overload6.html +/doc/asio/reference/basic_file/basic_file/overload7.html +/doc/asio/reference/basic_file/basic_file/overload8.html +/doc/asio/reference/basic_file/basic_file/overload9.html +/doc/asio/reference/basic_file/cancel/ +/doc/asio/reference/basic_file/cancel.html +/doc/asio/reference/basic_file/cancel/overload1.html +/doc/asio/reference/basic_file/cancel/overload2.html +/doc/asio/reference/basic_file/close/ +/doc/asio/reference/basic_file/close.html +/doc/asio/reference/basic_file/close/overload1.html +/doc/asio/reference/basic_file/close/overload2.html +/doc/asio/reference/basic_file/create.html +/doc/asio/reference/basic_file/exclusive.html +/doc/asio/reference/basic_file/executor_type.html +/doc/asio/reference/basic_file/flags.html +/doc/asio/reference/basic_file/get_executor.html +/doc/asio/reference/basic_file.html +/doc/asio/reference/basic_file/is_open.html +/doc/asio/reference/basic_file/native_handle.html +/doc/asio/reference/basic_file/native_handle_type.html +/doc/asio/reference/basic_file/open/ +/doc/asio/reference/basic_file/open.html +/doc/asio/reference/basic_file/open/overload1.html +/doc/asio/reference/basic_file/open/overload2.html +/doc/asio/reference/basic_file/open/overload3.html +/doc/asio/reference/basic_file/open/overload4.html +/doc/asio/reference/basic_file/operator_eq_/ +/doc/asio/reference/basic_file/operator_eq_.html +/doc/asio/reference/basic_file/operator_eq_/overload1.html +/doc/asio/reference/basic_file/operator_eq_/overload2.html +/doc/asio/reference/basic_file/read_only.html +/doc/asio/reference/basic_file/read_write.html +/doc/asio/reference/basic_file__rebind_executor/ +/doc/asio/reference/basic_file__rebind_executor.html +/doc/asio/reference/basic_file__rebind_executor/other.html +/doc/asio/reference/basic_file/release/ +/doc/asio/reference/basic_file/release.html +/doc/asio/reference/basic_file/release/overload1.html +/doc/asio/reference/basic_file/release/overload2.html +/doc/asio/reference/basic_file/resize/ +/doc/asio/reference/basic_file/resize.html +/doc/asio/reference/basic_file/resize/overload1.html +/doc/asio/reference/basic_file/resize/overload2.html +/doc/asio/reference/basic_file/seek_basis.html +/doc/asio/reference/basic_file/size/ +/doc/asio/reference/basic_file/size.html +/doc/asio/reference/basic_file/size/overload1.html +/doc/asio/reference/basic_file/size/overload2.html +/doc/asio/reference/basic_file/sync_all/ +/doc/asio/reference/basic_file/sync_all.html +/doc/asio/reference/basic_file/sync_all_on_write.html +/doc/asio/reference/basic_file/sync_all/overload1.html +/doc/asio/reference/basic_file/sync_all/overload2.html +/doc/asio/reference/basic_file/sync_data/ +/doc/asio/reference/basic_file/sync_data.html +/doc/asio/reference/basic_file/sync_data/overload1.html +/doc/asio/reference/basic_file/sync_data/overload2.html +/doc/asio/reference/basic_file/truncate.html +/doc/asio/reference/basic_file/write_only.html /doc/asio/reference/basic_io_object/ /doc/asio/reference/basic_io_object/basic_io_object/ /doc/asio/reference/basic_io_object/_basic_io_object.html @@ -420,6 +791,91 @@ /doc/asio/reference/basic_io_object/implementation_type.html /doc/asio/reference/basic_io_object/operator_eq_.html /doc/asio/reference/basic_io_object/service_type.html +/doc/asio/reference/basic_random_access_file/ +/doc/asio/reference/basic_random_access_file/append.html +/doc/asio/reference/basic_random_access_file/assign/ +/doc/asio/reference/basic_random_access_file/assign.html +/doc/asio/reference/basic_random_access_file/assign/overload1.html +/doc/asio/reference/basic_random_access_file/assign/overload2.html +/doc/asio/reference/basic_random_access_file/async_read_some_at.html +/doc/asio/reference/basic_random_access_file/async_write_some_at.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/ +/doc/asio/reference/basic_random_access_file/_basic_random_access_file.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload10.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload1.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload2.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload3.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload4.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload5.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload6.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload7.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload8.html +/doc/asio/reference/basic_random_access_file/basic_random_access_file/overload9.html +/doc/asio/reference/basic_random_access_file/cancel/ +/doc/asio/reference/basic_random_access_file/cancel.html +/doc/asio/reference/basic_random_access_file/cancel/overload1.html +/doc/asio/reference/basic_random_access_file/cancel/overload2.html +/doc/asio/reference/basic_random_access_file/close/ +/doc/asio/reference/basic_random_access_file/close.html +/doc/asio/reference/basic_random_access_file/close/overload1.html +/doc/asio/reference/basic_random_access_file/close/overload2.html +/doc/asio/reference/basic_random_access_file/create.html +/doc/asio/reference/basic_random_access_file/exclusive.html +/doc/asio/reference/basic_random_access_file/executor_type.html +/doc/asio/reference/basic_random_access_file/flags.html +/doc/asio/reference/basic_random_access_file/get_executor.html +/doc/asio/reference/basic_random_access_file.html +/doc/asio/reference/basic_random_access_file/is_open.html +/doc/asio/reference/basic_random_access_file/native_handle.html +/doc/asio/reference/basic_random_access_file/native_handle_type.html +/doc/asio/reference/basic_random_access_file/open/ +/doc/asio/reference/basic_random_access_file/open.html +/doc/asio/reference/basic_random_access_file/open/overload1.html +/doc/asio/reference/basic_random_access_file/open/overload2.html +/doc/asio/reference/basic_random_access_file/open/overload3.html +/doc/asio/reference/basic_random_access_file/open/overload4.html +/doc/asio/reference/basic_random_access_file/operator_eq_/ +/doc/asio/reference/basic_random_access_file/operator_eq_.html +/doc/asio/reference/basic_random_access_file/operator_eq_/overload1.html +/doc/asio/reference/basic_random_access_file/operator_eq_/overload2.html +/doc/asio/reference/basic_random_access_file/read_only.html +/doc/asio/reference/basic_random_access_file/read_some_at/ +/doc/asio/reference/basic_random_access_file/read_some_at.html +/doc/asio/reference/basic_random_access_file/read_some_at/overload1.html +/doc/asio/reference/basic_random_access_file/read_some_at/overload2.html +/doc/asio/reference/basic_random_access_file/read_write.html +/doc/asio/reference/basic_random_access_file__rebind_executor/ +/doc/asio/reference/basic_random_access_file__rebind_executor.html +/doc/asio/reference/basic_random_access_file__rebind_executor/other.html +/doc/asio/reference/basic_random_access_file/release/ +/doc/asio/reference/basic_random_access_file/release.html +/doc/asio/reference/basic_random_access_file/release/overload1.html +/doc/asio/reference/basic_random_access_file/release/overload2.html +/doc/asio/reference/basic_random_access_file/resize/ +/doc/asio/reference/basic_random_access_file/resize.html +/doc/asio/reference/basic_random_access_file/resize/overload1.html +/doc/asio/reference/basic_random_access_file/resize/overload2.html +/doc/asio/reference/basic_random_access_file/seek_basis.html +/doc/asio/reference/basic_random_access_file/size/ +/doc/asio/reference/basic_random_access_file/size.html +/doc/asio/reference/basic_random_access_file/size/overload1.html +/doc/asio/reference/basic_random_access_file/size/overload2.html +/doc/asio/reference/basic_random_access_file/sync_all/ +/doc/asio/reference/basic_random_access_file/sync_all.html +/doc/asio/reference/basic_random_access_file/sync_all_on_write.html +/doc/asio/reference/basic_random_access_file/sync_all/overload1.html +/doc/asio/reference/basic_random_access_file/sync_all/overload2.html +/doc/asio/reference/basic_random_access_file/sync_data/ +/doc/asio/reference/basic_random_access_file/sync_data.html +/doc/asio/reference/basic_random_access_file/sync_data/overload1.html +/doc/asio/reference/basic_random_access_file/sync_data/overload2.html +/doc/asio/reference/basic_random_access_file/truncate.html +/doc/asio/reference/basic_random_access_file/write_only.html +/doc/asio/reference/basic_random_access_file/write_some_at/ +/doc/asio/reference/basic_random_access_file/write_some_at.html +/doc/asio/reference/basic_random_access_file/write_some_at/overload1.html +/doc/asio/reference/basic_random_access_file/write_some_at/overload2.html /doc/asio/reference/basic_raw_socket/ /doc/asio/reference/basic_raw_socket/assign/ /doc/asio/reference/basic_raw_socket/assign.html @@ -493,7 +949,6 @@ /doc/asio/reference/basic_raw_socket/get_option/overload1.html /doc/asio/reference/basic_raw_socket/get_option/overload2.html /doc/asio/reference/basic_raw_socket.html -/doc/asio/reference/basic_raw_socket/impl_.html /doc/asio/reference/basic_raw_socket/io_control/ /doc/asio/reference/basic_raw_socket/io_control.html /doc/asio/reference/basic_raw_socket/io_control/overload1.html @@ -589,6 +1044,55 @@ /doc/asio/reference/basic_raw_socket/wait/overload1.html /doc/asio/reference/basic_raw_socket/wait/overload2.html /doc/asio/reference/basic_raw_socket/wait_type.html +/doc/asio/reference/basic_readable_pipe/ +/doc/asio/reference/basic_readable_pipe/assign/ +/doc/asio/reference/basic_readable_pipe/assign.html +/doc/asio/reference/basic_readable_pipe/assign/overload1.html +/doc/asio/reference/basic_readable_pipe/assign/overload2.html +/doc/asio/reference/basic_readable_pipe/async_read_some.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/ +/doc/asio/reference/basic_readable_pipe/_basic_readable_pipe.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/overload1.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/overload2.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/overload3.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/overload4.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/overload5.html +/doc/asio/reference/basic_readable_pipe/basic_readable_pipe/overload6.html +/doc/asio/reference/basic_readable_pipe/cancel/ +/doc/asio/reference/basic_readable_pipe/cancel.html +/doc/asio/reference/basic_readable_pipe/cancel/overload1.html +/doc/asio/reference/basic_readable_pipe/cancel/overload2.html +/doc/asio/reference/basic_readable_pipe/close/ +/doc/asio/reference/basic_readable_pipe/close.html +/doc/asio/reference/basic_readable_pipe/close/overload1.html +/doc/asio/reference/basic_readable_pipe/close/overload2.html +/doc/asio/reference/basic_readable_pipe/executor_type.html +/doc/asio/reference/basic_readable_pipe/get_executor.html +/doc/asio/reference/basic_readable_pipe.html +/doc/asio/reference/basic_readable_pipe/is_open.html +/doc/asio/reference/basic_readable_pipe/lowest_layer/ +/doc/asio/reference/basic_readable_pipe/lowest_layer.html +/doc/asio/reference/basic_readable_pipe/lowest_layer/overload1.html +/doc/asio/reference/basic_readable_pipe/lowest_layer/overload2.html +/doc/asio/reference/basic_readable_pipe/lowest_layer_type.html +/doc/asio/reference/basic_readable_pipe/native_handle.html +/doc/asio/reference/basic_readable_pipe/native_handle_type.html +/doc/asio/reference/basic_readable_pipe/operator_eq_/ +/doc/asio/reference/basic_readable_pipe/operator_eq_.html +/doc/asio/reference/basic_readable_pipe/operator_eq_/overload1.html +/doc/asio/reference/basic_readable_pipe/operator_eq_/overload2.html +/doc/asio/reference/basic_readable_pipe/read_some/ +/doc/asio/reference/basic_readable_pipe/read_some.html +/doc/asio/reference/basic_readable_pipe/read_some/overload1.html +/doc/asio/reference/basic_readable_pipe/read_some/overload2.html +/doc/asio/reference/basic_readable_pipe__rebind_executor/ +/doc/asio/reference/basic_readable_pipe__rebind_executor.html +/doc/asio/reference/basic_readable_pipe__rebind_executor/other.html +/doc/asio/reference/basic_readable_pipe/release/ +/doc/asio/reference/basic_readable_pipe/release.html +/doc/asio/reference/basic_readable_pipe/release/overload1.html +/doc/asio/reference/basic_readable_pipe/release/overload2.html /doc/asio/reference/basic_seq_packet_socket/ /doc/asio/reference/basic_seq_packet_socket/assign/ /doc/asio/reference/basic_seq_packet_socket/assign.html @@ -651,7 +1155,6 @@ /doc/asio/reference/basic_seq_packet_socket/get_option/overload1.html /doc/asio/reference/basic_seq_packet_socket/get_option/overload2.html /doc/asio/reference/basic_seq_packet_socket.html -/doc/asio/reference/basic_seq_packet_socket/impl_.html /doc/asio/reference/basic_seq_packet_socket/io_control/ /doc/asio/reference/basic_seq_packet_socket/io_control.html /doc/asio/reference/basic_seq_packet_socket/io_control/overload1.html @@ -746,6 +1249,7 @@ /doc/asio/reference/basic_serial_port/basic_serial_port/ /doc/asio/reference/basic_serial_port/_basic_serial_port.html /doc/asio/reference/basic_serial_port/basic_serial_port.html +/doc/asio/reference/basic_serial_port/basic_serial_port/overload10.html /doc/asio/reference/basic_serial_port/basic_serial_port/overload1.html /doc/asio/reference/basic_serial_port/basic_serial_port/overload2.html /doc/asio/reference/basic_serial_port/basic_serial_port/overload3.html @@ -782,7 +1286,10 @@ /doc/asio/reference/basic_serial_port/open.html /doc/asio/reference/basic_serial_port/open/overload1.html /doc/asio/reference/basic_serial_port/open/overload2.html +/doc/asio/reference/basic_serial_port/operator_eq_/ /doc/asio/reference/basic_serial_port/operator_eq_.html +/doc/asio/reference/basic_serial_port/operator_eq_/overload1.html +/doc/asio/reference/basic_serial_port/operator_eq_/overload2.html /doc/asio/reference/basic_serial_port/read_some/ /doc/asio/reference/basic_serial_port/read_some.html /doc/asio/reference/basic_serial_port/read_some/overload1.html @@ -807,6 +1314,8 @@ /doc/asio/reference/basic_signal_set/add.html /doc/asio/reference/basic_signal_set/add/overload1.html /doc/asio/reference/basic_signal_set/add/overload2.html +/doc/asio/reference/basic_signal_set/add/overload3.html +/doc/asio/reference/basic_signal_set/add/overload4.html /doc/asio/reference/basic_signal_set/async_wait.html /doc/asio/reference/basic_signal_set/basic_signal_set/ /doc/asio/reference/basic_signal_set/_basic_signal_set.html @@ -828,6 +1337,8 @@ /doc/asio/reference/basic_signal_set/clear/overload1.html /doc/asio/reference/basic_signal_set/clear/overload2.html /doc/asio/reference/basic_signal_set/executor_type.html +/doc/asio/reference/basic_signal_set/flags.html +/doc/asio/reference/basic_signal_set/flags_t.html /doc/asio/reference/basic_signal_set/get_executor.html /doc/asio/reference/basic_signal_set.html /doc/asio/reference/basic_signal_set__rebind_executor/ @@ -1032,7 +1543,6 @@ /doc/asio/reference/basic_socket/get_option/overload1.html /doc/asio/reference/basic_socket/get_option/overload2.html /doc/asio/reference/basic_socket.html -/doc/asio/reference/basic_socket/impl_.html /doc/asio/reference/basic_socket/io_control/ /doc/asio/reference/basic_socket/io_control.html /doc/asio/reference/basic_socket/io_control/overload1.html @@ -1208,6 +1718,95 @@ /doc/asio/reference/basic_streambuf/reserve.html /doc/asio/reference/basic_streambuf/size.html /doc/asio/reference/basic_streambuf/underflow.html +/doc/asio/reference/basic_stream_file/ +/doc/asio/reference/basic_stream_file/append.html +/doc/asio/reference/basic_stream_file/assign/ +/doc/asio/reference/basic_stream_file/assign.html +/doc/asio/reference/basic_stream_file/assign/overload1.html +/doc/asio/reference/basic_stream_file/assign/overload2.html +/doc/asio/reference/basic_stream_file/async_read_some.html +/doc/asio/reference/basic_stream_file/async_write_some.html +/doc/asio/reference/basic_stream_file/basic_stream_file/ +/doc/asio/reference/basic_stream_file/_basic_stream_file.html +/doc/asio/reference/basic_stream_file/basic_stream_file.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload10.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload1.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload2.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload3.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload4.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload5.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload6.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload7.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload8.html +/doc/asio/reference/basic_stream_file/basic_stream_file/overload9.html +/doc/asio/reference/basic_stream_file/cancel/ +/doc/asio/reference/basic_stream_file/cancel.html +/doc/asio/reference/basic_stream_file/cancel/overload1.html +/doc/asio/reference/basic_stream_file/cancel/overload2.html +/doc/asio/reference/basic_stream_file/close/ +/doc/asio/reference/basic_stream_file/close.html +/doc/asio/reference/basic_stream_file/close/overload1.html +/doc/asio/reference/basic_stream_file/close/overload2.html +/doc/asio/reference/basic_stream_file/create.html +/doc/asio/reference/basic_stream_file/exclusive.html +/doc/asio/reference/basic_stream_file/executor_type.html +/doc/asio/reference/basic_stream_file/flags.html +/doc/asio/reference/basic_stream_file/get_executor.html +/doc/asio/reference/basic_stream_file.html +/doc/asio/reference/basic_stream_file/is_open.html +/doc/asio/reference/basic_stream_file/native_handle.html +/doc/asio/reference/basic_stream_file/native_handle_type.html +/doc/asio/reference/basic_stream_file/open/ +/doc/asio/reference/basic_stream_file/open.html +/doc/asio/reference/basic_stream_file/open/overload1.html +/doc/asio/reference/basic_stream_file/open/overload2.html +/doc/asio/reference/basic_stream_file/open/overload3.html +/doc/asio/reference/basic_stream_file/open/overload4.html +/doc/asio/reference/basic_stream_file/operator_eq_/ +/doc/asio/reference/basic_stream_file/operator_eq_.html +/doc/asio/reference/basic_stream_file/operator_eq_/overload1.html +/doc/asio/reference/basic_stream_file/operator_eq_/overload2.html +/doc/asio/reference/basic_stream_file/read_only.html +/doc/asio/reference/basic_stream_file/read_some/ +/doc/asio/reference/basic_stream_file/read_some.html +/doc/asio/reference/basic_stream_file/read_some/overload1.html +/doc/asio/reference/basic_stream_file/read_some/overload2.html +/doc/asio/reference/basic_stream_file/read_write.html +/doc/asio/reference/basic_stream_file__rebind_executor/ +/doc/asio/reference/basic_stream_file__rebind_executor.html +/doc/asio/reference/basic_stream_file__rebind_executor/other.html +/doc/asio/reference/basic_stream_file/release/ +/doc/asio/reference/basic_stream_file/release.html +/doc/asio/reference/basic_stream_file/release/overload1.html +/doc/asio/reference/basic_stream_file/release/overload2.html +/doc/asio/reference/basic_stream_file/resize/ +/doc/asio/reference/basic_stream_file/resize.html +/doc/asio/reference/basic_stream_file/resize/overload1.html +/doc/asio/reference/basic_stream_file/resize/overload2.html +/doc/asio/reference/basic_stream_file/seek/ +/doc/asio/reference/basic_stream_file/seek_basis.html +/doc/asio/reference/basic_stream_file/seek.html +/doc/asio/reference/basic_stream_file/seek/overload1.html +/doc/asio/reference/basic_stream_file/seek/overload2.html +/doc/asio/reference/basic_stream_file/size/ +/doc/asio/reference/basic_stream_file/size.html +/doc/asio/reference/basic_stream_file/size/overload1.html +/doc/asio/reference/basic_stream_file/size/overload2.html +/doc/asio/reference/basic_stream_file/sync_all/ +/doc/asio/reference/basic_stream_file/sync_all.html +/doc/asio/reference/basic_stream_file/sync_all_on_write.html +/doc/asio/reference/basic_stream_file/sync_all/overload1.html +/doc/asio/reference/basic_stream_file/sync_all/overload2.html +/doc/asio/reference/basic_stream_file/sync_data/ +/doc/asio/reference/basic_stream_file/sync_data.html +/doc/asio/reference/basic_stream_file/sync_data/overload1.html +/doc/asio/reference/basic_stream_file/sync_data/overload2.html +/doc/asio/reference/basic_stream_file/truncate.html +/doc/asio/reference/basic_stream_file/write_only.html +/doc/asio/reference/basic_stream_file/write_some/ +/doc/asio/reference/basic_stream_file/write_some.html +/doc/asio/reference/basic_stream_file/write_some/overload1.html +/doc/asio/reference/basic_stream_file/write_some/overload2.html /doc/asio/reference/basic_stream_socket/ /doc/asio/reference/basic_stream_socket/assign/ /doc/asio/reference/basic_stream_socket/assign.html @@ -1275,7 +1874,6 @@ /doc/asio/reference/basic_stream_socket/get_option/overload1.html /doc/asio/reference/basic_stream_socket/get_option/overload2.html /doc/asio/reference/basic_stream_socket.html -/doc/asio/reference/basic_stream_socket/impl_.html /doc/asio/reference/basic_stream_socket/io_control/ /doc/asio/reference/basic_stream_socket/io_control.html /doc/asio/reference/basic_stream_socket/io_control/overload1.html @@ -1452,19 +2050,81 @@ /doc/asio/reference/basic_waitable_timer/wait.html /doc/asio/reference/basic_waitable_timer/wait/overload1.html /doc/asio/reference/basic_waitable_timer/wait/overload2.html +/doc/asio/reference/basic_writable_pipe/ +/doc/asio/reference/basic_writable_pipe/assign/ +/doc/asio/reference/basic_writable_pipe/assign.html +/doc/asio/reference/basic_writable_pipe/assign/overload1.html +/doc/asio/reference/basic_writable_pipe/assign/overload2.html +/doc/asio/reference/basic_writable_pipe/async_write_some.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/ +/doc/asio/reference/basic_writable_pipe/_basic_writable_pipe.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/overload1.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/overload2.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/overload3.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/overload4.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/overload5.html +/doc/asio/reference/basic_writable_pipe/basic_writable_pipe/overload6.html +/doc/asio/reference/basic_writable_pipe/cancel/ +/doc/asio/reference/basic_writable_pipe/cancel.html +/doc/asio/reference/basic_writable_pipe/cancel/overload1.html +/doc/asio/reference/basic_writable_pipe/cancel/overload2.html +/doc/asio/reference/basic_writable_pipe/close/ +/doc/asio/reference/basic_writable_pipe/close.html +/doc/asio/reference/basic_writable_pipe/close/overload1.html +/doc/asio/reference/basic_writable_pipe/close/overload2.html +/doc/asio/reference/basic_writable_pipe/executor_type.html +/doc/asio/reference/basic_writable_pipe/get_executor.html +/doc/asio/reference/basic_writable_pipe.html +/doc/asio/reference/basic_writable_pipe/is_open.html +/doc/asio/reference/basic_writable_pipe/lowest_layer/ +/doc/asio/reference/basic_writable_pipe/lowest_layer.html +/doc/asio/reference/basic_writable_pipe/lowest_layer/overload1.html +/doc/asio/reference/basic_writable_pipe/lowest_layer/overload2.html +/doc/asio/reference/basic_writable_pipe/lowest_layer_type.html +/doc/asio/reference/basic_writable_pipe/native_handle.html +/doc/asio/reference/basic_writable_pipe/native_handle_type.html +/doc/asio/reference/basic_writable_pipe/operator_eq_/ +/doc/asio/reference/basic_writable_pipe/operator_eq_.html +/doc/asio/reference/basic_writable_pipe/operator_eq_/overload1.html +/doc/asio/reference/basic_writable_pipe/operator_eq_/overload2.html +/doc/asio/reference/basic_writable_pipe__rebind_executor/ +/doc/asio/reference/basic_writable_pipe__rebind_executor.html +/doc/asio/reference/basic_writable_pipe__rebind_executor/other.html +/doc/asio/reference/basic_writable_pipe/release/ +/doc/asio/reference/basic_writable_pipe/release.html +/doc/asio/reference/basic_writable_pipe/release/overload1.html +/doc/asio/reference/basic_writable_pipe/release/overload2.html +/doc/asio/reference/basic_writable_pipe/write_some/ +/doc/asio/reference/basic_writable_pipe/write_some.html +/doc/asio/reference/basic_writable_pipe/write_some/overload1.html +/doc/asio/reference/basic_writable_pipe/write_some/overload2.html /doc/asio/reference/basic_yield_context/ -/doc/asio/reference/basic_yield_context/basic_yield_context/ /doc/asio/reference/basic_yield_context/basic_yield_context.html -/doc/asio/reference/basic_yield_context/basic_yield_context/overload1.html -/doc/asio/reference/basic_yield_context/basic_yield_context/overload2.html -/doc/asio/reference/basic_yield_context/callee_type.html -/doc/asio/reference/basic_yield_context/caller_type.html +/doc/asio/reference/basic_yield_context/cancellation_slot_type.html +/doc/asio/reference/basic_yield_context/cancelled.html +/doc/asio/reference/basic_yield_context/executor_type.html +/doc/asio/reference/basic_yield_context/get_cancellation_slot.html +/doc/asio/reference/basic_yield_context/get_cancellation_state.html +/doc/asio/reference/basic_yield_context/get_executor.html /doc/asio/reference/basic_yield_context.html /doc/asio/reference/basic_yield_context/operator_lb__rb_.html +/doc/asio/reference/basic_yield_context/reset_cancellation_state/ +/doc/asio/reference/basic_yield_context/reset_cancellation_state.html +/doc/asio/reference/basic_yield_context/reset_cancellation_state/overload1.html +/doc/asio/reference/basic_yield_context/reset_cancellation_state/overload2.html +/doc/asio/reference/basic_yield_context/reset_cancellation_state/overload3.html +/doc/asio/reference/basic_yield_context/throw_if_cancelled/ +/doc/asio/reference/basic_yield_context/throw_if_cancelled.html +/doc/asio/reference/basic_yield_context/throw_if_cancelled/overload1.html +/doc/asio/reference/basic_yield_context/throw_if_cancelled/overload2.html +/doc/asio/reference/bind_allocator.html +/doc/asio/reference/bind_cancellation_slot.html /doc/asio/reference/bind_executor/ /doc/asio/reference/bind_executor.html /doc/asio/reference/bind_executor/overload1.html /doc/asio/reference/bind_executor/overload2.html +/doc/asio/reference/bind_immediate_executor.html /doc/asio/reference/buffer/ /doc/asio/reference/buffer_cast/ /doc/asio/reference/buffer_cast.html @@ -1475,6 +2135,7 @@ /doc/asio/reference/buffer_copy/overload1.html /doc/asio/reference/buffer_copy/overload2.html /doc/asio/reference/BufferedHandshakeHandler.html +/doc/asio/reference/BufferedHandshakeToken.html /doc/asio/reference/buffered_read_stream/ /doc/asio/reference/buffered_read_stream/async_fill.html /doc/asio/reference/buffered_read_stream/async_read_some.html @@ -1609,6 +2270,10 @@ /doc/asio/reference/buffered_write_stream/write_some/overload1.html /doc/asio/reference/buffered_write_stream/write_some/overload2.html /doc/asio/reference/buffer.html +/doc/asio/reference/buffer_literals__operator_quot__quot__buf/ +/doc/asio/reference/buffer_literals__operator_quot__quot__buf.html +/doc/asio/reference/buffer_literals__operator_quot__quot__buf/overload1.html +/doc/asio/reference/buffer_literals__operator_quot__quot__buf/overload2.html /doc/asio/reference/buffer/overload10.html /doc/asio/reference/buffer/overload11.html /doc/asio/reference/buffer/overload12.html @@ -1634,13 +2299,42 @@ /doc/asio/reference/buffer/overload30.html /doc/asio/reference/buffer/overload31.html /doc/asio/reference/buffer/overload32.html +/doc/asio/reference/buffer/overload33.html +/doc/asio/reference/buffer/overload34.html +/doc/asio/reference/buffer/overload35.html +/doc/asio/reference/buffer/overload36.html +/doc/asio/reference/buffer/overload37.html +/doc/asio/reference/buffer/overload38.html +/doc/asio/reference/buffer/overload39.html /doc/asio/reference/buffer/overload3.html +/doc/asio/reference/buffer/overload40.html +/doc/asio/reference/buffer/overload41.html +/doc/asio/reference/buffer/overload42.html /doc/asio/reference/buffer/overload4.html /doc/asio/reference/buffer/overload5.html /doc/asio/reference/buffer/overload6.html /doc/asio/reference/buffer/overload7.html /doc/asio/reference/buffer/overload8.html /doc/asio/reference/buffer/overload9.html +/doc/asio/reference/buffer_registration/ +/doc/asio/reference/buffer_registration/allocator_type.html +/doc/asio/reference/buffer_registration/at.html +/doc/asio/reference/buffer_registration/begin.html +/doc/asio/reference/buffer_registration/buffer_registration/ +/doc/asio/reference/buffer_registration/_buffer_registration.html +/doc/asio/reference/buffer_registration/buffer_registration.html +/doc/asio/reference/buffer_registration/buffer_registration/overload1.html +/doc/asio/reference/buffer_registration/buffer_registration/overload2.html +/doc/asio/reference/buffer_registration/buffer_registration/overload3.html +/doc/asio/reference/buffer_registration/cbegin.html +/doc/asio/reference/buffer_registration/cend.html +/doc/asio/reference/buffer_registration/const_iterator.html +/doc/asio/reference/buffer_registration/end.html +/doc/asio/reference/buffer_registration.html +/doc/asio/reference/buffer_registration/iterator.html +/doc/asio/reference/buffer_registration/operator_eq_.html +/doc/asio/reference/buffer_registration/operator_lb__rb_.html +/doc/asio/reference/buffer_registration/size.html /doc/asio/reference/buffers_begin.html /doc/asio/reference/buffers_end.html /doc/asio/reference/buffer_sequence_begin/ @@ -1649,12 +2343,16 @@ /doc/asio/reference/buffer_sequence_begin/overload2.html /doc/asio/reference/buffer_sequence_begin/overload3.html /doc/asio/reference/buffer_sequence_begin/overload4.html +/doc/asio/reference/buffer_sequence_begin/overload5.html +/doc/asio/reference/buffer_sequence_begin/overload6.html /doc/asio/reference/buffer_sequence_end/ /doc/asio/reference/buffer_sequence_end.html /doc/asio/reference/buffer_sequence_end/overload1.html /doc/asio/reference/buffer_sequence_end/overload2.html /doc/asio/reference/buffer_sequence_end/overload3.html /doc/asio/reference/buffer_sequence_end/overload4.html +/doc/asio/reference/buffer_sequence_end/overload5.html +/doc/asio/reference/buffer_sequence_end/overload6.html /doc/asio/reference/buffers_iterator/ /doc/asio/reference/buffers_iterator/begin.html /doc/asio/reference/buffers_iterator/buffers_iterator.html @@ -1693,12 +2391,77 @@ /doc/asio/reference/buffers_iterator/reference.html /doc/asio/reference/buffers_iterator/value_type.html /doc/asio/reference/buffer_size.html +/doc/asio/reference/cancellation_filter/ +/doc/asio/reference/cancellation_filter.html +/doc/asio/reference/cancellation_filter/operator_lp__rp_.html +/doc/asio/reference/CancellationHandler.html +/doc/asio/reference/cancellation_signal/ +/doc/asio/reference/cancellation_signal/_cancellation_signal.html +/doc/asio/reference/cancellation_signal/cancellation_signal.html +/doc/asio/reference/cancellation_signal/emit.html +/doc/asio/reference/cancellation_signal.html +/doc/asio/reference/cancellation_signal/slot.html +/doc/asio/reference/cancellation_slot/ +/doc/asio/reference/cancellation_slot/assign.html +/doc/asio/reference/cancellation_slot_binder/ +/doc/asio/reference/cancellation_slot_binder/argument_type.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/ +/doc/asio/reference/cancellation_slot_binder/_cancellation_slot_binder.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload1.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload2.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload3.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload4.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload5.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload6.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload7.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload8.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload9.html +/doc/asio/reference/cancellation_slot_binder/cancellation_slot_type.html +/doc/asio/reference/cancellation_slot_binder/first_argument_type.html +/doc/asio/reference/cancellation_slot_binder/get/ +/doc/asio/reference/cancellation_slot_binder/get_cancellation_slot.html +/doc/asio/reference/cancellation_slot_binder/get.html +/doc/asio/reference/cancellation_slot_binder/get/overload1.html +/doc/asio/reference/cancellation_slot_binder/get/overload2.html +/doc/asio/reference/cancellation_slot_binder.html +/doc/asio/reference/cancellation_slot_binder/operator_lp__rp_/ +/doc/asio/reference/cancellation_slot_binder/operator_lp__rp_.html +/doc/asio/reference/cancellation_slot_binder/operator_lp__rp_/overload1.html +/doc/asio/reference/cancellation_slot_binder/operator_lp__rp_/overload2.html +/doc/asio/reference/cancellation_slot_binder/result_type.html +/doc/asio/reference/cancellation_slot_binder/second_argument_type.html +/doc/asio/reference/cancellation_slot_binder/target_type.html +/doc/asio/reference/cancellation_slot/cancellation_slot.html +/doc/asio/reference/cancellation_slot/clear.html +/doc/asio/reference/cancellation_slot/emplace.html +/doc/asio/reference/cancellation_slot/has_handler.html +/doc/asio/reference/CancellationSlot.html +/doc/asio/reference/cancellation_slot.html +/doc/asio/reference/cancellation_slot/is_connected.html +/doc/asio/reference/cancellation_slot/operator_eq__eq_.html +/doc/asio/reference/cancellation_slot/operator_not__eq_.html +/doc/asio/reference/cancellation_state/ +/doc/asio/reference/cancellation_state/cancellation_state/ +/doc/asio/reference/cancellation_state/cancellation_state.html +/doc/asio/reference/cancellation_state/cancellation_state/overload1.html +/doc/asio/reference/cancellation_state/cancellation_state/overload2.html +/doc/asio/reference/cancellation_state/cancellation_state/overload3.html +/doc/asio/reference/cancellation_state/cancellation_state/overload4.html +/doc/asio/reference/cancellation_state/cancelled.html +/doc/asio/reference/cancellation_state/clear.html +/doc/asio/reference/cancellation_state.html +/doc/asio/reference/cancellation_state/slot.html +/doc/asio/reference/cancellation_type.html +/doc/asio/reference/cancellation_type_t.html /doc/asio/reference/can_prefer.html /doc/asio/reference/can_query.html /doc/asio/reference/can_require_concept.html /doc/asio/reference/can_require.html /doc/asio/reference/CompletionCondition.html -/doc/asio/reference/CompletionHandler.html +/doc/asio/reference/completion_signature_of/ +/doc/asio/reference/completion_signature_of.html +/doc/asio/reference/completion_signature_of/type.html /doc/asio/reference/connect/ /doc/asio/reference/ConnectCondition.html /doc/asio/reference/ConnectHandler.html @@ -1715,6 +2478,15 @@ /doc/asio/reference/connect/overload7.html /doc/asio/reference/connect/overload8.html /doc/asio/reference/connect/overload9.html +/doc/asio/reference/connect_pipe/ +/doc/asio/reference/connect_pipe.html +/doc/asio/reference/connect_pipe/overload1.html +/doc/asio/reference/connect_pipe/overload2.html +/doc/asio/reference/ConnectToken.html +/doc/asio/reference/consign.html +/doc/asio/reference/consign_t/ +/doc/asio/reference/consign_t/consign_t.html +/doc/asio/reference/consign_t.html /doc/asio/reference/const_buffer/ /doc/asio/reference/const_buffer/const_buffer/ /doc/asio/reference/const_buffer/const_buffer.html @@ -1747,6 +2519,21 @@ /doc/asio/reference/const_buffers_1/value_type.html /doc/asio/reference/ConstBufferSequence.html /doc/asio/reference/const_buffer/size.html +/doc/asio/reference/const_registered_buffer/ +/doc/asio/reference/const_registered_buffer/buffer.html +/doc/asio/reference/const_registered_buffer/const_registered_buffer/ +/doc/asio/reference/const_registered_buffer/const_registered_buffer.html +/doc/asio/reference/const_registered_buffer/const_registered_buffer/overload1.html +/doc/asio/reference/const_registered_buffer/const_registered_buffer/overload2.html +/doc/asio/reference/const_registered_buffer/data.html +/doc/asio/reference/const_registered_buffer.html +/doc/asio/reference/const_registered_buffer/id.html +/doc/asio/reference/const_registered_buffer/operator_plus_/ +/doc/asio/reference/const_registered_buffer/operator_plus__eq_.html +/doc/asio/reference/const_registered_buffer/operator_plus_.html +/doc/asio/reference/const_registered_buffer/operator_plus_/overload1.html +/doc/asio/reference/const_registered_buffer/operator_plus_/overload2.html +/doc/asio/reference/const_registered_buffer/size.html /doc/asio/reference/coroutine/ /doc/asio/reference/coroutine/coroutine.html /doc/asio/reference/coroutine.html @@ -1770,6 +2557,62 @@ /doc/asio/reference/defer/overload1.html /doc/asio/reference/defer/overload2.html /doc/asio/reference/defer/overload3.html +/doc/asio/reference/deferred_async_operation/ +/doc/asio/reference/deferred_async_operation/deferred_async_operation.html +/doc/asio/reference/deferred_async_operation/detail__index_sequence_for.html +/doc/asio/reference/deferred_async_operation.html +/doc/asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/ +/doc/asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/deferred_async_operation.html +/doc/asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/detail__index_sequence_for.html +/doc/asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_.html +/doc/asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/operator_lp__rp_.html +/doc/asio/reference/deferred_async_operation/operator_lp__rp_.html +/doc/asio/reference/deferred_conditional/ +/doc/asio/reference/deferred_conditional/deferred_conditional.html +/doc/asio/reference/deferred_conditional.html +/doc/asio/reference/deferred_conditional/operator_lp__rp_.html +/doc/asio/reference/deferred_conditional/otherwise.html +/doc/asio/reference/deferred_conditional/then.html +/doc/asio/reference/deferred_function/ +/doc/asio/reference/deferred_function/deferred_function.html +/doc/asio/reference/deferred_function/function_.html +/doc/asio/reference/deferred_function.html +/doc/asio/reference/deferred_function/operator_lp__rp_.html +/doc/asio/reference/deferred.html +/doc/asio/reference/deferred_init_tag.html +/doc/asio/reference/deferred_noop/ +/doc/asio/reference/deferred_noop.html +/doc/asio/reference/deferred_noop/operator_lp__rp_.html +/doc/asio/reference/deferred_sequence/ +/doc/asio/reference/deferred_sequence/deferred_sequence.html +/doc/asio/reference/deferred_sequence.html +/doc/asio/reference/deferred_sequence/operator_lp__rp_/ +/doc/asio/reference/deferred_sequence/operator_lp__rp_.html +/doc/asio/reference/deferred_sequence/operator_lp__rp_/overload1.html +/doc/asio/reference/deferred_sequence/operator_lp__rp_/overload2.html +/doc/asio/reference/deferred_signatures.html +/doc/asio/reference/deferred_t/ +/doc/asio/reference/deferred_t/as_default_on.html +/doc/asio/reference/deferred_t/deferred_t.html +/doc/asio/reference/deferred_t__executor_with_default/ +/doc/asio/reference/deferred_t__executor_with_default/default_completion_token_type.html +/doc/asio/reference/deferred_t__executor_with_default/executor_with_default.html +/doc/asio/reference/deferred_t__executor_with_default.html +/doc/asio/reference/deferred_t.html +/doc/asio/reference/deferred_t/operator_lp__rp_/ +/doc/asio/reference/deferred_t/operator_lp__rp_.html +/doc/asio/reference/deferred_t/operator_lp__rp_/overload1.html +/doc/asio/reference/deferred_t/operator_lp__rp_/overload2.html +/doc/asio/reference/deferred_t/values.html +/doc/asio/reference/deferred_t/when.html +/doc/asio/reference/deferred_values/ +/doc/asio/reference/deferred_values/deferred_values.html +/doc/asio/reference/deferred_values/detail__index_sequence_for.html +/doc/asio/reference/deferred_values.html +/doc/asio/reference/deferred_values__initiate/ +/doc/asio/reference/deferred_values__initiate.html +/doc/asio/reference/deferred_values__initiate/operator_lp__rp_.html +/doc/asio/reference/deferred_values/operator_lp__rp_.html /doc/asio/reference/detached.html /doc/asio/reference/detached_t/ /doc/asio/reference/detached_t/as_default_on.html @@ -1782,6 +2625,7 @@ /doc/asio/reference/detached_t__executor_with_default/executor_with_default/overload2.html /doc/asio/reference/detached_t__executor_with_default.html /doc/asio/reference/detached_t.html +/doc/asio/reference/disable_cancellation.html /doc/asio/reference/dispatch/ /doc/asio/reference/dispatch.html /doc/asio/reference/dispatch/overload1.html @@ -1840,6 +2684,9 @@ /doc/asio/reference/dynamic_vector_buffer/prepare.html /doc/asio/reference/dynamic_vector_buffer/shrink.html /doc/asio/reference/dynamic_vector_buffer/size.html +/doc/asio/reference/enable_partial_cancellation.html +/doc/asio/reference/enable_terminal_cancellation.html +/doc/asio/reference/enable_total_cancellation.html /doc/asio/reference/Endpoint.html /doc/asio/reference/EndpointSequence.html /doc/asio/reference/error__addrinfo_category.html @@ -1852,6 +2699,7 @@ /doc/asio/reference/error_category/name.html /doc/asio/reference/error_category/operator_eq__eq_.html /doc/asio/reference/error_category/operator_not__eq_.html +/doc/asio/reference/error__clear.html /doc/asio/reference/error_code/ /doc/asio/reference/error_code/assign.html /doc/asio/reference/error_code/category.html @@ -1902,12 +2750,16 @@ /doc/asio/reference/execution__any_executor/any_executor/ /doc/asio/reference/execution__any_executor/_any_executor.html /doc/asio/reference/execution__any_executor/any_executor.html +/doc/asio/reference/execution__any_executor/any_executor/overload10.html /doc/asio/reference/execution__any_executor/any_executor/overload1.html /doc/asio/reference/execution__any_executor/any_executor/overload2.html /doc/asio/reference/execution__any_executor/any_executor/overload3.html /doc/asio/reference/execution__any_executor/any_executor/overload4.html /doc/asio/reference/execution__any_executor/any_executor/overload5.html /doc/asio/reference/execution__any_executor/any_executor/overload6.html +/doc/asio/reference/execution__any_executor/any_executor/overload7.html +/doc/asio/reference/execution__any_executor/any_executor/overload8.html +/doc/asio/reference/execution__any_executor/any_executor/overload9.html /doc/asio/reference/execution__any_executor/context.html /doc/asio/reference/execution__any_executor/execute.html /doc/asio/reference/execution__any_executor.html @@ -2341,6 +3193,254 @@ /doc/asio/reference/executor_work_guard.html /doc/asio/reference/executor_work_guard/owns_work.html /doc/asio/reference/executor_work_guard/reset.html +/doc/asio/reference/experimental__as_single.html +/doc/asio/reference/experimental__as_single_t/ +/doc/asio/reference/experimental__as_single_t/as_default_on.html +/doc/asio/reference/experimental__as_single_t/as_single_t/ +/doc/asio/reference/experimental__as_single_t/as_single_t.html +/doc/asio/reference/experimental__as_single_t/as_single_t/overload1.html +/doc/asio/reference/experimental__as_single_t/as_single_t/overload2.html +/doc/asio/reference/experimental__as_single_t__default_constructor_tag.html +/doc/asio/reference/experimental__as_single_t__executor_with_default/ +/doc/asio/reference/experimental__as_single_t__executor_with_default/default_completion_token_type.html +/doc/asio/reference/experimental__as_single_t__executor_with_default/executor_with_default/ +/doc/asio/reference/experimental__as_single_t__executor_with_default/executor_with_default.html +/doc/asio/reference/experimental__as_single_t__executor_with_default/executor_with_default/overload1.html +/doc/asio/reference/experimental__as_single_t__executor_with_default/executor_with_default/overload2.html +/doc/asio/reference/experimental__as_single_t__executor_with_default.html +/doc/asio/reference/experimental__as_single_t.html +/doc/asio/reference/experimental__as_single_t/token_.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/ +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload1.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload2.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload3.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload4.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload5.html +/doc/asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload6.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/ +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload1.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload2.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload3.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload4.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload5.html +/doc/asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload6.html +/doc/asio/reference/experimental__basic_channel/ +/doc/asio/reference/experimental__basic_channel/async_receive.html +/doc/asio/reference/experimental__basic_channel/async_send.html +/doc/asio/reference/experimental__basic_channel/basic_channel/ +/doc/asio/reference/experimental__basic_channel/_basic_channel.html +/doc/asio/reference/experimental__basic_channel/basic_channel.html +/doc/asio/reference/experimental__basic_channel/basic_channel/overload1.html +/doc/asio/reference/experimental__basic_channel/basic_channel/overload2.html +/doc/asio/reference/experimental__basic_channel/basic_channel/overload3.html +/doc/asio/reference/experimental__basic_channel/basic_channel/overload4.html +/doc/asio/reference/experimental__basic_channel/cancel.html +/doc/asio/reference/experimental__basic_channel/capacity.html +/doc/asio/reference/experimental__basic_channel/close.html +/doc/asio/reference/experimental__basic_channel/executor_type.html +/doc/asio/reference/experimental__basic_channel/get_executor.html +/doc/asio/reference/experimental__basic_channel.html +/doc/asio/reference/experimental__basic_channel/is_open.html +/doc/asio/reference/experimental__basic_channel/operator_eq_/ +/doc/asio/reference/experimental__basic_channel/operator_eq_.html +/doc/asio/reference/experimental__basic_channel/operator_eq_/overload1.html +/doc/asio/reference/experimental__basic_channel/operator_eq_/overload2.html +/doc/asio/reference/experimental__basic_channel/ready.html +/doc/asio/reference/experimental__basic_channel__rebind_executor/ +/doc/asio/reference/experimental__basic_channel__rebind_executor.html +/doc/asio/reference/experimental__basic_channel__rebind_executor/other.html +/doc/asio/reference/experimental__basic_channel/reset.html +/doc/asio/reference/experimental__basic_channel/traits_type.html +/doc/asio/reference/experimental__basic_channel/try_receive.html +/doc/asio/reference/experimental__basic_channel/try_send.html +/doc/asio/reference/experimental__basic_channel/try_send_n.html +/doc/asio/reference/experimental__basic_concurrent_channel/ +/doc/asio/reference/experimental__basic_concurrent_channel/async_receive.html +/doc/asio/reference/experimental__basic_concurrent_channel/async_send.html +/doc/asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/ +/doc/asio/reference/experimental__basic_concurrent_channel/_basic_concurrent_channel.html +/doc/asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel.html +/doc/asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload1.html +/doc/asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload2.html +/doc/asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload3.html +/doc/asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload4.html +/doc/asio/reference/experimental__basic_concurrent_channel/cancel.html +/doc/asio/reference/experimental__basic_concurrent_channel/capacity.html +/doc/asio/reference/experimental__basic_concurrent_channel/close.html +/doc/asio/reference/experimental__basic_concurrent_channel/executor_type.html +/doc/asio/reference/experimental__basic_concurrent_channel/get_executor.html +/doc/asio/reference/experimental__basic_concurrent_channel.html +/doc/asio/reference/experimental__basic_concurrent_channel/is_open.html +/doc/asio/reference/experimental__basic_concurrent_channel/operator_eq_/ +/doc/asio/reference/experimental__basic_concurrent_channel/operator_eq_.html +/doc/asio/reference/experimental__basic_concurrent_channel/operator_eq_/overload1.html +/doc/asio/reference/experimental__basic_concurrent_channel/operator_eq_/overload2.html +/doc/asio/reference/experimental__basic_concurrent_channel/ready.html +/doc/asio/reference/experimental__basic_concurrent_channel__rebind_executor/ +/doc/asio/reference/experimental__basic_concurrent_channel__rebind_executor.html +/doc/asio/reference/experimental__basic_concurrent_channel__rebind_executor/other.html +/doc/asio/reference/experimental__basic_concurrent_channel/reset.html +/doc/asio/reference/experimental__basic_concurrent_channel/traits_type.html +/doc/asio/reference/experimental__basic_concurrent_channel/try_receive.html +/doc/asio/reference/experimental__basic_concurrent_channel/try_send.html +/doc/asio/reference/experimental__basic_concurrent_channel/try_send_n.html +/doc/asio/reference/experimental__channel_traits/ +/doc/asio/reference/experimental__channel_traits__container/ +/doc/asio/reference/experimental__channel_traits__container.html +/doc/asio/reference/experimental__channel_traits__container/type.html +/doc/asio/reference/experimental__channel_traits.html +/doc/asio/reference/experimental__channel_traits/invoke_receive_cancelled.html +/doc/asio/reference/experimental__channel_traits/invoke_receive_closed.html +/doc/asio/reference/experimental__channel_traits__rebind/ +/doc/asio/reference/experimental__channel_traits__rebind.html +/doc/asio/reference/experimental__channel_traits__rebind/other.html +/doc/asio/reference/experimental__channel_traits/receive_cancelled_signature.html +/doc/asio/reference/experimental__channel_traits/receive_closed_signature.html +/doc/asio/reference/experimental__co_composed.html +/doc/asio/reference/experimental__coro/ +/doc/asio/reference/experimental__coro/async_resume/ +/doc/asio/reference/experimental__coro/async_resume.html +/doc/asio/reference/experimental__coro/async_resume/overload1.html +/doc/asio/reference/experimental__coro/async_resume/overload2.html +/doc/asio/reference/experimental__coro/coro/ +/doc/asio/reference/experimental__coro/_coro.html +/doc/asio/reference/experimental__coro/coro.html +/doc/asio/reference/experimental__coro/coro/overload1.html +/doc/asio/reference/experimental__coro/coro/overload2.html +/doc/asio/reference/experimental__coro/coro/overload3.html +/doc/asio/reference/experimental__coro/get_allocator.html +/doc/asio/reference/experimental__coro/get_executor.html +/doc/asio/reference/experimental__coro.html +/doc/asio/reference/experimental__coro/is_noexcept.html +/doc/asio/reference/experimental__coro/is_open.html +/doc/asio/reference/experimental__coro/operator_bool.html +/doc/asio/reference/experimental__coro/operator_co_await.html +/doc/asio/reference/experimental__coro/operator_eq_/ +/doc/asio/reference/experimental__coro/operator_eq_.html +/doc/asio/reference/experimental__coro/operator_eq_/overload1.html +/doc/asio/reference/experimental__coro/operator_eq_/overload2.html +/doc/asio/reference/experimental__coro/operator_lp__rp_.html +/doc/asio/reference/experimental__coro_traits/ +/doc/asio/reference/experimental__coro_traits.html +/doc/asio/reference/experimental__coro_traits/is_noexcept.html +/doc/asio/reference/experimental__co_spawn/ +/doc/asio/reference/experimental__co_spawn.html +/doc/asio/reference/experimental__co_spawn/overload1.html +/doc/asio/reference/experimental__co_spawn/overload2.html +/doc/asio/reference/experimental__co_spawn/overload3.html +/doc/asio/reference/experimental__co_spawn/overload4.html +/doc/asio/reference/experimental__co_spawn/overload5.html +/doc/asio/reference/experimental__co_spawn/overload6.html +/doc/asio/reference/experimental__error__channel_category.html +/doc/asio/reference/experimental__error__channel_errors.html +/doc/asio/reference/experimental__error__get_channel_category.html +/doc/asio/reference/experimental__error__make_error_code.html +/doc/asio/reference/experimental__is_async_operation_range/ +/doc/asio/reference/experimental__is_async_operation_range.html +/doc/asio/reference/experimental__is_async_operation_range/value.html +/doc/asio/reference/experimental__is_promise.html +/doc/asio/reference/experimental__is_promise_lt__promise_lt__Ts_ellipsis__gt__gt_.html +/doc/asio/reference/experimental__is_promise_v.html +/doc/asio/reference/experimental__make_parallel_group/ +/doc/asio/reference/experimental__make_parallel_group.html +/doc/asio/reference/experimental__make_parallel_group/overload1.html +/doc/asio/reference/experimental__make_parallel_group/overload2.html +/doc/asio/reference/experimental__make_parallel_group/overload3.html +/doc/asio/reference/experimental__parallel_group/ +/doc/asio/reference/experimental__parallel_group/async_wait.html +/doc/asio/reference/experimental__parallel_group.html +/doc/asio/reference/experimental__parallel_group/parallel_group.html +/doc/asio/reference/experimental__parallel_group/signature.html +/doc/asio/reference/experimental__promise/ +/doc/asio/reference/experimental__promise/cancel.html +/doc/asio/reference/experimental__promise/completed.html +/doc/asio/reference/experimental__promise.html +/doc/asio/reference/experimental__promise/operator_lp__rp_.html +/doc/asio/reference/experimental__promise/promise/ +/doc/asio/reference/experimental__promise/_promise.html +/doc/asio/reference/experimental__promise/promise.html +/doc/asio/reference/experimental__promise/promise/overload1.html +/doc/asio/reference/experimental__promise/promise/overload2.html +/doc/asio/reference/experimental__promise/promise/overload3.html +/doc/asio/reference/experimental__promise_value_type.html +/doc/asio/reference/experimental__promise_value_type_lt__gt_.html +/doc/asio/reference/experimental__promise_value_type_lt__T__gt_.html +/doc/asio/reference/experimental__ranged_parallel_group/ +/doc/asio/reference/experimental__ranged_parallel_group/async_wait.html +/doc/asio/reference/experimental__ranged_parallel_group.html +/doc/asio/reference/experimental__ranged_parallel_group/ranged_parallel_group.html +/doc/asio/reference/experimental__ranged_parallel_group/signature.html +/doc/asio/reference/experimental__use_coro.html +/doc/asio/reference/experimental__use_coro_t/ +/doc/asio/reference/experimental__use_coro_t/allocator_type.html +/doc/asio/reference/experimental__use_coro_t/as_default_on.html +/doc/asio/reference/experimental__use_coro_t__executor_with_default/ +/doc/asio/reference/experimental__use_coro_t__executor_with_default/default_completion_token_type.html +/doc/asio/reference/experimental__use_coro_t__executor_with_default/executor_with_default.html +/doc/asio/reference/experimental__use_coro_t__executor_with_default.html +/doc/asio/reference/experimental__use_coro_t/get_allocator.html +/doc/asio/reference/experimental__use_coro_t.html +/doc/asio/reference/experimental__use_coro_t/rebind.html +/doc/asio/reference/experimental__use_coro_t/use_coro_t/ +/doc/asio/reference/experimental__use_coro_t/use_coro_t.html +/doc/asio/reference/experimental__use_coro_t/use_coro_t/overload1.html +/doc/asio/reference/experimental__use_coro_t/use_coro_t/overload2.html +/doc/asio/reference/experimental__use_promise.html +/doc/asio/reference/experimental__use_promise_t/ +/doc/asio/reference/experimental__use_promise_t/allocator_type.html +/doc/asio/reference/experimental__use_promise_t/as_default_on.html +/doc/asio/reference/experimental__use_promise_t__executor_with_default/ +/doc/asio/reference/experimental__use_promise_t__executor_with_default/default_completion_token_type.html +/doc/asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default/ +/doc/asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default.html +/doc/asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default/overload1.html +/doc/asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default/overload2.html +/doc/asio/reference/experimental__use_promise_t__executor_with_default.html +/doc/asio/reference/experimental__use_promise_t/get_allocator.html +/doc/asio/reference/experimental__use_promise_t.html +/doc/asio/reference/experimental__use_promise_t/rebind.html +/doc/asio/reference/experimental__use_promise_t/use_promise_t/ +/doc/asio/reference/experimental__use_promise_t/use_promise_t.html +/doc/asio/reference/experimental__use_promise_t/use_promise_t/overload1.html +/doc/asio/reference/experimental__use_promise_t/use_promise_t/overload2.html +/doc/asio/reference/experimental__wait_for_all/ +/doc/asio/reference/experimental__wait_for_all.html +/doc/asio/reference/experimental__wait_for_all/operator_lp__rp_.html +/doc/asio/reference/experimental__wait_for_one/ +/doc/asio/reference/experimental__wait_for_one_error/ +/doc/asio/reference/experimental__wait_for_one_error.html +/doc/asio/reference/experimental__wait_for_one_error/operator_lp__rp_/ +/doc/asio/reference/experimental__wait_for_one_error/operator_lp__rp_.html +/doc/asio/reference/experimental__wait_for_one_error/operator_lp__rp_/overload1.html +/doc/asio/reference/experimental__wait_for_one_error/operator_lp__rp_/overload2.html +/doc/asio/reference/experimental__wait_for_one_error/operator_lp__rp_/overload3.html +/doc/asio/reference/experimental__wait_for_one_error/wait_for_one_error.html +/doc/asio/reference/experimental__wait_for_one.html +/doc/asio/reference/experimental__wait_for_one/operator_lp__rp_.html +/doc/asio/reference/experimental__wait_for_one_success/ +/doc/asio/reference/experimental__wait_for_one_success.html +/doc/asio/reference/experimental__wait_for_one_success/operator_lp__rp_/ +/doc/asio/reference/experimental__wait_for_one_success/operator_lp__rp_.html +/doc/asio/reference/experimental__wait_for_one_success/operator_lp__rp_/overload1.html +/doc/asio/reference/experimental__wait_for_one_success/operator_lp__rp_/overload2.html +/doc/asio/reference/experimental__wait_for_one_success/operator_lp__rp_/overload3.html +/doc/asio/reference/experimental__wait_for_one_success/wait_for_one_success.html +/doc/asio/reference/experimental__wait_for_one/wait_for_one.html +/doc/asio/reference/file_base/ +/doc/asio/reference/file_base/append.html +/doc/asio/reference/file_base/create.html +/doc/asio/reference/file_base/exclusive.html +/doc/asio/reference/file_base/_file_base.html +/doc/asio/reference/file_base/flags.html +/doc/asio/reference/file_base.html +/doc/asio/reference/file_base/read_only.html +/doc/asio/reference/file_base/read_write.html +/doc/asio/reference/file_base/seek_basis.html +/doc/asio/reference/file_base/sync_all_on_write.html +/doc/asio/reference/file_base/truncate.html +/doc/asio/reference/file_base/write_only.html /doc/asio/reference/generic__basic_endpoint/ /doc/asio/reference/generic__basic_endpoint/basic_endpoint/ /doc/asio/reference/generic__basic_endpoint/basic_endpoint.html @@ -2423,17 +3523,55 @@ /doc/asio/reference/get_associated_allocator.html /doc/asio/reference/get_associated_allocator/overload1.html /doc/asio/reference/get_associated_allocator/overload2.html +/doc/asio/reference/get_associated_cancellation_slot/ +/doc/asio/reference/get_associated_cancellation_slot.html +/doc/asio/reference/get_associated_cancellation_slot/overload1.html +/doc/asio/reference/get_associated_cancellation_slot/overload2.html /doc/asio/reference/get_associated_executor/ /doc/asio/reference/get_associated_executor.html /doc/asio/reference/get_associated_executor/overload1.html /doc/asio/reference/get_associated_executor/overload2.html /doc/asio/reference/get_associated_executor/overload3.html +/doc/asio/reference/get_associated_immediate_executor/ +/doc/asio/reference/get_associated_immediate_executor.html +/doc/asio/reference/get_associated_immediate_executor/overload1.html +/doc/asio/reference/get_associated_immediate_executor/overload2.html /doc/asio/reference/GettableSerialPortOption.html /doc/asio/reference/GettableSocketOption.html /doc/asio/reference/Handler.html /doc/asio/reference/HandshakeHandler.html +/doc/asio/reference/HandshakeToken.html /doc/asio/reference/high_resolution_timer.html /doc/asio/reference.html +/doc/asio/reference/immediate_executor_binder/ +/doc/asio/reference/immediate_executor_binder/argument_type.html +/doc/asio/reference/immediate_executor_binder/first_argument_type.html +/doc/asio/reference/immediate_executor_binder/get/ +/doc/asio/reference/immediate_executor_binder/get.html +/doc/asio/reference/immediate_executor_binder/get_immediate_executor.html +/doc/asio/reference/immediate_executor_binder/get/overload1.html +/doc/asio/reference/immediate_executor_binder/get/overload2.html +/doc/asio/reference/immediate_executor_binder.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/ +/doc/asio/reference/immediate_executor_binder/_immediate_executor_binder.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload1.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload2.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload3.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload4.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload5.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload6.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload7.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload8.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_binder/overload9.html +/doc/asio/reference/immediate_executor_binder/immediate_executor_type.html +/doc/asio/reference/immediate_executor_binder/operator_lp__rp_/ +/doc/asio/reference/immediate_executor_binder/operator_lp__rp_.html +/doc/asio/reference/immediate_executor_binder/operator_lp__rp_/overload1.html +/doc/asio/reference/immediate_executor_binder/operator_lp__rp_/overload2.html +/doc/asio/reference/immediate_executor_binder/result_type.html +/doc/asio/reference/immediate_executor_binder/second_argument_type.html +/doc/asio/reference/immediate_executor_binder/target_type.html /doc/asio/reference/InternetProtocol.html /doc/asio/reference/invalid_service_owner/ /doc/asio/reference/invalid_service_owner.html @@ -2872,6 +4010,7 @@ /doc/asio/reference/ip__basic_resolver/basic_resolver/overload1.html /doc/asio/reference/ip__basic_resolver/basic_resolver/overload2.html /doc/asio/reference/ip__basic_resolver/basic_resolver/overload3.html +/doc/asio/reference/ip__basic_resolver/basic_resolver/overload4.html /doc/asio/reference/ip__basic_resolver/cancel.html /doc/asio/reference/ip__basic_resolver/canonical_name.html /doc/asio/reference/ip__basic_resolver/endpoint_type.html @@ -2929,7 +4068,10 @@ /doc/asio/reference/ip__basic_resolver_iterator/value_type.html /doc/asio/reference/ip__basic_resolver/numeric_host.html /doc/asio/reference/ip__basic_resolver/numeric_service.html +/doc/asio/reference/ip__basic_resolver/operator_eq_/ /doc/asio/reference/ip__basic_resolver/operator_eq_.html +/doc/asio/reference/ip__basic_resolver/operator_eq_/overload1.html +/doc/asio/reference/ip__basic_resolver/operator_eq_/overload2.html /doc/asio/reference/ip__basic_resolver/passive.html /doc/asio/reference/ip__basic_resolver/protocol_type.html /doc/asio/reference/ip__basic_resolver_query/ @@ -3103,6 +4245,7 @@ /doc/asio/reference/ip__network_v6/to_string.html /doc/asio/reference/ip__network_v6/to_string/overload1.html /doc/asio/reference/ip__network_v6/to_string/overload2.html +/doc/asio/reference/ip__port_type.html /doc/asio/reference/ip__resolver_base/ /doc/asio/reference/ip__resolver_base/address_configured.html /doc/asio/reference/ip__resolver_base/all_matching.html @@ -3125,6 +4268,7 @@ /doc/asio/reference/ip__resolver_query_base/passive.html /doc/asio/reference/ip__resolver_query_base/_resolver_query_base.html /doc/asio/reference/ip__resolver_query_base/v4_mapped.html +/doc/asio/reference/ip__scope_id_type.html /doc/asio/reference/ip__tcp/ /doc/asio/reference/ip__tcp/acceptor.html /doc/asio/reference/ip__tcp/endpoint.html @@ -3156,7 +4300,10 @@ /doc/asio/reference/ip__v4_mapped_t.html /doc/asio/reference/ip__v6_only.html /doc/asio/reference/is_applicable_property.html +/doc/asio/reference/is_async_operation.html /doc/asio/reference/is_const_buffer_sequence.html +/doc/asio/reference/is_contiguous_iterator.html +/doc/asio/reference/is_deferred.html /doc/asio/reference/is_dynamic_buffer.html /doc/asio/reference/is_dynamic_buffer_v1.html /doc/asio/reference/is_dynamic_buffer_v2.html @@ -3179,6 +4326,7 @@ /doc/asio/reference/is_write_buffered.html /doc/asio/reference/is_write_buffered/value.html /doc/asio/reference/IteratorConnectHandler.html +/doc/asio/reference/IteratorConnectToken.html /doc/asio/reference/LegacyCompletionHandler.html /doc/asio/reference/local__basic_endpoint/ /doc/asio/reference/local__basic_endpoint/basic_endpoint/ @@ -3222,6 +4370,14 @@ /doc/asio/reference/local__datagram_protocol/protocol.html /doc/asio/reference/local__datagram_protocol/socket.html /doc/asio/reference/local__datagram_protocol/type.html +/doc/asio/reference/local__seq_packet_protocol/ +/doc/asio/reference/local__seq_packet_protocol/acceptor.html +/doc/asio/reference/local__seq_packet_protocol/endpoint.html +/doc/asio/reference/local__seq_packet_protocol/family.html +/doc/asio/reference/local__seq_packet_protocol.html +/doc/asio/reference/local__seq_packet_protocol/protocol.html +/doc/asio/reference/local__seq_packet_protocol/socket.html +/doc/asio/reference/local__seq_packet_protocol/type.html /doc/asio/reference/local__stream_protocol/ /doc/asio/reference/local__stream_protocol/acceptor.html /doc/asio/reference/local__stream_protocol/endpoint.html @@ -3243,6 +4399,7 @@ /doc/asio/reference/make_work_guard/overload4.html /doc/asio/reference/make_work_guard/overload5.html /doc/asio/reference/MoveAcceptHandler.html +/doc/asio/reference/MoveAcceptToken.html /doc/asio/reference/multiple_exceptions/ /doc/asio/reference/multiple_exceptions/first_exception.html /doc/asio/reference/multiple_exceptions.html @@ -3279,6 +4436,19 @@ /doc/asio/reference/mutable_buffers_1/value_type.html /doc/asio/reference/MutableBufferSequence.html /doc/asio/reference/mutable_buffer/size.html +/doc/asio/reference/mutable_registered_buffer/ +/doc/asio/reference/mutable_registered_buffer/buffer.html +/doc/asio/reference/mutable_registered_buffer/data.html +/doc/asio/reference/mutable_registered_buffer.html +/doc/asio/reference/mutable_registered_buffer/id.html +/doc/asio/reference/mutable_registered_buffer/mutable_registered_buffer.html +/doc/asio/reference/mutable_registered_buffer/operator_plus_/ +/doc/asio/reference/mutable_registered_buffer/operator_plus__eq_.html +/doc/asio/reference/mutable_registered_buffer/operator_plus_.html +/doc/asio/reference/mutable_registered_buffer/operator_plus_/overload1.html +/doc/asio/reference/mutable_registered_buffer/operator_plus_/overload2.html +/doc/asio/reference/mutable_registered_buffer/size.html +/doc/asio/reference/NullaryToken.html /doc/asio/reference/null_buffers/ /doc/asio/reference/null_buffers/begin.html /doc/asio/reference/null_buffers/const_iterator.html @@ -3287,6 +4457,7 @@ /doc/asio/reference/null_buffers/value_type.html /doc/asio/reference/OperationState.html /doc/asio/reference/operator_lt__lt_.html +/doc/asio/reference/operator_pipe_.html /doc/asio/reference/placeholders__bytes_transferred.html /doc/asio/reference/placeholders__endpoint.html /doc/asio/reference/placeholders__error.html @@ -3307,6 +4478,7 @@ /doc/asio/reference/posix__basic_descriptor/basic_descriptor/overload3.html /doc/asio/reference/posix__basic_descriptor/basic_descriptor/overload4.html /doc/asio/reference/posix__basic_descriptor/basic_descriptor/overload5.html +/doc/asio/reference/posix__basic_descriptor/basic_descriptor/overload6.html /doc/asio/reference/posix__basic_descriptor/bytes_readable.html /doc/asio/reference/posix__basic_descriptor/cancel/ /doc/asio/reference/posix__basic_descriptor/cancel.html @@ -3319,7 +4491,6 @@ /doc/asio/reference/posix__basic_descriptor/executor_type.html /doc/asio/reference/posix__basic_descriptor/get_executor.html /doc/asio/reference/posix__basic_descriptor.html -/doc/asio/reference/posix__basic_descriptor/impl_.html /doc/asio/reference/posix__basic_descriptor/io_control/ /doc/asio/reference/posix__basic_descriptor/io_control.html /doc/asio/reference/posix__basic_descriptor/io_control/overload1.html @@ -3342,7 +4513,10 @@ /doc/asio/reference/posix__basic_descriptor/non_blocking/overload1.html /doc/asio/reference/posix__basic_descriptor/non_blocking/overload2.html /doc/asio/reference/posix__basic_descriptor/non_blocking/overload3.html +/doc/asio/reference/posix__basic_descriptor/operator_eq_/ /doc/asio/reference/posix__basic_descriptor/operator_eq_.html +/doc/asio/reference/posix__basic_descriptor/operator_eq_/overload1.html +/doc/asio/reference/posix__basic_descriptor/operator_eq_/overload2.html /doc/asio/reference/posix__basic_descriptor__rebind_executor/ /doc/asio/reference/posix__basic_descriptor__rebind_executor.html /doc/asio/reference/posix__basic_descriptor__rebind_executor/other.html @@ -3367,6 +4541,7 @@ /doc/asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload3.html /doc/asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload4.html /doc/asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload5.html +/doc/asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload6.html /doc/asio/reference/posix__basic_stream_descriptor/bytes_readable.html /doc/asio/reference/posix__basic_stream_descriptor/cancel/ /doc/asio/reference/posix__basic_stream_descriptor/cancel.html @@ -3379,7 +4554,6 @@ /doc/asio/reference/posix__basic_stream_descriptor/executor_type.html /doc/asio/reference/posix__basic_stream_descriptor/get_executor.html /doc/asio/reference/posix__basic_stream_descriptor.html -/doc/asio/reference/posix__basic_stream_descriptor/impl_.html /doc/asio/reference/posix__basic_stream_descriptor/io_control/ /doc/asio/reference/posix__basic_stream_descriptor/io_control.html /doc/asio/reference/posix__basic_stream_descriptor/io_control/overload1.html @@ -3402,7 +4576,10 @@ /doc/asio/reference/posix__basic_stream_descriptor/non_blocking/overload1.html /doc/asio/reference/posix__basic_stream_descriptor/non_blocking/overload2.html /doc/asio/reference/posix__basic_stream_descriptor/non_blocking/overload3.html +/doc/asio/reference/posix__basic_stream_descriptor/operator_eq_/ /doc/asio/reference/posix__basic_stream_descriptor/operator_eq_.html +/doc/asio/reference/posix__basic_stream_descriptor/operator_eq_/overload1.html +/doc/asio/reference/posix__basic_stream_descriptor/operator_eq_/overload2.html /doc/asio/reference/posix__basic_stream_descriptor/read_some/ /doc/asio/reference/posix__basic_stream_descriptor/read_some.html /doc/asio/reference/posix__basic_stream_descriptor/read_some/overload1.html @@ -3436,14 +4613,23 @@ /doc/asio/reference/prefer_result/ /doc/asio/reference/prefer_result.html /doc/asio/reference/prefer_result/type.html +/doc/asio/reference/prepend.html +/doc/asio/reference/prepend_t/ +/doc/asio/reference/prepend_t.html +/doc/asio/reference/prepend_t/prepend_t.html +/doc/asio/reference/prepend_t/token_.html +/doc/asio/reference/prepend_t/values_.html /doc/asio/reference/ProtoAllocator.html /doc/asio/reference/Protocol.html /doc/asio/reference/query.html /doc/asio/reference/query_result/ /doc/asio/reference/query_result.html /doc/asio/reference/query_result/type.html +/doc/asio/reference/random_access_file.html /doc/asio/reference/RangeConnectHandler.html +/doc/asio/reference/RangeConnectToken.html /doc/asio/reference/read/ +/doc/asio/reference/readable_pipe.html /doc/asio/reference/read_at/ /doc/asio/reference/read_at.html /doc/asio/reference/read_at/overload1.html @@ -3472,6 +4658,7 @@ /doc/asio/reference/read/overload7.html /doc/asio/reference/read/overload8.html /doc/asio/reference/read/overload9.html +/doc/asio/reference/ReadToken.html /doc/asio/reference/read_until/ /doc/asio/reference/read_until.html /doc/asio/reference/read_until/overload10.html @@ -3500,12 +4687,51 @@ /doc/asio/reference/read_until/overload9.html /doc/asio/reference/read_write_operations.html /doc/asio/reference/Receiver.html +/doc/asio/reference/recycling_allocator/ +/doc/asio/reference/recycling_allocator/allocate.html +/doc/asio/reference/recycling_allocator/deallocate.html +/doc/asio/reference/recycling_allocator.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/ +/doc/asio/reference/recycling_allocator_lt__void__gt_.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/operator_eq__eq_.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/operator_not__eq_.html +/doc/asio/reference/recycling_allocator_lt__void__gt___rebind/ +/doc/asio/reference/recycling_allocator_lt__void__gt___rebind.html +/doc/asio/reference/recycling_allocator_lt__void__gt___rebind/other.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator/ +/doc/asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator/overload1.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator/overload2.html +/doc/asio/reference/recycling_allocator_lt__void__gt_/value_type.html +/doc/asio/reference/recycling_allocator/operator_eq__eq_.html +/doc/asio/reference/recycling_allocator/operator_not__eq_.html +/doc/asio/reference/recycling_allocator__rebind/ +/doc/asio/reference/recycling_allocator__rebind.html +/doc/asio/reference/recycling_allocator__rebind/other.html +/doc/asio/reference/recycling_allocator/recycling_allocator/ +/doc/asio/reference/recycling_allocator/recycling_allocator.html +/doc/asio/reference/recycling_allocator/recycling_allocator/overload1.html +/doc/asio/reference/recycling_allocator/recycling_allocator/overload2.html +/doc/asio/reference/recycling_allocator/value_type.html /doc/asio/reference/redirect_error.html /doc/asio/reference/redirect_error_t/ /doc/asio/reference/redirect_error_t/ec_.html /doc/asio/reference/redirect_error_t.html /doc/asio/reference/redirect_error_t/redirect_error_t.html /doc/asio/reference/redirect_error_t/token_.html +/doc/asio/reference/register_buffers/ +/doc/asio/reference/register_buffers.html +/doc/asio/reference/register_buffers/overload1.html +/doc/asio/reference/register_buffers/overload2.html +/doc/asio/reference/register_buffers/overload3.html +/doc/asio/reference/register_buffers/overload4.html +/doc/asio/reference/registered_buffer_id/ +/doc/asio/reference/registered_buffer_id.html +/doc/asio/reference/registered_buffer_id/native_handle.html +/doc/asio/reference/registered_buffer_id/native_handle_type.html +/doc/asio/reference/registered_buffer_id/operator_eq__eq_.html +/doc/asio/reference/registered_buffer_id/operator_not__eq_.html +/doc/asio/reference/registered_buffer_id/registered_buffer_id.html /doc/asio/reference/require_concept.html /doc/asio/reference/require_concept_result/ /doc/asio/reference/require_concept_result.html @@ -3516,6 +4742,7 @@ /doc/asio/reference/require_result/type.html /doc/asio/reference/ResolveHandler.html /doc/asio/reference/resolver_errc__try_again.html +/doc/asio/reference/ResolveToken.html /doc/asio/reference/Scheduler.html /doc/asio/reference/Sender.html /doc/asio/reference/serial_port_base/ @@ -3562,8 +4789,15 @@ /doc/asio/reference/SettableSerialPortOption.html /doc/asio/reference/SettableSocketOption.html /doc/asio/reference/ShutdownHandler.html +/doc/asio/reference/ShutdownToken.html /doc/asio/reference/SignalHandler.html +/doc/asio/reference/signal_set_base/ +/doc/asio/reference/signal_set_base/flags.html +/doc/asio/reference/signal_set_base/flags_t.html +/doc/asio/reference/signal_set_base.html +/doc/asio/reference/signal_set_base/_signal_set_base.html /doc/asio/reference/signal_set.html +/doc/asio/reference/SignalToken.html /doc/asio/reference/socket_base/ /doc/asio/reference/socket_base/broadcast.html /doc/asio/reference/socket_base/bytes_readable.html @@ -3591,6 +4825,10 @@ /doc/asio/reference/socket_base/wait_type.html /doc/asio/reference/spawn/ /doc/asio/reference/spawn.html +/doc/asio/reference/spawn/overload10.html +/doc/asio/reference/spawn/overload11.html +/doc/asio/reference/spawn/overload12.html +/doc/asio/reference/spawn/overload13.html /doc/asio/reference/spawn/overload1.html /doc/asio/reference/spawn/overload2.html /doc/asio/reference/spawn/overload3.html @@ -3598,6 +4836,8 @@ /doc/asio/reference/spawn/overload5.html /doc/asio/reference/spawn/overload6.html /doc/asio/reference/spawn/overload7.html +/doc/asio/reference/spawn/overload8.html +/doc/asio/reference/spawn/overload9.html /doc/asio/reference/ssl__context/ /doc/asio/reference/ssl__context/add_certificate_authority/ /doc/asio/reference/ssl__context/add_certificate_authority.html @@ -3769,6 +5009,7 @@ /doc/asio/reference/ssl__stream/next_layer/overload1.html /doc/asio/reference/ssl__stream/next_layer/overload2.html /doc/asio/reference/ssl__stream/next_layer_type.html +/doc/asio/reference/ssl__stream/operator_eq_.html /doc/asio/reference/ssl__stream/read_some/ /doc/asio/reference/ssl__stream/read_some.html /doc/asio/reference/ssl__stream/read_some/overload1.html @@ -3794,6 +5035,7 @@ /doc/asio/reference/ssl__stream/stream.html /doc/asio/reference/ssl__stream/stream/overload1.html /doc/asio/reference/ssl__stream/stream/overload2.html +/doc/asio/reference/ssl__stream/stream/overload3.html /doc/asio/reference/ssl__stream/write_some/ /doc/asio/reference/ssl__stream/write_some.html /doc/asio/reference/ssl__stream/write_some/overload1.html @@ -3811,12 +5053,15 @@ /doc/asio/reference/static_thread_pool.html /doc/asio/reference/steady_timer.html /doc/asio/reference/strand/ +/doc/asio/reference/strand/context.html /doc/asio/reference/strand/defer.html /doc/asio/reference/strand/dispatch.html /doc/asio/reference/strand/execute.html /doc/asio/reference/strand/get_inner_executor.html /doc/asio/reference/strand.html /doc/asio/reference/strand/inner_executor_type.html +/doc/asio/reference/strand/on_work_finished.html +/doc/asio/reference/strand/on_work_started.html /doc/asio/reference/strand/operator_eq_/ /doc/asio/reference/strand/operator_eq__eq_.html /doc/asio/reference/strand/operator_eq_.html @@ -3840,6 +5085,7 @@ /doc/asio/reference/strand/strand/overload5.html /doc/asio/reference/strand/strand/overload6.html /doc/asio/reference/streambuf.html +/doc/asio/reference/stream_file.html /doc/asio/reference/synchronous_socket_operations.html /doc/asio/reference/SyncRandomAccessReadDevice.html /doc/asio/reference/SyncRandomAccessWriteDevice.html @@ -3878,10 +5124,23 @@ /doc/asio/reference/system_error/what.html /doc/asio/reference/system_executor.html /doc/asio/reference/system_timer.html +/doc/asio/reference/this_coro__cancellation_state.html +/doc/asio/reference/this_coro__cancellation_state_t/ +/doc/asio/reference/this_coro__cancellation_state_t/cancellation_state_t.html +/doc/asio/reference/this_coro__cancellation_state_t.html /doc/asio/reference/this_coro__executor.html /doc/asio/reference/this_coro__executor_t/ /doc/asio/reference/this_coro__executor_t/executor_t.html /doc/asio/reference/this_coro__executor_t.html +/doc/asio/reference/this_coro__reset_cancellation_state/ +/doc/asio/reference/this_coro__reset_cancellation_state.html +/doc/asio/reference/this_coro__reset_cancellation_state/overload1.html +/doc/asio/reference/this_coro__reset_cancellation_state/overload2.html +/doc/asio/reference/this_coro__reset_cancellation_state/overload3.html +/doc/asio/reference/this_coro__throw_if_cancelled/ +/doc/asio/reference/this_coro__throw_if_cancelled.html +/doc/asio/reference/this_coro__throw_if_cancelled/overload1.html +/doc/asio/reference/this_coro__throw_if_cancelled/overload2.html /doc/asio/reference/thread/ /doc/asio/reference/thread.html /doc/asio/reference/thread/join.html @@ -3895,11 +5154,13 @@ /doc/asio/reference/thread_pool__basic_executor_type/basic_executor_type/overload1.html /doc/asio/reference/thread_pool__basic_executor_type/basic_executor_type/overload2.html /doc/asio/reference/thread_pool__basic_executor_type/bulk_execute.html +/doc/asio/reference/thread_pool__basic_executor_type/connect.html /doc/asio/reference/thread_pool__basic_executor_type/context.html /doc/asio/reference/thread_pool__basic_executor_type/defer.html /doc/asio/reference/thread_pool__basic_executor_type/dispatch.html /doc/asio/reference/thread_pool__basic_executor_type/execute.html /doc/asio/reference/thread_pool__basic_executor_type.html +/doc/asio/reference/thread_pool__basic_executor_type/index_type.html /doc/asio/reference/thread_pool__basic_executor_type/on_work_finished.html /doc/asio/reference/thread_pool__basic_executor_type/on_work_started.html /doc/asio/reference/thread_pool__basic_executor_type/operator_eq_/ @@ -3936,6 +5197,7 @@ /doc/asio/reference/thread_pool__basic_executor_type/running_in_this_thread.html /doc/asio/reference/thread_pool__basic_executor_type/schedule.html /doc/asio/reference/thread_pool__basic_executor_type/sender_type.html +/doc/asio/reference/thread_pool__basic_executor_type/shape_type.html /doc/asio/reference/thread_pool/destroy.html /doc/asio/reference/thread_pool/executor.html /doc/asio/reference/thread_pool/executor_type.html @@ -3980,10 +5242,7 @@ /doc/asio/reference/use_awaitable_t/as_default_on.html /doc/asio/reference/use_awaitable_t__executor_with_default/ /doc/asio/reference/use_awaitable_t__executor_with_default/default_completion_token_type.html -/doc/asio/reference/use_awaitable_t__executor_with_default/executor_with_default/ /doc/asio/reference/use_awaitable_t__executor_with_default/executor_with_default.html -/doc/asio/reference/use_awaitable_t__executor_with_default/executor_with_default/overload1.html -/doc/asio/reference/use_awaitable_t__executor_with_default/executor_with_default/overload2.html /doc/asio/reference/use_awaitable_t__executor_with_default.html /doc/asio/reference/use_awaitable_t.html /doc/asio/reference/use_awaitable_t/use_awaitable_t/ @@ -4004,6 +5263,7 @@ /doc/asio/reference/use_future_t/use_future_t/overload2.html /doc/asio/reference/uses_executor.html /doc/asio/reference/WaitHandler.html +/doc/asio/reference/WaitToken.html /doc/asio/reference/wait_traits/ /doc/asio/reference/WaitTraits.html /doc/asio/reference/wait_traits.html @@ -4024,6 +5284,7 @@ /doc/asio/reference/windows__basic_object_handle/basic_object_handle/overload3.html /doc/asio/reference/windows__basic_object_handle/basic_object_handle/overload4.html /doc/asio/reference/windows__basic_object_handle/basic_object_handle/overload5.html +/doc/asio/reference/windows__basic_object_handle/basic_object_handle/overload6.html /doc/asio/reference/windows__basic_object_handle/cancel/ /doc/asio/reference/windows__basic_object_handle/cancel.html /doc/asio/reference/windows__basic_object_handle/cancel/overload1.html @@ -4043,7 +5304,10 @@ /doc/asio/reference/windows__basic_object_handle/lowest_layer_type.html /doc/asio/reference/windows__basic_object_handle/native_handle.html /doc/asio/reference/windows__basic_object_handle/native_handle_type.html +/doc/asio/reference/windows__basic_object_handle/operator_eq_/ /doc/asio/reference/windows__basic_object_handle/operator_eq_.html +/doc/asio/reference/windows__basic_object_handle/operator_eq_/overload1.html +/doc/asio/reference/windows__basic_object_handle/operator_eq_/overload2.html /doc/asio/reference/windows__basic_object_handle__rebind_executor/ /doc/asio/reference/windows__basic_object_handle__rebind_executor.html /doc/asio/reference/windows__basic_object_handle__rebind_executor/other.html @@ -4064,6 +5328,7 @@ /doc/asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload3.html /doc/asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload4.html /doc/asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload5.html +/doc/asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload6.html /doc/asio/reference/windows__basic_overlapped_handle/cancel/ /doc/asio/reference/windows__basic_overlapped_handle/cancel.html /doc/asio/reference/windows__basic_overlapped_handle/cancel/overload1.html @@ -4075,7 +5340,6 @@ /doc/asio/reference/windows__basic_overlapped_handle/executor_type.html /doc/asio/reference/windows__basic_overlapped_handle/get_executor.html /doc/asio/reference/windows__basic_overlapped_handle.html -/doc/asio/reference/windows__basic_overlapped_handle/impl_.html /doc/asio/reference/windows__basic_overlapped_handle/is_open.html /doc/asio/reference/windows__basic_overlapped_handle/lowest_layer/ /doc/asio/reference/windows__basic_overlapped_handle/lowest_layer.html @@ -4084,10 +5348,17 @@ /doc/asio/reference/windows__basic_overlapped_handle/lowest_layer_type.html /doc/asio/reference/windows__basic_overlapped_handle/native_handle.html /doc/asio/reference/windows__basic_overlapped_handle/native_handle_type.html +/doc/asio/reference/windows__basic_overlapped_handle/operator_eq_/ /doc/asio/reference/windows__basic_overlapped_handle/operator_eq_.html +/doc/asio/reference/windows__basic_overlapped_handle/operator_eq_/overload1.html +/doc/asio/reference/windows__basic_overlapped_handle/operator_eq_/overload2.html /doc/asio/reference/windows__basic_overlapped_handle__rebind_executor/ /doc/asio/reference/windows__basic_overlapped_handle__rebind_executor.html /doc/asio/reference/windows__basic_overlapped_handle__rebind_executor/other.html +/doc/asio/reference/windows__basic_overlapped_handle/release/ +/doc/asio/reference/windows__basic_overlapped_handle/release.html +/doc/asio/reference/windows__basic_overlapped_handle/release/overload1.html +/doc/asio/reference/windows__basic_overlapped_handle/release/overload2.html /doc/asio/reference/windows__basic_random_access_handle/ /doc/asio/reference/windows__basic_random_access_handle/assign/ /doc/asio/reference/windows__basic_random_access_handle/assign.html @@ -4102,6 +5373,7 @@ /doc/asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload3.html /doc/asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload4.html /doc/asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload5.html +/doc/asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload6.html /doc/asio/reference/windows__basic_random_access_handle/cancel/ /doc/asio/reference/windows__basic_random_access_handle/cancel.html /doc/asio/reference/windows__basic_random_access_handle/cancel/overload1.html @@ -4113,7 +5385,6 @@ /doc/asio/reference/windows__basic_random_access_handle/executor_type.html /doc/asio/reference/windows__basic_random_access_handle/get_executor.html /doc/asio/reference/windows__basic_random_access_handle.html -/doc/asio/reference/windows__basic_random_access_handle/impl_.html /doc/asio/reference/windows__basic_random_access_handle/is_open.html /doc/asio/reference/windows__basic_random_access_handle/lowest_layer/ /doc/asio/reference/windows__basic_random_access_handle/lowest_layer.html @@ -4122,7 +5393,10 @@ /doc/asio/reference/windows__basic_random_access_handle/lowest_layer_type.html /doc/asio/reference/windows__basic_random_access_handle/native_handle.html /doc/asio/reference/windows__basic_random_access_handle/native_handle_type.html +/doc/asio/reference/windows__basic_random_access_handle/operator_eq_/ /doc/asio/reference/windows__basic_random_access_handle/operator_eq_.html +/doc/asio/reference/windows__basic_random_access_handle/operator_eq_/overload1.html +/doc/asio/reference/windows__basic_random_access_handle/operator_eq_/overload2.html /doc/asio/reference/windows__basic_random_access_handle/read_some_at/ /doc/asio/reference/windows__basic_random_access_handle/read_some_at.html /doc/asio/reference/windows__basic_random_access_handle/read_some_at/overload1.html @@ -4130,6 +5404,10 @@ /doc/asio/reference/windows__basic_random_access_handle__rebind_executor/ /doc/asio/reference/windows__basic_random_access_handle__rebind_executor.html /doc/asio/reference/windows__basic_random_access_handle__rebind_executor/other.html +/doc/asio/reference/windows__basic_random_access_handle/release/ +/doc/asio/reference/windows__basic_random_access_handle/release.html +/doc/asio/reference/windows__basic_random_access_handle/release/overload1.html +/doc/asio/reference/windows__basic_random_access_handle/release/overload2.html /doc/asio/reference/windows__basic_random_access_handle/write_some_at/ /doc/asio/reference/windows__basic_random_access_handle/write_some_at.html /doc/asio/reference/windows__basic_random_access_handle/write_some_at/overload1.html @@ -4148,6 +5426,7 @@ /doc/asio/reference/windows__basic_stream_handle/basic_stream_handle/overload3.html /doc/asio/reference/windows__basic_stream_handle/basic_stream_handle/overload4.html /doc/asio/reference/windows__basic_stream_handle/basic_stream_handle/overload5.html +/doc/asio/reference/windows__basic_stream_handle/basic_stream_handle/overload6.html /doc/asio/reference/windows__basic_stream_handle/cancel/ /doc/asio/reference/windows__basic_stream_handle/cancel.html /doc/asio/reference/windows__basic_stream_handle/cancel/overload1.html @@ -4159,7 +5438,6 @@ /doc/asio/reference/windows__basic_stream_handle/executor_type.html /doc/asio/reference/windows__basic_stream_handle/get_executor.html /doc/asio/reference/windows__basic_stream_handle.html -/doc/asio/reference/windows__basic_stream_handle/impl_.html /doc/asio/reference/windows__basic_stream_handle/is_open.html /doc/asio/reference/windows__basic_stream_handle/lowest_layer/ /doc/asio/reference/windows__basic_stream_handle/lowest_layer.html @@ -4168,7 +5446,10 @@ /doc/asio/reference/windows__basic_stream_handle/lowest_layer_type.html /doc/asio/reference/windows__basic_stream_handle/native_handle.html /doc/asio/reference/windows__basic_stream_handle/native_handle_type.html +/doc/asio/reference/windows__basic_stream_handle/operator_eq_/ /doc/asio/reference/windows__basic_stream_handle/operator_eq_.html +/doc/asio/reference/windows__basic_stream_handle/operator_eq_/overload1.html +/doc/asio/reference/windows__basic_stream_handle/operator_eq_/overload2.html /doc/asio/reference/windows__basic_stream_handle/read_some/ /doc/asio/reference/windows__basic_stream_handle/read_some.html /doc/asio/reference/windows__basic_stream_handle/read_some/overload1.html @@ -4176,6 +5457,10 @@ /doc/asio/reference/windows__basic_stream_handle__rebind_executor/ /doc/asio/reference/windows__basic_stream_handle__rebind_executor.html /doc/asio/reference/windows__basic_stream_handle__rebind_executor/other.html +/doc/asio/reference/windows__basic_stream_handle/release/ +/doc/asio/reference/windows__basic_stream_handle/release.html +/doc/asio/reference/windows__basic_stream_handle/release/overload1.html +/doc/asio/reference/windows__basic_stream_handle/release/overload2.html /doc/asio/reference/windows__basic_stream_handle/write_some/ /doc/asio/reference/windows__basic_stream_handle/write_some.html /doc/asio/reference/windows__basic_stream_handle/write_some/overload1.html @@ -4203,6 +5488,7 @@ /doc/asio/reference/windows__overlapped_ptr/reset/overload3.html /doc/asio/reference/windows__random_access_handle.html /doc/asio/reference/windows__stream_handle.html +/doc/asio/reference/writable_pipe.html /doc/asio/reference/write/ /doc/asio/reference/write_at/ /doc/asio/reference/write_at.html @@ -4232,7 +5518,9 @@ /doc/asio/reference/write/overload7.html /doc/asio/reference/write/overload8.html /doc/asio/reference/write/overload9.html +/doc/asio/reference/WriteToken.html /doc/asio/reference/yield_context.html +/doc/asio/std_executors.html /doc/asio/tutorial/ /doc/asio/tutorial/boost_bind.html /doc/asio/tutorial.html @@ -4273,11 +5561,20 @@ /doc/asio/tutorial/tuttimer5.html /doc/asio/tutorial/tuttimer5/src.html /doc/asio/using.html +/doc/async_agent_chain.png +/doc/async_agent_model.png +/doc/async_child_agent_chain.png /doc/async_op1.png /doc/async_op2.png +/doc/async_op_init_complete.png +/doc/async_op_model.png +/doc/async_op_phases.png +/doc/async_op_trivial_chain.png /doc/blank.png /doc/boostbook.css /doc/caution.png +/doc/completion_token_model.png +/doc/completion_token_transform.png /doc/draft.png /doc/examples/ /doc/examples/diffs/ @@ -4289,6 +5586,9 @@ /doc/examples/diffs/chat/chat_client.cpp.html /doc/examples/diffs/chat/chat_message.hpp.html /doc/examples/diffs/chat/chat_server.cpp.html +/doc/examples/diffs/deferred/ +/doc/examples/diffs/deferred/deferred_1.cpp.html +/doc/examples/diffs/deferred/deferred_2.cpp.html /doc/examples/diffs/echo/ /doc/examples/diffs/echo/async_tcp_echo_server.cpp.html /doc/examples/diffs/echo/async_udp_echo_server.cpp.html @@ -4303,6 +5603,9 @@ /doc/examples/diffs/executors/fork_join.cpp.html /doc/examples/diffs/executors/pipeline.cpp.html /doc/examples/diffs/executors/priority_scheduler.cpp.html +/doc/examples/diffs/files/ +/doc/examples/diffs/files/async_file_copy.cpp.html +/doc/examples/diffs/files/blocking_file_copy.cpp.html /doc/examples/diffs/fork/ /doc/examples/diffs/fork/daemon.cpp.html /doc/examples/diffs/fork/process_per_connection.cpp.html @@ -4336,6 +5639,8 @@ /doc/examples/diffs/iostreams/http_client.cpp.html /doc/examples/diffs/local/ /doc/examples/diffs/local/connect_pair.cpp.html +/doc/examples/diffs/local/fd_passing_stream_client.cpp.html +/doc/examples/diffs/local/fd_passing_stream_server.cpp.html /doc/examples/diffs/local/iostream_client.cpp.html /doc/examples/diffs/local/stream_client.cpp.html /doc/examples/diffs/local/stream_server.cpp.html @@ -4353,6 +5658,12 @@ /doc/examples/diffs/operations/composed_6.cpp.html /doc/examples/diffs/operations/composed_7.cpp.html /doc/examples/diffs/operations/composed_8.cpp.html +/doc/examples/diffs/parallel_group/ +/doc/examples/diffs/parallel_group/ranged_wait_for_all.cpp.html +/doc/examples/diffs/parallel_group/wait_for_all.cpp.html +/doc/examples/diffs/parallel_group/wait_for_one.cpp.html +/doc/examples/diffs/parallel_group/wait_for_one_error.cpp.html +/doc/examples/diffs/parallel_group/wait_for_one_success.cpp.html /doc/examples/diffs/socks4/ /doc/examples/diffs/socks4/socks4.hpp.html /doc/examples/diffs/socks4/sync_client.cpp.html @@ -4370,6 +5681,14 @@ /doc/examples/diffs/timeouts/server.cpp.html /doc/examples/diffs/timers/ /doc/examples/diffs/timers/time_t_timer.cpp.html +/doc/examples/diffs/type_erasure/ +/doc/examples/diffs/type_erasure/line_reader.hpp.html +/doc/examples/diffs/type_erasure/main.cpp.html +/doc/examples/diffs/type_erasure/sleep.cpp.html +/doc/examples/diffs/type_erasure/sleep.hpp.html +/doc/examples/diffs/type_erasure/stdin_line_reader.cpp.html +/doc/examples/diffs/type_erasure/stdin_line_reader.hpp.html +/doc/higher_level_model.png /doc/home.png /doc/important.png /doc/index.html @@ -4379,7 +5698,6 @@ /doc/prev_disabled.png /doc/prev.png /doc/proactor.png -/doc/standalone_HTML.manifest /doc/sync_op.png /doc/tip.png /doc/up_disabled.png @@ -4387,15 +5705,25 @@ /doc/warning.png /include/ /include/asio/ +/include/asio/any_completion_executor.hpp +/include/asio/any_completion_handler.hpp /include/asio/any_io_executor.hpp +/include/asio/append.hpp /include/asio/associated_allocator.hpp +/include/asio/associated_cancellation_slot.hpp /include/asio/associated_executor.hpp +/include/asio/associated_immediate_executor.hpp +/include/asio/associator.hpp +/include/asio/as_tuple.hpp /include/asio/async_result.hpp /include/asio/awaitable.hpp /include/asio/basic_datagram_socket.hpp /include/asio/basic_deadline_timer.hpp +/include/asio/basic_file.hpp /include/asio/basic_io_object.hpp +/include/asio/basic_random_access_file.hpp /include/asio/basic_raw_socket.hpp +/include/asio/basic_readable_pipe.hpp /include/asio/basic_seq_packet_socket.hpp /include/asio/basic_serial_port.hpp /include/asio/basic_signal_set.hpp @@ -4405,9 +5733,14 @@ /include/asio/basic_socket_streambuf.hpp /include/asio/basic_streambuf_fwd.hpp /include/asio/basic_streambuf.hpp +/include/asio/basic_stream_file.hpp /include/asio/basic_stream_socket.hpp /include/asio/basic_waitable_timer.hpp +/include/asio/basic_writable_pipe.hpp +/include/asio/bind_allocator.hpp +/include/asio/bind_cancellation_slot.hpp /include/asio/bind_executor.hpp +/include/asio/bind_immediate_executor.hpp /include/asio/buffered_read_stream_fwd.hpp /include/asio/buffered_read_stream.hpp /include/asio/buffered_stream_fwd.hpp @@ -4415,20 +5748,28 @@ /include/asio/buffered_write_stream_fwd.hpp /include/asio/buffered_write_stream.hpp /include/asio/buffer.hpp +/include/asio/buffer_registration.hpp /include/asio/buffers_iterator.hpp +/include/asio/cancellation_signal.hpp +/include/asio/cancellation_state.hpp +/include/asio/cancellation_type.hpp /include/asio/completion_condition.hpp /include/asio/compose.hpp /include/asio/connect.hpp +/include/asio/connect_pipe.hpp +/include/asio/consign.hpp /include/asio/coroutine.hpp /include/asio/co_spawn.hpp /include/asio/deadline_timer.hpp /include/asio/defer.hpp +/include/asio/deferred.hpp /include/asio/detached.hpp /include/asio/detail/ /include/asio/detail/array_fwd.hpp /include/asio/detail/array.hpp /include/asio/detail/assert.hpp /include/asio/detail/atomic_count.hpp +/include/asio/detail/base_from_cancellation_state.hpp /include/asio/detail/base_from_completion_cond.hpp /include/asio/detail/bind_handler.hpp /include/asio/detail/blocking_executor_op.hpp @@ -4440,6 +5781,7 @@ /include/asio/detail/chrono.hpp /include/asio/detail/chrono_time_traits.hpp /include/asio/detail/completion_handler.hpp +/include/asio/detail/composed_work.hpp /include/asio/detail/concurrency_hint.hpp /include/asio/detail/conditionally_enabled_event.hpp /include/asio/detail/conditionally_enabled_mutex.hpp @@ -4457,6 +5799,7 @@ /include/asio/detail/epoll_reactor.hpp /include/asio/detail/eventfd_select_interrupter.hpp /include/asio/detail/event.hpp +/include/asio/detail/exception.hpp /include/asio/detail/executor_function.hpp /include/asio/detail/executor_op.hpp /include/asio/detail/fd_set_adapter.hpp @@ -4484,16 +5827,21 @@ /include/asio/detail/impl/epoll_reactor.ipp /include/asio/detail/impl/eventfd_select_interrupter.ipp /include/asio/detail/impl/handler_tracking.ipp +/include/asio/detail/impl/io_uring_descriptor_service.ipp +/include/asio/detail/impl/io_uring_file_service.ipp +/include/asio/detail/impl/io_uring_service.hpp +/include/asio/detail/impl/io_uring_service.ipp +/include/asio/detail/impl/io_uring_socket_service_base.ipp /include/asio/detail/impl/kqueue_reactor.hpp /include/asio/detail/impl/kqueue_reactor.ipp /include/asio/detail/impl/null_event.ipp /include/asio/detail/impl/pipe_select_interrupter.ipp /include/asio/detail/impl/posix_event.ipp /include/asio/detail/impl/posix_mutex.ipp +/include/asio/detail/impl/posix_serial_port_service.ipp /include/asio/detail/impl/posix_thread.ipp /include/asio/detail/impl/posix_tss_ptr.ipp /include/asio/detail/impl/reactive_descriptor_service.ipp -/include/asio/detail/impl/reactive_serial_port_service.ipp /include/asio/detail/impl/reactive_socket_service_base.ipp /include/asio/detail/impl/resolver_service_base.ipp /include/asio/detail/impl/scheduler.ipp @@ -4508,10 +5856,12 @@ /include/asio/detail/impl/strand_executor_service.ipp /include/asio/detail/impl/strand_service.hpp /include/asio/detail/impl/strand_service.ipp +/include/asio/detail/impl/thread_context.ipp /include/asio/detail/impl/throw_error.ipp /include/asio/detail/impl/timer_queue_ptime.ipp /include/asio/detail/impl/timer_queue_set.ipp /include/asio/detail/impl/win_event.ipp +/include/asio/detail/impl/win_iocp_file_service.ipp /include/asio/detail/impl/win_iocp_handle_service.ipp /include/asio/detail/impl/win_iocp_io_context.hpp /include/asio/detail/impl/win_iocp_io_context.ipp @@ -4526,8 +5876,30 @@ /include/asio/detail/impl/win_static_mutex.ipp /include/asio/detail/impl/win_thread.ipp /include/asio/detail/impl/win_tss_ptr.ipp +/include/asio/detail/initiate_defer.hpp +/include/asio/detail/initiate_dispatch.hpp +/include/asio/detail/initiate_post.hpp /include/asio/detail/io_control.hpp /include/asio/detail/io_object_impl.hpp +/include/asio/detail/io_uring_descriptor_read_at_op.hpp +/include/asio/detail/io_uring_descriptor_read_op.hpp +/include/asio/detail/io_uring_descriptor_service.hpp +/include/asio/detail/io_uring_descriptor_write_at_op.hpp +/include/asio/detail/io_uring_descriptor_write_op.hpp +/include/asio/detail/io_uring_file_service.hpp +/include/asio/detail/io_uring_null_buffers_op.hpp +/include/asio/detail/io_uring_operation.hpp +/include/asio/detail/io_uring_service.hpp +/include/asio/detail/io_uring_socket_accept_op.hpp +/include/asio/detail/io_uring_socket_connect_op.hpp +/include/asio/detail/io_uring_socket_recvfrom_op.hpp +/include/asio/detail/io_uring_socket_recvmsg_op.hpp +/include/asio/detail/io_uring_socket_recv_op.hpp +/include/asio/detail/io_uring_socket_send_op.hpp +/include/asio/detail/io_uring_socket_sendto_op.hpp +/include/asio/detail/io_uring_socket_service_base.hpp +/include/asio/detail/io_uring_socket_service.hpp +/include/asio/detail/io_uring_wait_op.hpp /include/asio/detail/is_buffer_sequence.hpp /include/asio/detail/is_executor.hpp /include/asio/detail/keyword_tss_ptr.hpp @@ -4559,6 +5931,7 @@ /include/asio/detail/posix_fd_set_adapter.hpp /include/asio/detail/posix_global.hpp /include/asio/detail/posix_mutex.hpp +/include/asio/detail/posix_serial_port_service.hpp /include/asio/detail/posix_signal_blocker.hpp /include/asio/detail/posix_static_mutex.hpp /include/asio/detail/posix_thread.hpp @@ -4566,7 +5939,6 @@ /include/asio/detail/push_options.hpp /include/asio/detail/reactive_descriptor_service.hpp /include/asio/detail/reactive_null_buffers_op.hpp -/include/asio/detail/reactive_serial_port_service.hpp /include/asio/detail/reactive_socket_accept_op.hpp /include/asio/detail/reactive_socket_connect_op.hpp /include/asio/detail/reactive_socket_recvfrom_op.hpp @@ -4577,7 +5949,6 @@ /include/asio/detail/reactive_socket_service_base.hpp /include/asio/detail/reactive_socket_service.hpp /include/asio/detail/reactive_wait_op.hpp -/include/asio/detail/reactor_fwd.hpp /include/asio/detail/reactor.hpp /include/asio/detail/reactor_op.hpp /include/asio/detail/reactor_op_queue.hpp @@ -4590,6 +5961,7 @@ /include/asio/detail/resolver_service.hpp /include/asio/detail/scheduler.hpp /include/asio/detail/scheduler_operation.hpp +/include/asio/detail/scheduler_task.hpp /include/asio/detail/scheduler_thread_info.hpp /include/asio/detail/scoped_lock.hpp /include/asio/detail/scoped_ptr.hpp @@ -4632,6 +6004,7 @@ /include/asio/detail/timer_scheduler.hpp /include/asio/detail/tss_ptr.hpp /include/asio/detail/type_traits.hpp +/include/asio/detail/utility.hpp /include/asio/detail/variadic_templates.hpp /include/asio/detail/wait_handler.hpp /include/asio/detail/wait_op.hpp @@ -4641,6 +6014,7 @@ /include/asio/detail/win_fd_set_adapter.hpp /include/asio/detail/win_fenced_block.hpp /include/asio/detail/win_global.hpp +/include/asio/detail/win_iocp_file_service.hpp /include/asio/detail/win_iocp_handle_read_op.hpp /include/asio/detail/win_iocp_handle_service.hpp /include/asio/detail/win_iocp_handle_write_op.hpp @@ -4726,6 +6100,53 @@ /include/asio/execution/submit.hpp /include/asio/executor.hpp /include/asio/executor_work_guard.hpp +/include/asio/experimental/ +/include/asio/experimental/append.hpp +/include/asio/experimental/as_single.hpp +/include/asio/experimental/as_tuple.hpp +/include/asio/experimental/awaitable_operators.hpp +/include/asio/experimental/basic_channel.hpp +/include/asio/experimental/basic_concurrent_channel.hpp +/include/asio/experimental/cancellation_condition.hpp +/include/asio/experimental/channel_error.hpp +/include/asio/experimental/channel.hpp +/include/asio/experimental/channel_traits.hpp +/include/asio/experimental/co_composed.hpp +/include/asio/experimental/concurrent_channel.hpp +/include/asio/experimental/coro.hpp +/include/asio/experimental/coro_traits.hpp +/include/asio/experimental/co_spawn.hpp +/include/asio/experimental/deferred.hpp +/include/asio/experimental/detail/ +/include/asio/experimental/detail/channel_handler.hpp +/include/asio/experimental/detail/channel_message.hpp +/include/asio/experimental/detail/channel_operation.hpp +/include/asio/experimental/detail/channel_payload.hpp +/include/asio/experimental/detail/channel_receive_op.hpp +/include/asio/experimental/detail/channel_send_functions.hpp +/include/asio/experimental/detail/channel_send_op.hpp +/include/asio/experimental/detail/channel_service.hpp +/include/asio/experimental/detail/coro_completion_handler.hpp +/include/asio/experimental/detail/coro_promise_allocator.hpp +/include/asio/experimental/detail/has_signature.hpp +/include/asio/experimental/detail/impl/ +/include/asio/experimental/detail/impl/channel_service.hpp +/include/asio/experimental/detail/partial_promise.hpp +/include/asio/experimental/impl/ +/include/asio/experimental/impl/as_single.hpp +/include/asio/experimental/impl/channel_error.ipp +/include/asio/experimental/impl/co_composed.hpp +/include/asio/experimental/impl/coro.hpp +/include/asio/experimental/impl/parallel_group.hpp +/include/asio/experimental/impl/promise.hpp +/include/asio/experimental/impl/use_coro.hpp +/include/asio/experimental/impl/use_promise.hpp +/include/asio/experimental/parallel_group.hpp +/include/asio/experimental/prepend.hpp +/include/asio/experimental/promise.hpp +/include/asio/experimental/use_coro.hpp +/include/asio/experimental/use_promise.hpp +/include/asio/file_base.hpp /include/asio/generic/ /include/asio/generic/basic_endpoint.hpp /include/asio/generic/datagram_protocol.hpp @@ -4742,15 +6163,21 @@ /include/asio/high_resolution_timer.hpp /include/asio.hpp /include/asio/impl/ +/include/asio/impl/any_completion_executor.ipp +/include/asio/impl/any_io_executor.ipp +/include/asio/impl/append.hpp +/include/asio/impl/as_tuple.hpp /include/asio/impl/awaitable.hpp /include/asio/impl/buffered_read_stream.hpp /include/asio/impl/buffered_write_stream.hpp -/include/asio/impl/compose.hpp +/include/asio/impl/cancellation_signal.ipp /include/asio/impl/connect.hpp +/include/asio/impl/connect_pipe.hpp +/include/asio/impl/connect_pipe.ipp +/include/asio/impl/consign.hpp /include/asio/impl/co_spawn.hpp -/include/asio/impl/defer.hpp +/include/asio/impl/deferred.hpp /include/asio/impl/detached.hpp -/include/asio/impl/dispatch.hpp /include/asio/impl/error_code.ipp /include/asio/impl/error.ipp /include/asio/impl/execution_context.hpp @@ -4761,7 +6188,7 @@ /include/asio/impl/io_context.hpp /include/asio/impl/io_context.ipp /include/asio/impl/multiple_exceptions.ipp -/include/asio/impl/post.hpp +/include/asio/impl/prepend.hpp /include/asio/impl/read_at.hpp /include/asio/impl/read.hpp /include/asio/impl/read_until.hpp @@ -4769,7 +6196,6 @@ /include/asio/impl/serial_port_base.hpp /include/asio/impl/serial_port_base.ipp /include/asio/impl/spawn.hpp -/include/asio/impl/src.cpp /include/asio/impl/src.hpp /include/asio/impl/system_context.hpp /include/asio/impl/system_context.ipp @@ -4829,6 +6255,7 @@ /include/asio/ip/unicast.hpp /include/asio/ip/v6_only.hpp /include/asio/is_applicable_property.hpp +/include/asio/is_contiguous_iterator.hpp /include/asio/is_executor.hpp /include/asio/is_read_buffered.hpp /include/asio/is_write_buffered.hpp @@ -4840,6 +6267,7 @@ /include/asio/local/detail/endpoint.hpp /include/asio/local/detail/impl/ /include/asio/local/detail/impl/endpoint.ipp +/include/asio/local/seq_packet_protocol.hpp /include/asio/local/stream_protocol.hpp /include/asio/multiple_exceptions.hpp /include/asio/packaged_task.hpp @@ -4852,15 +6280,21 @@ /include/asio/posix/stream_descriptor.hpp /include/asio/post.hpp /include/asio/prefer.hpp +/include/asio/prepend.hpp /include/asio/query.hpp +/include/asio/random_access_file.hpp +/include/asio/readable_pipe.hpp /include/asio/read_at.hpp /include/asio/read.hpp /include/asio/read_until.hpp +/include/asio/recycling_allocator.hpp /include/asio/redirect_error.hpp +/include/asio/registered_buffer.hpp /include/asio/require_concept.hpp /include/asio/require.hpp /include/asio/serial_port_base.hpp /include/asio/serial_port.hpp +/include/asio/signal_set_base.hpp /include/asio/signal_set.hpp /include/asio/socket_base.hpp /include/asio/spawn.hpp @@ -4902,6 +6336,7 @@ /include/asio/steady_timer.hpp /include/asio/strand.hpp /include/asio/streambuf.hpp +/include/asio/stream_file.hpp /include/asio/system_context.hpp /include/asio/system_error.hpp /include/asio/system_executor.hpp @@ -4967,6 +6402,7 @@ /include/asio/windows/overlapped_ptr.hpp /include/asio/windows/random_access_handle.hpp /include/asio/windows/stream_handle.hpp +/include/asio/writable_pipe.hpp /include/asio/write_at.hpp /include/asio/write.hpp /include/asio/yield.hpp @@ -5119,7 +6555,7 @@ /src/examples/cpp03/ssl/ /src/examples/cpp03/ssl/ca.pem /src/examples/cpp03/ssl/client.cpp -/src/examples/cpp03/ssl/dh2048.pem +/src/examples/cpp03/ssl/dh4096.pem /src/examples/cpp03/ssl/README /src/examples/cpp03/ssl/server.cpp /src/examples/cpp03/ssl/server.pem @@ -5167,6 +6603,9 @@ /src/examples/cpp11/chat/chat_client.cpp /src/examples/cpp11/chat/chat_message.hpp /src/examples/cpp11/chat/chat_server.cpp +/src/examples/cpp11/deferred/ +/src/examples/cpp11/deferred/deferred_1.cpp +/src/examples/cpp11/deferred/deferred_2.cpp /src/examples/cpp11/echo/ /src/examples/cpp11/echo/async_tcp_echo_server.cpp /src/examples/cpp11/echo/async_udp_echo_server.cpp @@ -5181,6 +6620,9 @@ /src/examples/cpp11/executors/fork_join.cpp /src/examples/cpp11/executors/pipeline.cpp /src/examples/cpp11/executors/priority_scheduler.cpp +/src/examples/cpp11/files/ +/src/examples/cpp11/files/async_file_copy.cpp +/src/examples/cpp11/files/blocking_file_copy.cpp /src/examples/cpp11/fork/ /src/examples/cpp11/fork/daemon.cpp /src/examples/cpp11/fork/process_per_connection.cpp @@ -5214,6 +6656,8 @@ /src/examples/cpp11/iostreams/http_client.cpp /src/examples/cpp11/local/ /src/examples/cpp11/local/connect_pair.cpp +/src/examples/cpp11/local/fd_passing_stream_client.cpp +/src/examples/cpp11/local/fd_passing_stream_server.cpp /src/examples/cpp11/local/iostream_client.cpp /src/examples/cpp11/local/stream_client.cpp /src/examples/cpp11/local/stream_server.cpp @@ -5233,6 +6677,12 @@ /src/examples/cpp11/operations/composed_6.cpp /src/examples/cpp11/operations/composed_7.cpp /src/examples/cpp11/operations/composed_8.cpp +/src/examples/cpp11/parallel_group/ +/src/examples/cpp11/parallel_group/ranged_wait_for_all.cpp +/src/examples/cpp11/parallel_group/wait_for_all.cpp +/src/examples/cpp11/parallel_group/wait_for_one.cpp +/src/examples/cpp11/parallel_group/wait_for_one_error.cpp +/src/examples/cpp11/parallel_group/wait_for_one_success.cpp /src/examples/cpp11/socks4/ /src/examples/cpp11/socks4/socks4.hpp /src/examples/cpp11/socks4/sync_client.cpp @@ -5240,8 +6690,12 @@ /src/examples/cpp11/spawn/echo_server.cpp /src/examples/cpp11/spawn/parallel_grep.cpp /src/examples/cpp11/ssl/ +/src/examples/cpp11/ssl/ca.pem /src/examples/cpp11/ssl/client.cpp +/src/examples/cpp11/ssl/dh4096.pem +/src/examples/cpp11/ssl/README /src/examples/cpp11/ssl/server.cpp +/src/examples/cpp11/ssl/server.pem /src/examples/cpp11/timeouts/ /src/examples/cpp11/timeouts/async_tcp_client.cpp /src/examples/cpp11/timeouts/blocking_tcp_client.cpp @@ -5250,7 +6704,22 @@ /src/examples/cpp11/timeouts/server.cpp /src/examples/cpp11/timers/ /src/examples/cpp11/timers/time_t_timer.cpp +/src/examples/cpp11/type_erasure/ +/src/examples/cpp11/type_erasure/line_reader.hpp +/src/examples/cpp11/type_erasure/main.cpp +/src/examples/cpp11/type_erasure/sleep.cpp +/src/examples/cpp11/type_erasure/sleep.hpp +/src/examples/cpp11/type_erasure/stdin_line_reader.cpp +/src/examples/cpp11/type_erasure/stdin_line_reader.hpp /src/examples/cpp14/ +/src/examples/cpp14/deferred/ +/src/examples/cpp14/deferred/deferred_1.cpp +/src/examples/cpp14/deferred/deferred_2.cpp +/src/examples/cpp14/deferred/deferred_3.cpp +/src/examples/cpp14/deferred/deferred_4.cpp +/src/examples/cpp14/deferred/deferred_5.cpp +/src/examples/cpp14/deferred/deferred_6.cpp +/src/examples/cpp14/deferred/deferred_7.cpp /src/examples/cpp14/echo/ /src/examples/cpp14/echo/async_tcp_echo_server.cpp /src/examples/cpp14/echo/async_udp_echo_server.cpp @@ -5272,6 +6741,8 @@ /src/examples/cpp14/Makefile.am /src/examples/cpp14/Makefile.in /src/examples/cpp14/operations/ +/src/examples/cpp14/operations/callback_wrapper.cpp +/src/examples/cpp14/operations/c_callback_wrapper.cpp /src/examples/cpp14/operations/composed_1.cpp /src/examples/cpp14/operations/composed_2.cpp /src/examples/cpp14/operations/composed_3.cpp @@ -5280,15 +6751,57 @@ /src/examples/cpp14/operations/composed_6.cpp /src/examples/cpp14/operations/composed_7.cpp /src/examples/cpp14/operations/composed_8.cpp +/src/examples/cpp14/parallel_group/ +/src/examples/cpp14/parallel_group/parallel_sort.cpp +/src/examples/cpp14/parallel_group/ranged_wait_for_all.cpp +/src/examples/cpp14/parallel_group/wait_for_all.cpp +/src/examples/cpp14/parallel_group/wait_for_one.cpp +/src/examples/cpp14/parallel_group/wait_for_one_error.cpp +/src/examples/cpp14/parallel_group/wait_for_one_success.cpp /src/examples/cpp17/ /src/examples/cpp17/coroutines_ts/ /src/examples/cpp17/coroutines_ts/chat_server.cpp /src/examples/cpp17/coroutines_ts/echo_server.cpp +/src/examples/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp +/src/examples/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp /src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp /src/examples/cpp17/coroutines_ts/range_based_for.cpp /src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp /src/examples/cpp17/Makefile.am /src/examples/cpp17/Makefile.in +/src/examples/cpp20/ +/src/examples/cpp20/channels/ +/src/examples/cpp20/channels/throttling_proxy.cpp +/src/examples/cpp20/coroutines/ +/src/examples/cpp20/coroutines/chat_server.cpp +/src/examples/cpp20/coroutines/echo_server.cpp +/src/examples/cpp20/coroutines/echo_server_with_as_single_default.cpp +/src/examples/cpp20/coroutines/echo_server_with_as_tuple_default.cpp +/src/examples/cpp20/coroutines/echo_server_with_default.cpp +/src/examples/cpp20/coroutines/echo_server_with_deferred.cpp +/src/examples/cpp20/coroutines/echo_server_with_deferred_default.cpp +/src/examples/cpp20/coroutines/refactored_echo_server.cpp +/src/examples/cpp20/coroutines/timeout.cpp +/src/examples/cpp20/Makefile.am +/src/examples/cpp20/Makefile.in +/src/examples/cpp20/operations/ +/src/examples/cpp20/operations/callback_wrapper.cpp +/src/examples/cpp20/operations/c_callback_wrapper.cpp +/src/examples/cpp20/operations/composed_1.cpp +/src/examples/cpp20/operations/composed_2.cpp +/src/examples/cpp20/operations/composed_3.cpp +/src/examples/cpp20/operations/composed_4.cpp +/src/examples/cpp20/operations/composed_5.cpp +/src/examples/cpp20/operations/composed_6.cpp +/src/examples/cpp20/operations/composed_7.cpp +/src/examples/cpp20/operations/composed_8.cpp +/src/examples/cpp20/type_erasure/ +/src/examples/cpp20/type_erasure/line_reader.hpp +/src/examples/cpp20/type_erasure/main.cpp +/src/examples/cpp20/type_erasure/sleep.cpp +/src/examples/cpp20/type_erasure/sleep.hpp +/src/examples/cpp20/type_erasure/stdin_line_reader.cpp +/src/examples/cpp20/type_erasure/stdin_line_reader.hpp /src/Makefile.am /src/Makefile.in /src/Makefile.mgw @@ -5485,6 +6998,7 @@ /src/tests/properties/Makefile.am /src/tests/properties/Makefile.in /src/tests/unit/ +/src/tests/unit/append.cpp /src/tests/unit/archetypes/ /src/tests/unit/archetypes/async_ops.hpp /src/tests/unit/archetypes/async_result.hpp @@ -5492,33 +7006,52 @@ /src/tests/unit/archetypes/io_control_command.hpp /src/tests/unit/archetypes/settable_socket_option.hpp /src/tests/unit/associated_allocator.cpp +/src/tests/unit/associated_cancellation_slot.cpp /src/tests/unit/associated_executor.cpp +/src/tests/unit/associated_immediate_executor.cpp +/src/tests/unit/associator.cpp +/src/tests/unit/as_tuple.cpp /src/tests/unit/async_result.cpp /src/tests/unit/awaitable.cpp /src/tests/unit/basic_datagram_socket.cpp /src/tests/unit/basic_deadline_timer.cpp +/src/tests/unit/basic_file.cpp +/src/tests/unit/basic_random_access_file.cpp /src/tests/unit/basic_raw_socket.cpp +/src/tests/unit/basic_readable_pipe.cpp /src/tests/unit/basic_seq_packet_socket.cpp /src/tests/unit/basic_serial_port.cpp /src/tests/unit/basic_signal_set.cpp /src/tests/unit/basic_socket_acceptor.cpp /src/tests/unit/basic_socket.cpp /src/tests/unit/basic_streambuf.cpp +/src/tests/unit/basic_stream_file.cpp /src/tests/unit/basic_stream_socket.cpp /src/tests/unit/basic_waitable_timer.cpp +/src/tests/unit/basic_writable_pipe.cpp +/src/tests/unit/bind_allocator.cpp +/src/tests/unit/bind_cancellation_slot.cpp /src/tests/unit/bind_executor.cpp +/src/tests/unit/bind_immediate_executor.cpp /src/tests/unit/buffer.cpp /src/tests/unit/buffered_read_stream.cpp /src/tests/unit/buffered_stream.cpp /src/tests/unit/buffered_write_stream.cpp +/src/tests/unit/buffer_registration.cpp /src/tests/unit/buffers_iterator.cpp +/src/tests/unit/cancellation_signal.cpp +/src/tests/unit/cancellation_state.cpp +/src/tests/unit/cancellation_type.cpp /src/tests/unit/completion_condition.cpp /src/tests/unit/compose.cpp /src/tests/unit/connect.cpp +/src/tests/unit/connect_pipe.cpp +/src/tests/unit/consign.cpp /src/tests/unit/coroutine.cpp /src/tests/unit/co_spawn.cpp /src/tests/unit/deadline_timer.cpp /src/tests/unit/defer.cpp +/src/tests/unit/deferred.cpp /src/tests/unit/detached.cpp /src/tests/unit/dispatch.cpp /src/tests/unit/error.cpp @@ -5550,6 +7083,26 @@ /src/tests/unit/execution/submit.cpp /src/tests/unit/executor.cpp /src/tests/unit/executor_work_guard.cpp +/src/tests/unit/experimental/ +/src/tests/unit/experimental/awaitable_operators.cpp +/src/tests/unit/experimental/basic_channel.cpp +/src/tests/unit/experimental/basic_concurrent_channel.cpp +/src/tests/unit/experimental/channel.cpp +/src/tests/unit/experimental/channel_traits.cpp +/src/tests/unit/experimental/co_composed.cpp +/src/tests/unit/experimental/concurrent_channel.cpp +/src/tests/unit/experimental/coro/ +/src/tests/unit/experimental/coro/allocator.cpp +/src/tests/unit/experimental/coro/cancel.cpp +/src/tests/unit/experimental/coro/co_spawn.cpp +/src/tests/unit/experimental/coro/exception.cpp +/src/tests/unit/experimental/coro/executor.cpp +/src/tests/unit/experimental/coro/partial.cpp +/src/tests/unit/experimental/coro/simple_test.cpp +/src/tests/unit/experimental/coro/stack_test.cpp +/src/tests/unit/experimental/coro/use_coro.cpp +/src/tests/unit/experimental/promise.cpp +/src/tests/unit/file_base.cpp /src/tests/unit/generic/ /src/tests/unit/generic/basic_endpoint.cpp /src/tests/unit/generic/datagram_protocol.cpp @@ -5588,6 +7141,7 @@ /src/tests/unit/local/basic_endpoint.cpp /src/tests/unit/local/connect_pair.cpp /src/tests/unit/local/datagram_protocol.cpp +/src/tests/unit/local/seq_packet_protocol.cpp /src/tests/unit/local/stream_protocol.cpp /src/tests/unit/packaged_task.cpp /src/tests/unit/placeholders.cpp @@ -5598,12 +7152,18 @@ /src/tests/unit/posix/descriptor.cpp /src/tests/unit/posix/stream_descriptor.cpp /src/tests/unit/post.cpp +/src/tests/unit/prepend.cpp +/src/tests/unit/random_access_file.cpp +/src/tests/unit/readable_pipe.cpp /src/tests/unit/read_at.cpp /src/tests/unit/read.cpp /src/tests/unit/read_until.cpp +/src/tests/unit/recycling_allocator.cpp /src/tests/unit/redirect_error.cpp +/src/tests/unit/registered_buffer.cpp /src/tests/unit/serial_port_base.cpp /src/tests/unit/serial_port.cpp +/src/tests/unit/signal_set_base.cpp /src/tests/unit/signal_set.cpp /src/tests/unit/socket_base.cpp /src/tests/unit/ssl/ @@ -5618,6 +7178,7 @@ /src/tests/unit/steady_timer.cpp /src/tests/unit/strand.cpp /src/tests/unit/streambuf.cpp +/src/tests/unit/stream_file.cpp /src/tests/unit/system_context.cpp /src/tests/unit/system_executor.cpp /src/tests/unit/system_timer.cpp @@ -5649,6 +7210,7 @@ /src/tests/unit/windows/overlapped_ptr.cpp /src/tests/unit/windows/random_access_handle.cpp /src/tests/unit/windows/stream_handle.cpp +/src/tests/unit/writable_pipe.cpp /src/tests/unit/write_at.cpp /src/tests/unit/write.cpp /src/tools/ diff --git a/tidal-link/link/modules/asio-standalone/asio/asio.pc.in b/tidal-link/link/modules/asio-standalone/asio/asio.pc.in new file mode 100644 index 000000000..b93eb673d --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/asio.pc.in @@ -0,0 +1,11 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +includedir=@includedir@ + +Name: @PACKAGE_NAME@ +Description: A cross-platform C++ library for network and low-level I/O programming that provides developers with a consistent asynchronous model using a modern C++ approach. +Version: @PACKAGE_VERSION@ +Cflags: -I${includedir} +Lflags: +Requires: +Requires.private: diff --git a/tidal-link/link/modules/asio-standalone/asio/autogen.sh b/tidal-link/link/modules/asio-standalone/asio/autogen.sh old mode 100644 new mode 100755 diff --git a/tidal-link/link/modules/asio-standalone/asio/boost_asio.manifest b/tidal-link/link/modules/asio-standalone/asio/boost_asio.manifest index 9c6c6e2bc..8258b2a8a 100644 --- a/tidal-link/link/modules/asio-standalone/asio/boost_asio.manifest +++ b/tidal-link/link/modules/asio-standalone/asio/boost_asio.manifest @@ -1,15 +1,25 @@ / /boost/ /boost/asio/ +/boost/asio/any_completion_executor.hpp +/boost/asio/any_completion_handler.hpp /boost/asio/any_io_executor.hpp +/boost/asio/append.hpp /boost/asio/associated_allocator.hpp +/boost/asio/associated_cancellation_slot.hpp /boost/asio/associated_executor.hpp +/boost/asio/associated_immediate_executor.hpp +/boost/asio/associator.hpp +/boost/asio/as_tuple.hpp /boost/asio/async_result.hpp /boost/asio/awaitable.hpp /boost/asio/basic_datagram_socket.hpp /boost/asio/basic_deadline_timer.hpp +/boost/asio/basic_file.hpp /boost/asio/basic_io_object.hpp +/boost/asio/basic_random_access_file.hpp /boost/asio/basic_raw_socket.hpp +/boost/asio/basic_readable_pipe.hpp /boost/asio/basic_seq_packet_socket.hpp /boost/asio/basic_serial_port.hpp /boost/asio/basic_signal_set.hpp @@ -19,9 +29,14 @@ /boost/asio/basic_socket_streambuf.hpp /boost/asio/basic_streambuf_fwd.hpp /boost/asio/basic_streambuf.hpp +/boost/asio/basic_stream_file.hpp /boost/asio/basic_stream_socket.hpp /boost/asio/basic_waitable_timer.hpp +/boost/asio/basic_writable_pipe.hpp +/boost/asio/bind_allocator.hpp +/boost/asio/bind_cancellation_slot.hpp /boost/asio/bind_executor.hpp +/boost/asio/bind_immediate_executor.hpp /boost/asio/buffered_read_stream_fwd.hpp /boost/asio/buffered_read_stream.hpp /boost/asio/buffered_stream_fwd.hpp @@ -29,20 +44,28 @@ /boost/asio/buffered_write_stream_fwd.hpp /boost/asio/buffered_write_stream.hpp /boost/asio/buffer.hpp +/boost/asio/buffer_registration.hpp /boost/asio/buffers_iterator.hpp +/boost/asio/cancellation_signal.hpp +/boost/asio/cancellation_state.hpp +/boost/asio/cancellation_type.hpp /boost/asio/completion_condition.hpp /boost/asio/compose.hpp /boost/asio/connect.hpp +/boost/asio/connect_pipe.hpp +/boost/asio/consign.hpp /boost/asio/coroutine.hpp /boost/asio/co_spawn.hpp /boost/asio/deadline_timer.hpp /boost/asio/defer.hpp +/boost/asio/deferred.hpp /boost/asio/detached.hpp /boost/asio/detail/ /boost/asio/detail/array_fwd.hpp /boost/asio/detail/array.hpp /boost/asio/detail/assert.hpp /boost/asio/detail/atomic_count.hpp +/boost/asio/detail/base_from_cancellation_state.hpp /boost/asio/detail/base_from_completion_cond.hpp /boost/asio/detail/bind_handler.hpp /boost/asio/detail/blocking_executor_op.hpp @@ -54,6 +77,7 @@ /boost/asio/detail/chrono.hpp /boost/asio/detail/chrono_time_traits.hpp /boost/asio/detail/completion_handler.hpp +/boost/asio/detail/composed_work.hpp /boost/asio/detail/concurrency_hint.hpp /boost/asio/detail/conditionally_enabled_event.hpp /boost/asio/detail/conditionally_enabled_mutex.hpp @@ -71,6 +95,7 @@ /boost/asio/detail/epoll_reactor.hpp /boost/asio/detail/eventfd_select_interrupter.hpp /boost/asio/detail/event.hpp +/boost/asio/detail/exception.hpp /boost/asio/detail/executor_function.hpp /boost/asio/detail/executor_op.hpp /boost/asio/detail/fd_set_adapter.hpp @@ -98,16 +123,21 @@ /boost/asio/detail/impl/epoll_reactor.ipp /boost/asio/detail/impl/eventfd_select_interrupter.ipp /boost/asio/detail/impl/handler_tracking.ipp +/boost/asio/detail/impl/io_uring_descriptor_service.ipp +/boost/asio/detail/impl/io_uring_file_service.ipp +/boost/asio/detail/impl/io_uring_service.hpp +/boost/asio/detail/impl/io_uring_service.ipp +/boost/asio/detail/impl/io_uring_socket_service_base.ipp /boost/asio/detail/impl/kqueue_reactor.hpp /boost/asio/detail/impl/kqueue_reactor.ipp /boost/asio/detail/impl/null_event.ipp /boost/asio/detail/impl/pipe_select_interrupter.ipp /boost/asio/detail/impl/posix_event.ipp /boost/asio/detail/impl/posix_mutex.ipp +/boost/asio/detail/impl/posix_serial_port_service.ipp /boost/asio/detail/impl/posix_thread.ipp /boost/asio/detail/impl/posix_tss_ptr.ipp /boost/asio/detail/impl/reactive_descriptor_service.ipp -/boost/asio/detail/impl/reactive_serial_port_service.ipp /boost/asio/detail/impl/reactive_socket_service_base.ipp /boost/asio/detail/impl/resolver_service_base.ipp /boost/asio/detail/impl/scheduler.ipp @@ -122,10 +152,12 @@ /boost/asio/detail/impl/strand_executor_service.ipp /boost/asio/detail/impl/strand_service.hpp /boost/asio/detail/impl/strand_service.ipp +/boost/asio/detail/impl/thread_context.ipp /boost/asio/detail/impl/throw_error.ipp /boost/asio/detail/impl/timer_queue_ptime.ipp /boost/asio/detail/impl/timer_queue_set.ipp /boost/asio/detail/impl/win_event.ipp +/boost/asio/detail/impl/win_iocp_file_service.ipp /boost/asio/detail/impl/win_iocp_handle_service.ipp /boost/asio/detail/impl/win_iocp_io_context.hpp /boost/asio/detail/impl/win_iocp_io_context.ipp @@ -140,8 +172,30 @@ /boost/asio/detail/impl/win_static_mutex.ipp /boost/asio/detail/impl/win_thread.ipp /boost/asio/detail/impl/win_tss_ptr.ipp +/boost/asio/detail/initiate_defer.hpp +/boost/asio/detail/initiate_dispatch.hpp +/boost/asio/detail/initiate_post.hpp /boost/asio/detail/io_control.hpp /boost/asio/detail/io_object_impl.hpp +/boost/asio/detail/io_uring_descriptor_read_at_op.hpp +/boost/asio/detail/io_uring_descriptor_read_op.hpp +/boost/asio/detail/io_uring_descriptor_service.hpp +/boost/asio/detail/io_uring_descriptor_write_at_op.hpp +/boost/asio/detail/io_uring_descriptor_write_op.hpp +/boost/asio/detail/io_uring_file_service.hpp +/boost/asio/detail/io_uring_null_buffers_op.hpp +/boost/asio/detail/io_uring_operation.hpp +/boost/asio/detail/io_uring_service.hpp +/boost/asio/detail/io_uring_socket_accept_op.hpp +/boost/asio/detail/io_uring_socket_connect_op.hpp +/boost/asio/detail/io_uring_socket_recvfrom_op.hpp +/boost/asio/detail/io_uring_socket_recvmsg_op.hpp +/boost/asio/detail/io_uring_socket_recv_op.hpp +/boost/asio/detail/io_uring_socket_send_op.hpp +/boost/asio/detail/io_uring_socket_sendto_op.hpp +/boost/asio/detail/io_uring_socket_service_base.hpp +/boost/asio/detail/io_uring_socket_service.hpp +/boost/asio/detail/io_uring_wait_op.hpp /boost/asio/detail/is_buffer_sequence.hpp /boost/asio/detail/is_executor.hpp /boost/asio/detail/keyword_tss_ptr.hpp @@ -173,6 +227,7 @@ /boost/asio/detail/posix_fd_set_adapter.hpp /boost/asio/detail/posix_global.hpp /boost/asio/detail/posix_mutex.hpp +/boost/asio/detail/posix_serial_port_service.hpp /boost/asio/detail/posix_signal_blocker.hpp /boost/asio/detail/posix_static_mutex.hpp /boost/asio/detail/posix_thread.hpp @@ -180,7 +235,6 @@ /boost/asio/detail/push_options.hpp /boost/asio/detail/reactive_descriptor_service.hpp /boost/asio/detail/reactive_null_buffers_op.hpp -/boost/asio/detail/reactive_serial_port_service.hpp /boost/asio/detail/reactive_socket_accept_op.hpp /boost/asio/detail/reactive_socket_connect_op.hpp /boost/asio/detail/reactive_socket_recvfrom_op.hpp @@ -191,7 +245,6 @@ /boost/asio/detail/reactive_socket_service_base.hpp /boost/asio/detail/reactive_socket_service.hpp /boost/asio/detail/reactive_wait_op.hpp -/boost/asio/detail/reactor_fwd.hpp /boost/asio/detail/reactor.hpp /boost/asio/detail/reactor_op.hpp /boost/asio/detail/reactor_op_queue.hpp @@ -204,6 +257,7 @@ /boost/asio/detail/resolver_service.hpp /boost/asio/detail/scheduler.hpp /boost/asio/detail/scheduler_operation.hpp +/boost/asio/detail/scheduler_task.hpp /boost/asio/detail/scheduler_thread_info.hpp /boost/asio/detail/scoped_lock.hpp /boost/asio/detail/scoped_ptr.hpp @@ -246,6 +300,7 @@ /boost/asio/detail/timer_scheduler.hpp /boost/asio/detail/tss_ptr.hpp /boost/asio/detail/type_traits.hpp +/boost/asio/detail/utility.hpp /boost/asio/detail/variadic_templates.hpp /boost/asio/detail/wait_handler.hpp /boost/asio/detail/wait_op.hpp @@ -255,6 +310,7 @@ /boost/asio/detail/win_fd_set_adapter.hpp /boost/asio/detail/win_fenced_block.hpp /boost/asio/detail/win_global.hpp +/boost/asio/detail/win_iocp_file_service.hpp /boost/asio/detail/win_iocp_handle_read_op.hpp /boost/asio/detail/win_iocp_handle_service.hpp /boost/asio/detail/win_iocp_handle_write_op.hpp @@ -339,6 +395,53 @@ /boost/asio/execution/submit.hpp /boost/asio/executor.hpp /boost/asio/executor_work_guard.hpp +/boost/asio/experimental/ +/boost/asio/experimental/append.hpp +/boost/asio/experimental/as_single.hpp +/boost/asio/experimental/as_tuple.hpp +/boost/asio/experimental/awaitable_operators.hpp +/boost/asio/experimental/basic_channel.hpp +/boost/asio/experimental/basic_concurrent_channel.hpp +/boost/asio/experimental/cancellation_condition.hpp +/boost/asio/experimental/channel_error.hpp +/boost/asio/experimental/channel.hpp +/boost/asio/experimental/channel_traits.hpp +/boost/asio/experimental/co_composed.hpp +/boost/asio/experimental/concurrent_channel.hpp +/boost/asio/experimental/coro.hpp +/boost/asio/experimental/coro_traits.hpp +/boost/asio/experimental/co_spawn.hpp +/boost/asio/experimental/deferred.hpp +/boost/asio/experimental/detail/ +/boost/asio/experimental/detail/channel_handler.hpp +/boost/asio/experimental/detail/channel_message.hpp +/boost/asio/experimental/detail/channel_operation.hpp +/boost/asio/experimental/detail/channel_payload.hpp +/boost/asio/experimental/detail/channel_receive_op.hpp +/boost/asio/experimental/detail/channel_send_functions.hpp +/boost/asio/experimental/detail/channel_send_op.hpp +/boost/asio/experimental/detail/channel_service.hpp +/boost/asio/experimental/detail/coro_completion_handler.hpp +/boost/asio/experimental/detail/coro_promise_allocator.hpp +/boost/asio/experimental/detail/has_signature.hpp +/boost/asio/experimental/detail/impl/ +/boost/asio/experimental/detail/impl/channel_service.hpp +/boost/asio/experimental/detail/partial_promise.hpp +/boost/asio/experimental/impl/ +/boost/asio/experimental/impl/as_single.hpp +/boost/asio/experimental/impl/channel_error.ipp +/boost/asio/experimental/impl/co_composed.hpp +/boost/asio/experimental/impl/coro.hpp +/boost/asio/experimental/impl/parallel_group.hpp +/boost/asio/experimental/impl/promise.hpp +/boost/asio/experimental/impl/use_coro.hpp +/boost/asio/experimental/impl/use_promise.hpp +/boost/asio/experimental/parallel_group.hpp +/boost/asio/experimental/prepend.hpp +/boost/asio/experimental/promise.hpp +/boost/asio/experimental/use_coro.hpp +/boost/asio/experimental/use_promise.hpp +/boost/asio/file_base.hpp /boost/asio/generic/ /boost/asio/generic/basic_endpoint.hpp /boost/asio/generic/datagram_protocol.hpp @@ -355,15 +458,21 @@ /boost/asio/high_resolution_timer.hpp /boost/asio.hpp /boost/asio/impl/ +/boost/asio/impl/any_completion_executor.ipp +/boost/asio/impl/any_io_executor.ipp +/boost/asio/impl/append.hpp +/boost/asio/impl/as_tuple.hpp /boost/asio/impl/awaitable.hpp /boost/asio/impl/buffered_read_stream.hpp /boost/asio/impl/buffered_write_stream.hpp -/boost/asio/impl/compose.hpp +/boost/asio/impl/cancellation_signal.ipp /boost/asio/impl/connect.hpp +/boost/asio/impl/connect_pipe.hpp +/boost/asio/impl/connect_pipe.ipp +/boost/asio/impl/consign.hpp /boost/asio/impl/co_spawn.hpp -/boost/asio/impl/defer.hpp +/boost/asio/impl/deferred.hpp /boost/asio/impl/detached.hpp -/boost/asio/impl/dispatch.hpp /boost/asio/impl/error.ipp /boost/asio/impl/execution_context.hpp /boost/asio/impl/execution_context.ipp @@ -373,7 +482,7 @@ /boost/asio/impl/io_context.hpp /boost/asio/impl/io_context.ipp /boost/asio/impl/multiple_exceptions.ipp -/boost/asio/impl/post.hpp +/boost/asio/impl/prepend.hpp /boost/asio/impl/read_at.hpp /boost/asio/impl/read.hpp /boost/asio/impl/read_until.hpp @@ -381,7 +490,6 @@ /boost/asio/impl/serial_port_base.hpp /boost/asio/impl/serial_port_base.ipp /boost/asio/impl/spawn.hpp -/boost/asio/impl/src.cpp /boost/asio/impl/src.hpp /boost/asio/impl/system_context.hpp /boost/asio/impl/system_context.ipp @@ -441,6 +549,7 @@ /boost/asio/ip/unicast.hpp /boost/asio/ip/v6_only.hpp /boost/asio/is_applicable_property.hpp +/boost/asio/is_contiguous_iterator.hpp /boost/asio/is_executor.hpp /boost/asio/is_read_buffered.hpp /boost/asio/is_write_buffered.hpp @@ -452,6 +561,7 @@ /boost/asio/local/detail/endpoint.hpp /boost/asio/local/detail/impl/ /boost/asio/local/detail/impl/endpoint.ipp +/boost/asio/local/seq_packet_protocol.hpp /boost/asio/local/stream_protocol.hpp /boost/asio/multiple_exceptions.hpp /boost/asio/packaged_task.hpp @@ -464,15 +574,21 @@ /boost/asio/posix/stream_descriptor.hpp /boost/asio/post.hpp /boost/asio/prefer.hpp +/boost/asio/prepend.hpp /boost/asio/query.hpp +/boost/asio/random_access_file.hpp +/boost/asio/readable_pipe.hpp /boost/asio/read_at.hpp /boost/asio/read.hpp /boost/asio/read_until.hpp +/boost/asio/recycling_allocator.hpp /boost/asio/redirect_error.hpp +/boost/asio/registered_buffer.hpp /boost/asio/require_concept.hpp /boost/asio/require.hpp /boost/asio/serial_port_base.hpp /boost/asio/serial_port.hpp +/boost/asio/signal_set_base.hpp /boost/asio/signal_set.hpp /boost/asio/socket_base.hpp /boost/asio/spawn.hpp @@ -514,6 +630,7 @@ /boost/asio/steady_timer.hpp /boost/asio/strand.hpp /boost/asio/streambuf.hpp +/boost/asio/stream_file.hpp /boost/asio/system_context.hpp /boost/asio/system_executor.hpp /boost/asio/system_timer.hpp @@ -577,6 +694,7 @@ /boost/asio/windows/overlapped_ptr.hpp /boost/asio/windows/random_access_handle.hpp /boost/asio/windows/stream_handle.hpp +/boost/asio/writable_pipe.hpp /boost/asio/write_at.hpp /boost/asio/write.hpp /boost/asio/yield.hpp @@ -588,20 +706,56 @@ /boost/system/config.hpp /boost/system/cygwin_error.hpp /boost/system/detail/ +/boost/system/detail/append_int.hpp +/boost/system/detail/cerrno.hpp /boost/system/detail/config.hpp +/boost/system/detail/enable_if.hpp +/boost/system/detail/errc.hpp +/boost/system/detail/error_category.hpp +/boost/system/detail/error_category_impl.hpp +/boost/system/detail/error_code.hpp +/boost/system/detail/error_condition.hpp /boost/system/detail/generic_category.hpp -/boost/system/detail/std_interoperability.hpp -/boost/system/detail/system_category_posix.hpp -/boost/system/detail/system_category_win32.hpp +/boost/system/detail/generic_category_message.hpp +/boost/system/detail/interop_category.hpp +/boost/system/detail/is_same.hpp +/boost/system/detail/mutex.hpp +/boost/system/detail/requires_cxx11.hpp +/boost/system/detail/snprintf.hpp +/boost/system/detail/std_category.hpp +/boost/system/detail/std_category_impl.hpp +/boost/system/detail/system_category_condition_win32.hpp +/boost/system/detail/system_category.hpp +/boost/system/detail/system_category_impl.hpp +/boost/system/detail/system_category_message.hpp +/boost/system/detail/system_category_message_win32.hpp +/boost/system/detail/throws.hpp +/boost/system/errc.hpp +/boost/system/error_category.hpp /boost/system/error_code.hpp +/boost/system/error_condition.hpp +/boost/system/generic_category.hpp +/boost/system/is_error_code_enum.hpp +/boost/system/is_error_condition_enum.hpp /boost/system/linux_error.hpp +/boost/system/result.hpp +/boost/system/system_category.hpp /boost/system/system_error.hpp /boost/system/windows_error.hpp /doc/ /doc/html/ /doc/html/boost_asio/ +/doc/html/boost_asio/async_agent_chain.png +/doc/html/boost_asio/async_agent_model.png +/doc/html/boost_asio/async_child_agent_chain.png /doc/html/boost_asio/async_op1.png /doc/html/boost_asio/async_op2.png +/doc/html/boost_asio/async_op_init_complete.png +/doc/html/boost_asio/async_op_model.png +/doc/html/boost_asio/async_op_phases.png +/doc/html/boost_asio/async_op_trivial_chain.png +/doc/html/boost_asio/completion_token_model.png +/doc/html/boost_asio/completion_token_transform.png /doc/html/boost_asio/example/ /doc/html/boost_asio/example/cpp03/ /doc/html/boost_asio/example/cpp03/allocation/ @@ -756,6 +910,9 @@ /doc/html/boost_asio/example/cpp11/chat/chat_client.cpp /doc/html/boost_asio/example/cpp11/chat/chat_message.hpp /doc/html/boost_asio/example/cpp11/chat/chat_server.cpp +/doc/html/boost_asio/example/cpp11/deferred/ +/doc/html/boost_asio/example/cpp11/deferred/deferred_1.cpp +/doc/html/boost_asio/example/cpp11/deferred/deferred_2.cpp /doc/html/boost_asio/example/cpp11/echo/ /doc/html/boost_asio/example/cpp11/echo/async_tcp_echo_server.cpp /doc/html/boost_asio/example/cpp11/echo/async_udp_echo_server.cpp @@ -801,6 +958,8 @@ /doc/html/boost_asio/example/cpp11/invocation/prioritised_handlers.cpp /doc/html/boost_asio/example/cpp11/local/ /doc/html/boost_asio/example/cpp11/local/connect_pair.cpp +/doc/html/boost_asio/example/cpp11/local/fd_passing_stream_client.cpp +/doc/html/boost_asio/example/cpp11/local/fd_passing_stream_server.cpp /doc/html/boost_asio/example/cpp11/local/iostream_client.cpp /doc/html/boost_asio/example/cpp11/local/stream_client.cpp /doc/html/boost_asio/example/cpp11/local/stream_server.cpp @@ -818,6 +977,12 @@ /doc/html/boost_asio/example/cpp11/operations/composed_6.cpp /doc/html/boost_asio/example/cpp11/operations/composed_7.cpp /doc/html/boost_asio/example/cpp11/operations/composed_8.cpp +/doc/html/boost_asio/example/cpp11/parallel_group/ +/doc/html/boost_asio/example/cpp11/parallel_group/ranged_wait_for_all.cpp +/doc/html/boost_asio/example/cpp11/parallel_group/wait_for_all.cpp +/doc/html/boost_asio/example/cpp11/parallel_group/wait_for_one.cpp +/doc/html/boost_asio/example/cpp11/parallel_group/wait_for_one_error.cpp +/doc/html/boost_asio/example/cpp11/parallel_group/wait_for_one_success.cpp /doc/html/boost_asio/example/cpp11/socks4/ /doc/html/boost_asio/example/cpp11/socks4/socks4.hpp /doc/html/boost_asio/example/cpp11/socks4/sync_client.cpp @@ -835,8 +1000,36 @@ /doc/html/boost_asio/example/cpp11/timeouts/server.cpp /doc/html/boost_asio/example/cpp11/timers/ /doc/html/boost_asio/example/cpp11/timers/time_t_timer.cpp +/doc/html/boost_asio/example/cpp11/type_erasure/ +/doc/html/boost_asio/example/cpp11/type_erasure/line_reader.hpp +/doc/html/boost_asio/example/cpp11/type_erasure/main.cpp +/doc/html/boost_asio/example/cpp11/type_erasure/sleep.cpp +/doc/html/boost_asio/example/cpp11/type_erasure/sleep.hpp +/doc/html/boost_asio/example/cpp11/type_erasure/stdin_line_reader.cpp +/doc/html/boost_asio/example/cpp11/type_erasure/stdin_line_reader.hpp /doc/html/boost_asio/example/cpp14/ +/doc/html/boost_asio/example/cpp14/deferred/ +/doc/html/boost_asio/example/cpp14/deferred/deferred_1.cpp +/doc/html/boost_asio/example/cpp14/deferred/deferred_2.cpp +/doc/html/boost_asio/example/cpp14/deferred/deferred_3.cpp +/doc/html/boost_asio/example/cpp14/deferred/deferred_4.cpp +/doc/html/boost_asio/example/cpp14/deferred/deferred_5.cpp +/doc/html/boost_asio/example/cpp14/deferred/deferred_6.cpp +/doc/html/boost_asio/example/cpp14/deferred/deferred_7.cpp +/doc/html/boost_asio/example/cpp14/executors/ +/doc/html/boost_asio/example/cpp14/executors/actor.cpp +/doc/html/boost_asio/example/cpp14/executors/async_1.cpp +/doc/html/boost_asio/example/cpp14/executors/async_2.cpp +/doc/html/boost_asio/example/cpp14/executors/bank_account_1.cpp +/doc/html/boost_asio/example/cpp14/executors/bank_account_2.cpp +/doc/html/boost_asio/example/cpp14/executors/fork_join.cpp +/doc/html/boost_asio/example/cpp14/executors/pipeline.cpp +/doc/html/boost_asio/example/cpp14/executors/priority_scheduler.cpp +/doc/html/boost_asio/example/cpp14/iostreams/ +/doc/html/boost_asio/example/cpp14/iostreams/http_client.cpp /doc/html/boost_asio/example/cpp14/operations/ +/doc/html/boost_asio/example/cpp14/operations/callback_wrapper.cpp +/doc/html/boost_asio/example/cpp14/operations/c_callback_wrapper.cpp /doc/html/boost_asio/example/cpp14/operations/composed_1.cpp /doc/html/boost_asio/example/cpp14/operations/composed_2.cpp /doc/html/boost_asio/example/cpp14/operations/composed_3.cpp @@ -845,37 +1038,92 @@ /doc/html/boost_asio/example/cpp14/operations/composed_6.cpp /doc/html/boost_asio/example/cpp14/operations/composed_7.cpp /doc/html/boost_asio/example/cpp14/operations/composed_8.cpp +/doc/html/boost_asio/example/cpp14/parallel_group/ +/doc/html/boost_asio/example/cpp14/parallel_group/parallel_sort.cpp +/doc/html/boost_asio/example/cpp14/parallel_group/ranged_wait_for_all.cpp +/doc/html/boost_asio/example/cpp14/parallel_group/wait_for_all.cpp +/doc/html/boost_asio/example/cpp14/parallel_group/wait_for_one.cpp +/doc/html/boost_asio/example/cpp14/parallel_group/wait_for_one_error.cpp +/doc/html/boost_asio/example/cpp14/parallel_group/wait_for_one_success.cpp /doc/html/boost_asio/example/cpp17/ /doc/html/boost_asio/example/cpp17/coroutines_ts/ /doc/html/boost_asio/example/cpp17/coroutines_ts/chat_server.cpp /doc/html/boost_asio/example/cpp17/coroutines_ts/echo_server.cpp +/doc/html/boost_asio/example/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp +/doc/html/boost_asio/example/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp /doc/html/boost_asio/example/cpp17/coroutines_ts/echo_server_with_default.cpp /doc/html/boost_asio/example/cpp17/coroutines_ts/range_based_for.cpp /doc/html/boost_asio/example/cpp17/coroutines_ts/refactored_echo_server.cpp +/doc/html/boost_asio/example/cpp20/ +/doc/html/boost_asio/example/cpp20/channels/ +/doc/html/boost_asio/example/cpp20/channels/throttling_proxy.cpp +/doc/html/boost_asio/example/cpp20/coroutines/ +/doc/html/boost_asio/example/cpp20/coroutines/chat_server.cpp +/doc/html/boost_asio/example/cpp20/coroutines/echo_server.cpp +/doc/html/boost_asio/example/cpp20/coroutines/echo_server_with_as_single_default.cpp +/doc/html/boost_asio/example/cpp20/coroutines/echo_server_with_as_tuple_default.cpp +/doc/html/boost_asio/example/cpp20/coroutines/echo_server_with_default.cpp +/doc/html/boost_asio/example/cpp20/coroutines/echo_server_with_deferred.cpp +/doc/html/boost_asio/example/cpp20/coroutines/echo_server_with_deferred_default.cpp +/doc/html/boost_asio/example/cpp20/coroutines/refactored_echo_server.cpp +/doc/html/boost_asio/example/cpp20/coroutines/timeout.cpp +/doc/html/boost_asio/example/cpp20/operations/ +/doc/html/boost_asio/example/cpp20/operations/callback_wrapper.cpp +/doc/html/boost_asio/example/cpp20/operations/c_callback_wrapper.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_1.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_2.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_3.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_4.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_5.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_6.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_7.cpp +/doc/html/boost_asio/example/cpp20/operations/composed_8.cpp +/doc/html/boost_asio/example/cpp20/type_erasure/ +/doc/html/boost_asio/example/cpp20/type_erasure/line_reader.hpp +/doc/html/boost_asio/example/cpp20/type_erasure/main.cpp +/doc/html/boost_asio/example/cpp20/type_erasure/sleep.cpp +/doc/html/boost_asio/example/cpp20/type_erasure/sleep.hpp +/doc/html/boost_asio/example/cpp20/type_erasure/stdin_line_reader.cpp +/doc/html/boost_asio/example/cpp20/type_erasure/stdin_line_reader.hpp /doc/html/boost_asio/examples/ /doc/html/boost_asio/examples/cpp03_examples.html /doc/html/boost_asio/examples/cpp11_examples.html /doc/html/boost_asio/examples/cpp14_examples.html /doc/html/boost_asio/examples/cpp17_examples.html +/doc/html/boost_asio/examples/cpp20_examples.html /doc/html/boost_asio/examples.html +/doc/html/boost_asio/higher_level_model.png /doc/html/boost_asio/history.html /doc/html/boost_asio.html /doc/html/boost_asio/index.html /doc/html/boost_asio/net_ts.html /doc/html/boost_asio/overview/ +/doc/html/boost_asio/overview/basics.html +/doc/html/boost_asio/overview/channels.html +/doc/html/boost_asio/overview/composition/ +/doc/html/boost_asio/overview/composition/compose.html +/doc/html/boost_asio/overview/composition/coro.html +/doc/html/boost_asio/overview/composition/coroutine.html +/doc/html/boost_asio/overview/composition/cpp20_coroutines.html +/doc/html/boost_asio/overview/composition/deferred.html +/doc/html/boost_asio/overview/composition/futures.html +/doc/html/boost_asio/overview/composition.html +/doc/html/boost_asio/overview/composition/immediate_completion.html +/doc/html/boost_asio/overview/composition/parallel_group.html +/doc/html/boost_asio/overview/composition/promises.html +/doc/html/boost_asio/overview/composition/spawn.html +/doc/html/boost_asio/overview/composition/token_adapters.html +/doc/html/boost_asio/overview/composition/type_erasure.html /doc/html/boost_asio/overview/core/ /doc/html/boost_asio/overview/core/allocation.html /doc/html/boost_asio/overview/core/async.html -/doc/html/boost_asio/overview/core/basics.html /doc/html/boost_asio/overview/core/buffers.html +/doc/html/boost_asio/overview/core/cancellation.html /doc/html/boost_asio/overview/core/concurrency_hint.html -/doc/html/boost_asio/overview/core/coroutine.html -/doc/html/boost_asio/overview/core/coroutines_ts.html /doc/html/boost_asio/overview/core/handler_tracking.html /doc/html/boost_asio/overview/core.html /doc/html/boost_asio/overview/core/line_based.html /doc/html/boost_asio/overview/core/reactor.html -/doc/html/boost_asio/overview/core/spawn.html /doc/html/boost_asio/overview/core/strands.html /doc/html/boost_asio/overview/core/streams.html /doc/html/boost_asio/overview/core/threads.html @@ -883,20 +1131,33 @@ /doc/html/boost_asio/overview/cpp2011/array.html /doc/html/boost_asio/overview/cpp2011/atomic.html /doc/html/boost_asio/overview/cpp2011/chrono.html -/doc/html/boost_asio/overview/cpp2011/futures.html /doc/html/boost_asio/overview/cpp2011.html /doc/html/boost_asio/overview/cpp2011/move_handlers.html /doc/html/boost_asio/overview/cpp2011/move_objects.html /doc/html/boost_asio/overview/cpp2011/shared_ptr.html /doc/html/boost_asio/overview/cpp2011/variadic.html +/doc/html/boost_asio/overview/files.html /doc/html/boost_asio/overview.html /doc/html/boost_asio/overview/implementation.html +/doc/html/boost_asio/overview/model/ +/doc/html/boost_asio/overview/model/allocators.html +/doc/html/boost_asio/overview/model/associators.html +/doc/html/boost_asio/overview/model/async_agents.html +/doc/html/boost_asio/overview/model/async_ops.html +/doc/html/boost_asio/overview/model/cancellation.html +/doc/html/boost_asio/overview/model/child_agents.html +/doc/html/boost_asio/overview/model/completion_tokens.html +/doc/html/boost_asio/overview/model/executors.html +/doc/html/boost_asio/overview/model/higher_levels.html +/doc/html/boost_asio/overview/model.html +/doc/html/boost_asio/overview/model/library_elements.html /doc/html/boost_asio/overview/networking/ /doc/html/boost_asio/overview/networking/bsd_sockets.html /doc/html/boost_asio/overview/networking.html /doc/html/boost_asio/overview/networking/iostreams.html /doc/html/boost_asio/overview/networking/other_protocols.html /doc/html/boost_asio/overview/networking/protocols.html +/doc/html/boost_asio/overview/pipes.html /doc/html/boost_asio/overview/posix/ /doc/html/boost_asio/overview/posix/fork.html /doc/html/boost_asio/overview/posix.html @@ -916,7 +1177,201 @@ /doc/html/boost_asio/reference/ /doc/html/boost_asio/reference/AcceptableProtocol.html /doc/html/boost_asio/reference/AcceptHandler.html +/doc/html/boost_asio/reference/AcceptToken.html +/doc/html/boost_asio/reference/allocator_binder/ +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/ +/doc/html/boost_asio/reference/allocator_binder/_allocator_binder.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload1.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload2.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload3.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload4.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload5.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload6.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload7.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload8.html +/doc/html/boost_asio/reference/allocator_binder/allocator_binder/overload9.html +/doc/html/boost_asio/reference/allocator_binder/allocator_type.html +/doc/html/boost_asio/reference/allocator_binder/argument_type.html +/doc/html/boost_asio/reference/allocator_binder/first_argument_type.html +/doc/html/boost_asio/reference/allocator_binder/get/ +/doc/html/boost_asio/reference/allocator_binder/get_allocator.html +/doc/html/boost_asio/reference/allocator_binder/get.html +/doc/html/boost_asio/reference/allocator_binder/get/overload1.html +/doc/html/boost_asio/reference/allocator_binder/get/overload2.html +/doc/html/boost_asio/reference/allocator_binder.html +/doc/html/boost_asio/reference/allocator_binder/operator_lp__rp_/ +/doc/html/boost_asio/reference/allocator_binder/operator_lp__rp_.html +/doc/html/boost_asio/reference/allocator_binder/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/allocator_binder/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/allocator_binder/result_type.html +/doc/html/boost_asio/reference/allocator_binder/second_argument_type.html +/doc/html/boost_asio/reference/allocator_binder/target_type.html +/doc/html/boost_asio/reference/any_completion_executor/ +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/ +/doc/html/boost_asio/reference/any_completion_executor/_any_completion_executor.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload10.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload3.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload4.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload5.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload6.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload7.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload8.html +/doc/html/boost_asio/reference/any_completion_executor/any_completion_executor/overload9.html +/doc/html/boost_asio/reference/any_completion_executor/context.html +/doc/html/boost_asio/reference/any_completion_executor/execute.html +/doc/html/boost_asio/reference/any_completion_executor.html +/doc/html/boost_asio/reference/any_completion_executor/operator_bool.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq_/ +/doc/html/boost_asio/reference/any_completion_executor/operator_eq__eq_/ +/doc/html/boost_asio/reference/any_completion_executor/operator_eq__eq_.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq__eq_/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq__eq_/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq__eq_/overload3.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq_.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq_/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq_/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/operator_eq_/overload3.html +/doc/html/boost_asio/reference/any_completion_executor/operator_not__eq_/ +/doc/html/boost_asio/reference/any_completion_executor/operator_not__eq_.html +/doc/html/boost_asio/reference/any_completion_executor/operator_not__eq_/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/operator_not__eq_/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/operator_not__eq_/overload3.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/ +/doc/html/boost_asio/reference/any_completion_executor/prefer.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/overload3.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/overload4.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/overload5.html +/doc/html/boost_asio/reference/any_completion_executor/prefer/overload6.html +/doc/html/boost_asio/reference/any_completion_executor/query.html +/doc/html/boost_asio/reference/any_completion_executor/require/ +/doc/html/boost_asio/reference/any_completion_executor/require.html +/doc/html/boost_asio/reference/any_completion_executor/require/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/require/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/swap/ +/doc/html/boost_asio/reference/any_completion_executor/swap.html +/doc/html/boost_asio/reference/any_completion_executor/swap/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/swap/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/target/ +/doc/html/boost_asio/reference/any_completion_executor/target.html +/doc/html/boost_asio/reference/any_completion_executor/target/overload1.html +/doc/html/boost_asio/reference/any_completion_executor/target/overload2.html +/doc/html/boost_asio/reference/any_completion_executor/target_type.html +/doc/html/boost_asio/reference/any_completion_handler/ +/doc/html/boost_asio/reference/any_completion_handler_allocator/ +/doc/html/boost_asio/reference/any_completion_handler_allocator/allocate.html +/doc/html/boost_asio/reference/any_completion_handler_allocator/any_completion_handler_allocator.html +/doc/html/boost_asio/reference/any_completion_handler_allocator/deallocate.html +/doc/html/boost_asio/reference/any_completion_handler_allocator.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/ +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/any_completion_handler_allocator.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/operator_eq__eq_.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/operator_not__eq_.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt___rebind/ +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt___rebind.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt___rebind/other.html +/doc/html/boost_asio/reference/any_completion_handler_allocator_lt__void_comma__Signatures_ellipsis__gt_/value_type.html +/doc/html/boost_asio/reference/any_completion_handler_allocator/operator_eq__eq_.html +/doc/html/boost_asio/reference/any_completion_handler_allocator/operator_not__eq_.html +/doc/html/boost_asio/reference/any_completion_handler_allocator__rebind/ +/doc/html/boost_asio/reference/any_completion_handler_allocator__rebind.html +/doc/html/boost_asio/reference/any_completion_handler_allocator__rebind/other.html +/doc/html/boost_asio/reference/any_completion_handler_allocator/value_type.html +/doc/html/boost_asio/reference/any_completion_handler/any_completion_handler/ +/doc/html/boost_asio/reference/any_completion_handler/_any_completion_handler.html +/doc/html/boost_asio/reference/any_completion_handler/any_completion_handler.html +/doc/html/boost_asio/reference/any_completion_handler/any_completion_handler/overload1.html +/doc/html/boost_asio/reference/any_completion_handler/any_completion_handler/overload2.html +/doc/html/boost_asio/reference/any_completion_handler/any_completion_handler/overload3.html +/doc/html/boost_asio/reference/any_completion_handler/any_completion_handler/overload4.html +/doc/html/boost_asio/reference/any_completion_handler/get_allocator.html +/doc/html/boost_asio/reference/any_completion_handler/get_cancellation_slot.html +/doc/html/boost_asio/reference/any_completion_handler.html +/doc/html/boost_asio/reference/any_completion_handler/operator_bool.html +/doc/html/boost_asio/reference/any_completion_handler/operator_eq_/ +/doc/html/boost_asio/reference/any_completion_handler/operator_eq__eq_/ +/doc/html/boost_asio/reference/any_completion_handler/operator_eq__eq_.html +/doc/html/boost_asio/reference/any_completion_handler/operator_eq__eq_/overload1.html +/doc/html/boost_asio/reference/any_completion_handler/operator_eq__eq_/overload2.html +/doc/html/boost_asio/reference/any_completion_handler/operator_eq_.html +/doc/html/boost_asio/reference/any_completion_handler/operator_eq_/overload1.html +/doc/html/boost_asio/reference/any_completion_handler/operator_eq_/overload2.html +/doc/html/boost_asio/reference/any_completion_handler/operator_lp__rp_.html +/doc/html/boost_asio/reference/any_completion_handler/operator_not__eq_/ +/doc/html/boost_asio/reference/any_completion_handler/operator_not__eq_.html +/doc/html/boost_asio/reference/any_completion_handler/operator_not__eq_/overload1.html +/doc/html/boost_asio/reference/any_completion_handler/operator_not__eq_/overload2.html +/doc/html/boost_asio/reference/any_completion_handler/operator_not_.html +/doc/html/boost_asio/reference/any_completion_handler/swap.html +/doc/html/boost_asio/reference/any_io_executor/ +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/ +/doc/html/boost_asio/reference/any_io_executor/_any_io_executor.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload10.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload1.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload2.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload3.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload4.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload5.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload6.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload7.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload8.html +/doc/html/boost_asio/reference/any_io_executor/any_io_executor/overload9.html +/doc/html/boost_asio/reference/any_io_executor/context.html +/doc/html/boost_asio/reference/any_io_executor/execute.html /doc/html/boost_asio/reference/any_io_executor.html +/doc/html/boost_asio/reference/any_io_executor/operator_bool.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq_/ +/doc/html/boost_asio/reference/any_io_executor/operator_eq__eq_/ +/doc/html/boost_asio/reference/any_io_executor/operator_eq__eq_.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq__eq_/overload1.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq__eq_/overload2.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq__eq_/overload3.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq_.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq_/overload1.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq_/overload2.html +/doc/html/boost_asio/reference/any_io_executor/operator_eq_/overload3.html +/doc/html/boost_asio/reference/any_io_executor/operator_not__eq_/ +/doc/html/boost_asio/reference/any_io_executor/operator_not__eq_.html +/doc/html/boost_asio/reference/any_io_executor/operator_not__eq_/overload1.html +/doc/html/boost_asio/reference/any_io_executor/operator_not__eq_/overload2.html +/doc/html/boost_asio/reference/any_io_executor/operator_not__eq_/overload3.html +/doc/html/boost_asio/reference/any_io_executor/prefer/ +/doc/html/boost_asio/reference/any_io_executor/prefer.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload1.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload2.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload3.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload4.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload5.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload6.html +/doc/html/boost_asio/reference/any_io_executor/prefer/overload7.html +/doc/html/boost_asio/reference/any_io_executor/query.html +/doc/html/boost_asio/reference/any_io_executor/require/ +/doc/html/boost_asio/reference/any_io_executor/require.html +/doc/html/boost_asio/reference/any_io_executor/require/overload1.html +/doc/html/boost_asio/reference/any_io_executor/require/overload2.html +/doc/html/boost_asio/reference/any_io_executor/require/overload3.html +/doc/html/boost_asio/reference/any_io_executor/swap/ +/doc/html/boost_asio/reference/any_io_executor/swap.html +/doc/html/boost_asio/reference/any_io_executor/swap/overload1.html +/doc/html/boost_asio/reference/any_io_executor/swap/overload2.html +/doc/html/boost_asio/reference/any_io_executor/target/ +/doc/html/boost_asio/reference/any_io_executor/target.html +/doc/html/boost_asio/reference/any_io_executor/target/overload1.html +/doc/html/boost_asio/reference/any_io_executor/target/overload2.html +/doc/html/boost_asio/reference/any_io_executor/target_type.html +/doc/html/boost_asio/reference/append.html +/doc/html/boost_asio/reference/append_t/ +/doc/html/boost_asio/reference/append_t/append_t.html +/doc/html/boost_asio/reference/append_t.html +/doc/html/boost_asio/reference/append_t/token_.html +/doc/html/boost_asio/reference/append_t/values_.html /doc/html/boost_asio/reference/asio_handler_allocate.html /doc/html/boost_asio/reference/asio_handler_deallocate.html /doc/html/boost_asio/reference/asio_handler_invoke/ @@ -925,13 +1380,74 @@ /doc/html/boost_asio/reference/asio_handler_invoke/overload2.html /doc/html/boost_asio/reference/asio_handler_is_continuation.html /doc/html/boost_asio/reference/associated_allocator/ -/doc/html/boost_asio/reference/associated_allocator/get.html +/doc/html/boost_asio/reference/associated_allocator/decltype/ +/doc/html/boost_asio/reference/associated_allocator/decltype.html +/doc/html/boost_asio/reference/associated_allocator/decltype/overload1.html +/doc/html/boost_asio/reference/associated_allocator/decltype/overload2.html /doc/html/boost_asio/reference/associated_allocator.html +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/ +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get/ +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get.html +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get/overload1.html +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/get/overload2.html +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_.html +/doc/html/boost_asio/reference/associated_allocator_lt__reference_wrapper_lt__T__gt__comma__Allocator__gt_/type.html +/doc/html/boost_asio/reference/associated_allocator/noexcept.html /doc/html/boost_asio/reference/associated_allocator/type.html +/doc/html/boost_asio/reference/associated_cancellation_slot/ +/doc/html/boost_asio/reference/associated_cancellation_slot/decltype/ +/doc/html/boost_asio/reference/associated_cancellation_slot/decltype.html +/doc/html/boost_asio/reference/associated_cancellation_slot/decltype/overload1.html +/doc/html/boost_asio/reference/associated_cancellation_slot/decltype/overload2.html +/doc/html/boost_asio/reference/associated_cancellation_slot.html +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/ +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get/ +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get.html +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get/overload1.html +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/get/overload2.html +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_.html +/doc/html/boost_asio/reference/associated_cancellation_slot_lt__reference_wrapper_lt__T__gt__comma__CancellationSlot__gt_/type.html +/doc/html/boost_asio/reference/associated_cancellation_slot/noexcept.html +/doc/html/boost_asio/reference/associated_cancellation_slot/type.html /doc/html/boost_asio/reference/associated_executor/ -/doc/html/boost_asio/reference/associated_executor/get.html +/doc/html/boost_asio/reference/associated_executor/decltype/ +/doc/html/boost_asio/reference/associated_executor/decltype.html +/doc/html/boost_asio/reference/associated_executor/decltype/overload1.html +/doc/html/boost_asio/reference/associated_executor/decltype/overload2.html /doc/html/boost_asio/reference/associated_executor.html +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/ +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get/ +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get.html +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get/overload1.html +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get/overload2.html +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_.html +/doc/html/boost_asio/reference/associated_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/type.html +/doc/html/boost_asio/reference/associated_executor/noexcept.html /doc/html/boost_asio/reference/associated_executor/type.html +/doc/html/boost_asio/reference/associated_immediate_executor/ +/doc/html/boost_asio/reference/associated_immediate_executor/decltype.html +/doc/html/boost_asio/reference/associated_immediate_executor.html +/doc/html/boost_asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/ +/doc/html/boost_asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/get.html +/doc/html/boost_asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_.html +/doc/html/boost_asio/reference/associated_immediate_executor_lt__reference_wrapper_lt__T__gt__comma__Executor__gt_/type.html +/doc/html/boost_asio/reference/associated_immediate_executor/noexcept.html +/doc/html/boost_asio/reference/associated_immediate_executor/type.html +/doc/html/boost_asio/reference/associator.html +/doc/html/boost_asio/reference/as_tuple.html +/doc/html/boost_asio/reference/as_tuple_t/ +/doc/html/boost_asio/reference/as_tuple_t/as_default_on.html +/doc/html/boost_asio/reference/as_tuple_t/as_tuple_t/ +/doc/html/boost_asio/reference/as_tuple_t/as_tuple_t.html +/doc/html/boost_asio/reference/as_tuple_t/as_tuple_t/overload1.html +/doc/html/boost_asio/reference/as_tuple_t/as_tuple_t/overload2.html +/doc/html/boost_asio/reference/as_tuple_t__default_constructor_tag.html +/doc/html/boost_asio/reference/as_tuple_t__executor_with_default/ +/doc/html/boost_asio/reference/as_tuple_t__executor_with_default/default_completion_token_type.html +/doc/html/boost_asio/reference/as_tuple_t__executor_with_default/executor_with_default.html +/doc/html/boost_asio/reference/as_tuple_t__executor_with_default.html +/doc/html/boost_asio/reference/as_tuple_t.html +/doc/html/boost_asio/reference/as_tuple_t/token_.html /doc/html/boost_asio/reference/async_completion/ /doc/html/boost_asio/reference/async_completion/async_completion.html /doc/html/boost_asio/reference/async_completion/completion_handler.html @@ -989,6 +1505,11 @@ /doc/html/boost_asio/reference/async_result/get.html /doc/html/boost_asio/reference/async_result.html /doc/html/boost_asio/reference/async_result/initiate.html +/doc/html/boost_asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/ +/doc/html/boost_asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/handler_type.html +/doc/html/boost_asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_.html +/doc/html/boost_asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/initiate.html +/doc/html/boost_asio/reference/async_result_lt__basic_yield_context_lt__Executor__gt__comma__Signature__gt_/return_type.html /doc/html/boost_asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/ /doc/html/boost_asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/async_result.html /doc/html/boost_asio/reference/async_result_lt__std__packaged_task_lt__Result_lp_Args_ellipsis__rp__gt__comma__Signature__gt_/completion_handler_type.html @@ -1021,6 +1542,7 @@ /doc/html/boost_asio/reference/awaitable/awaitable/overload2.html /doc/html/boost_asio/reference/awaitable/executor_type.html /doc/html/boost_asio/reference/awaitable.html +/doc/html/boost_asio/reference/awaitable/operator_eq_.html /doc/html/boost_asio/reference/awaitable/valid.html /doc/html/boost_asio/reference/awaitable/value_type.html /doc/html/boost_asio/reference/bad_executor/ @@ -1100,7 +1622,6 @@ /doc/html/boost_asio/reference/basic_datagram_socket/get_option/overload1.html /doc/html/boost_asio/reference/basic_datagram_socket/get_option/overload2.html /doc/html/boost_asio/reference/basic_datagram_socket.html -/doc/html/boost_asio/reference/basic_datagram_socket/impl_.html /doc/html/boost_asio/reference/basic_datagram_socket/io_control/ /doc/html/boost_asio/reference/basic_datagram_socket/io_control.html /doc/html/boost_asio/reference/basic_datagram_socket/io_control/overload1.html @@ -1240,6 +1761,81 @@ /doc/html/boost_asio/reference/basic_deadline_timer/wait.html /doc/html/boost_asio/reference/basic_deadline_timer/wait/overload1.html /doc/html/boost_asio/reference/basic_deadline_timer/wait/overload2.html +/doc/html/boost_asio/reference/basic_file/ +/doc/html/boost_asio/reference/basic_file/append.html +/doc/html/boost_asio/reference/basic_file/assign/ +/doc/html/boost_asio/reference/basic_file/assign.html +/doc/html/boost_asio/reference/basic_file/assign/overload1.html +/doc/html/boost_asio/reference/basic_file/assign/overload2.html +/doc/html/boost_asio/reference/basic_file/basic_file/ +/doc/html/boost_asio/reference/basic_file/_basic_file.html +/doc/html/boost_asio/reference/basic_file/basic_file.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload10.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload1.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload2.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload3.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload4.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload5.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload6.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload7.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload8.html +/doc/html/boost_asio/reference/basic_file/basic_file/overload9.html +/doc/html/boost_asio/reference/basic_file/cancel/ +/doc/html/boost_asio/reference/basic_file/cancel.html +/doc/html/boost_asio/reference/basic_file/cancel/overload1.html +/doc/html/boost_asio/reference/basic_file/cancel/overload2.html +/doc/html/boost_asio/reference/basic_file/close/ +/doc/html/boost_asio/reference/basic_file/close.html +/doc/html/boost_asio/reference/basic_file/close/overload1.html +/doc/html/boost_asio/reference/basic_file/close/overload2.html +/doc/html/boost_asio/reference/basic_file/create.html +/doc/html/boost_asio/reference/basic_file/exclusive.html +/doc/html/boost_asio/reference/basic_file/executor_type.html +/doc/html/boost_asio/reference/basic_file/flags.html +/doc/html/boost_asio/reference/basic_file/get_executor.html +/doc/html/boost_asio/reference/basic_file.html +/doc/html/boost_asio/reference/basic_file/is_open.html +/doc/html/boost_asio/reference/basic_file/native_handle.html +/doc/html/boost_asio/reference/basic_file/native_handle_type.html +/doc/html/boost_asio/reference/basic_file/open/ +/doc/html/boost_asio/reference/basic_file/open.html +/doc/html/boost_asio/reference/basic_file/open/overload1.html +/doc/html/boost_asio/reference/basic_file/open/overload2.html +/doc/html/boost_asio/reference/basic_file/open/overload3.html +/doc/html/boost_asio/reference/basic_file/open/overload4.html +/doc/html/boost_asio/reference/basic_file/operator_eq_/ +/doc/html/boost_asio/reference/basic_file/operator_eq_.html +/doc/html/boost_asio/reference/basic_file/operator_eq_/overload1.html +/doc/html/boost_asio/reference/basic_file/operator_eq_/overload2.html +/doc/html/boost_asio/reference/basic_file/read_only.html +/doc/html/boost_asio/reference/basic_file/read_write.html +/doc/html/boost_asio/reference/basic_file__rebind_executor/ +/doc/html/boost_asio/reference/basic_file__rebind_executor.html +/doc/html/boost_asio/reference/basic_file__rebind_executor/other.html +/doc/html/boost_asio/reference/basic_file/release/ +/doc/html/boost_asio/reference/basic_file/release.html +/doc/html/boost_asio/reference/basic_file/release/overload1.html +/doc/html/boost_asio/reference/basic_file/release/overload2.html +/doc/html/boost_asio/reference/basic_file/resize/ +/doc/html/boost_asio/reference/basic_file/resize.html +/doc/html/boost_asio/reference/basic_file/resize/overload1.html +/doc/html/boost_asio/reference/basic_file/resize/overload2.html +/doc/html/boost_asio/reference/basic_file/seek_basis.html +/doc/html/boost_asio/reference/basic_file/size/ +/doc/html/boost_asio/reference/basic_file/size.html +/doc/html/boost_asio/reference/basic_file/size/overload1.html +/doc/html/boost_asio/reference/basic_file/size/overload2.html +/doc/html/boost_asio/reference/basic_file/sync_all/ +/doc/html/boost_asio/reference/basic_file/sync_all.html +/doc/html/boost_asio/reference/basic_file/sync_all_on_write.html +/doc/html/boost_asio/reference/basic_file/sync_all/overload1.html +/doc/html/boost_asio/reference/basic_file/sync_all/overload2.html +/doc/html/boost_asio/reference/basic_file/sync_data/ +/doc/html/boost_asio/reference/basic_file/sync_data.html +/doc/html/boost_asio/reference/basic_file/sync_data/overload1.html +/doc/html/boost_asio/reference/basic_file/sync_data/overload2.html +/doc/html/boost_asio/reference/basic_file/truncate.html +/doc/html/boost_asio/reference/basic_file/write_only.html /doc/html/boost_asio/reference/basic_io_object/ /doc/html/boost_asio/reference/basic_io_object/basic_io_object/ /doc/html/boost_asio/reference/basic_io_object/_basic_io_object.html @@ -1263,6 +1859,91 @@ /doc/html/boost_asio/reference/basic_io_object/implementation_type.html /doc/html/boost_asio/reference/basic_io_object/operator_eq_.html /doc/html/boost_asio/reference/basic_io_object/service_type.html +/doc/html/boost_asio/reference/basic_random_access_file/ +/doc/html/boost_asio/reference/basic_random_access_file/append.html +/doc/html/boost_asio/reference/basic_random_access_file/assign/ +/doc/html/boost_asio/reference/basic_random_access_file/assign.html +/doc/html/boost_asio/reference/basic_random_access_file/assign/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/assign/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/async_read_some_at.html +/doc/html/boost_asio/reference/basic_random_access_file/async_write_some_at.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/ +/doc/html/boost_asio/reference/basic_random_access_file/_basic_random_access_file.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload10.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload3.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload4.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload5.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload6.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload7.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload8.html +/doc/html/boost_asio/reference/basic_random_access_file/basic_random_access_file/overload9.html +/doc/html/boost_asio/reference/basic_random_access_file/cancel/ +/doc/html/boost_asio/reference/basic_random_access_file/cancel.html +/doc/html/boost_asio/reference/basic_random_access_file/cancel/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/cancel/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/close/ +/doc/html/boost_asio/reference/basic_random_access_file/close.html +/doc/html/boost_asio/reference/basic_random_access_file/close/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/close/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/create.html +/doc/html/boost_asio/reference/basic_random_access_file/exclusive.html +/doc/html/boost_asio/reference/basic_random_access_file/executor_type.html +/doc/html/boost_asio/reference/basic_random_access_file/flags.html +/doc/html/boost_asio/reference/basic_random_access_file/get_executor.html +/doc/html/boost_asio/reference/basic_random_access_file.html +/doc/html/boost_asio/reference/basic_random_access_file/is_open.html +/doc/html/boost_asio/reference/basic_random_access_file/native_handle.html +/doc/html/boost_asio/reference/basic_random_access_file/native_handle_type.html +/doc/html/boost_asio/reference/basic_random_access_file/open/ +/doc/html/boost_asio/reference/basic_random_access_file/open.html +/doc/html/boost_asio/reference/basic_random_access_file/open/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/open/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/open/overload3.html +/doc/html/boost_asio/reference/basic_random_access_file/open/overload4.html +/doc/html/boost_asio/reference/basic_random_access_file/operator_eq_/ +/doc/html/boost_asio/reference/basic_random_access_file/operator_eq_.html +/doc/html/boost_asio/reference/basic_random_access_file/operator_eq_/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/operator_eq_/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/read_only.html +/doc/html/boost_asio/reference/basic_random_access_file/read_some_at/ +/doc/html/boost_asio/reference/basic_random_access_file/read_some_at.html +/doc/html/boost_asio/reference/basic_random_access_file/read_some_at/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/read_some_at/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/read_write.html +/doc/html/boost_asio/reference/basic_random_access_file__rebind_executor/ +/doc/html/boost_asio/reference/basic_random_access_file__rebind_executor.html +/doc/html/boost_asio/reference/basic_random_access_file__rebind_executor/other.html +/doc/html/boost_asio/reference/basic_random_access_file/release/ +/doc/html/boost_asio/reference/basic_random_access_file/release.html +/doc/html/boost_asio/reference/basic_random_access_file/release/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/release/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/resize/ +/doc/html/boost_asio/reference/basic_random_access_file/resize.html +/doc/html/boost_asio/reference/basic_random_access_file/resize/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/resize/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/seek_basis.html +/doc/html/boost_asio/reference/basic_random_access_file/size/ +/doc/html/boost_asio/reference/basic_random_access_file/size.html +/doc/html/boost_asio/reference/basic_random_access_file/size/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/size/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_all/ +/doc/html/boost_asio/reference/basic_random_access_file/sync_all.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_all_on_write.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_all/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_all/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_data/ +/doc/html/boost_asio/reference/basic_random_access_file/sync_data.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_data/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/sync_data/overload2.html +/doc/html/boost_asio/reference/basic_random_access_file/truncate.html +/doc/html/boost_asio/reference/basic_random_access_file/write_only.html +/doc/html/boost_asio/reference/basic_random_access_file/write_some_at/ +/doc/html/boost_asio/reference/basic_random_access_file/write_some_at.html +/doc/html/boost_asio/reference/basic_random_access_file/write_some_at/overload1.html +/doc/html/boost_asio/reference/basic_random_access_file/write_some_at/overload2.html /doc/html/boost_asio/reference/basic_raw_socket/ /doc/html/boost_asio/reference/basic_raw_socket/assign/ /doc/html/boost_asio/reference/basic_raw_socket/assign.html @@ -1336,7 +2017,6 @@ /doc/html/boost_asio/reference/basic_raw_socket/get_option/overload1.html /doc/html/boost_asio/reference/basic_raw_socket/get_option/overload2.html /doc/html/boost_asio/reference/basic_raw_socket.html -/doc/html/boost_asio/reference/basic_raw_socket/impl_.html /doc/html/boost_asio/reference/basic_raw_socket/io_control/ /doc/html/boost_asio/reference/basic_raw_socket/io_control.html /doc/html/boost_asio/reference/basic_raw_socket/io_control/overload1.html @@ -1432,6 +2112,55 @@ /doc/html/boost_asio/reference/basic_raw_socket/wait/overload1.html /doc/html/boost_asio/reference/basic_raw_socket/wait/overload2.html /doc/html/boost_asio/reference/basic_raw_socket/wait_type.html +/doc/html/boost_asio/reference/basic_readable_pipe/ +/doc/html/boost_asio/reference/basic_readable_pipe/assign/ +/doc/html/boost_asio/reference/basic_readable_pipe/assign.html +/doc/html/boost_asio/reference/basic_readable_pipe/assign/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/assign/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe/async_read_some.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/ +/doc/html/boost_asio/reference/basic_readable_pipe/_basic_readable_pipe.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/overload3.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/overload4.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/overload5.html +/doc/html/boost_asio/reference/basic_readable_pipe/basic_readable_pipe/overload6.html +/doc/html/boost_asio/reference/basic_readable_pipe/cancel/ +/doc/html/boost_asio/reference/basic_readable_pipe/cancel.html +/doc/html/boost_asio/reference/basic_readable_pipe/cancel/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/cancel/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe/close/ +/doc/html/boost_asio/reference/basic_readable_pipe/close.html +/doc/html/boost_asio/reference/basic_readable_pipe/close/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/close/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe/executor_type.html +/doc/html/boost_asio/reference/basic_readable_pipe/get_executor.html +/doc/html/boost_asio/reference/basic_readable_pipe.html +/doc/html/boost_asio/reference/basic_readable_pipe/is_open.html +/doc/html/boost_asio/reference/basic_readable_pipe/lowest_layer/ +/doc/html/boost_asio/reference/basic_readable_pipe/lowest_layer.html +/doc/html/boost_asio/reference/basic_readable_pipe/lowest_layer/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/lowest_layer/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe/lowest_layer_type.html +/doc/html/boost_asio/reference/basic_readable_pipe/native_handle.html +/doc/html/boost_asio/reference/basic_readable_pipe/native_handle_type.html +/doc/html/boost_asio/reference/basic_readable_pipe/operator_eq_/ +/doc/html/boost_asio/reference/basic_readable_pipe/operator_eq_.html +/doc/html/boost_asio/reference/basic_readable_pipe/operator_eq_/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/operator_eq_/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe/read_some/ +/doc/html/boost_asio/reference/basic_readable_pipe/read_some.html +/doc/html/boost_asio/reference/basic_readable_pipe/read_some/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/read_some/overload2.html +/doc/html/boost_asio/reference/basic_readable_pipe__rebind_executor/ +/doc/html/boost_asio/reference/basic_readable_pipe__rebind_executor.html +/doc/html/boost_asio/reference/basic_readable_pipe__rebind_executor/other.html +/doc/html/boost_asio/reference/basic_readable_pipe/release/ +/doc/html/boost_asio/reference/basic_readable_pipe/release.html +/doc/html/boost_asio/reference/basic_readable_pipe/release/overload1.html +/doc/html/boost_asio/reference/basic_readable_pipe/release/overload2.html /doc/html/boost_asio/reference/basic_seq_packet_socket/ /doc/html/boost_asio/reference/basic_seq_packet_socket/assign/ /doc/html/boost_asio/reference/basic_seq_packet_socket/assign.html @@ -1494,7 +2223,6 @@ /doc/html/boost_asio/reference/basic_seq_packet_socket/get_option/overload1.html /doc/html/boost_asio/reference/basic_seq_packet_socket/get_option/overload2.html /doc/html/boost_asio/reference/basic_seq_packet_socket.html -/doc/html/boost_asio/reference/basic_seq_packet_socket/impl_.html /doc/html/boost_asio/reference/basic_seq_packet_socket/io_control/ /doc/html/boost_asio/reference/basic_seq_packet_socket/io_control.html /doc/html/boost_asio/reference/basic_seq_packet_socket/io_control/overload1.html @@ -1589,6 +2317,7 @@ /doc/html/boost_asio/reference/basic_serial_port/basic_serial_port/ /doc/html/boost_asio/reference/basic_serial_port/_basic_serial_port.html /doc/html/boost_asio/reference/basic_serial_port/basic_serial_port.html +/doc/html/boost_asio/reference/basic_serial_port/basic_serial_port/overload10.html /doc/html/boost_asio/reference/basic_serial_port/basic_serial_port/overload1.html /doc/html/boost_asio/reference/basic_serial_port/basic_serial_port/overload2.html /doc/html/boost_asio/reference/basic_serial_port/basic_serial_port/overload3.html @@ -1625,7 +2354,10 @@ /doc/html/boost_asio/reference/basic_serial_port/open.html /doc/html/boost_asio/reference/basic_serial_port/open/overload1.html /doc/html/boost_asio/reference/basic_serial_port/open/overload2.html +/doc/html/boost_asio/reference/basic_serial_port/operator_eq_/ /doc/html/boost_asio/reference/basic_serial_port/operator_eq_.html +/doc/html/boost_asio/reference/basic_serial_port/operator_eq_/overload1.html +/doc/html/boost_asio/reference/basic_serial_port/operator_eq_/overload2.html /doc/html/boost_asio/reference/basic_serial_port/read_some/ /doc/html/boost_asio/reference/basic_serial_port/read_some.html /doc/html/boost_asio/reference/basic_serial_port/read_some/overload1.html @@ -1650,6 +2382,8 @@ /doc/html/boost_asio/reference/basic_signal_set/add.html /doc/html/boost_asio/reference/basic_signal_set/add/overload1.html /doc/html/boost_asio/reference/basic_signal_set/add/overload2.html +/doc/html/boost_asio/reference/basic_signal_set/add/overload3.html +/doc/html/boost_asio/reference/basic_signal_set/add/overload4.html /doc/html/boost_asio/reference/basic_signal_set/async_wait.html /doc/html/boost_asio/reference/basic_signal_set/basic_signal_set/ /doc/html/boost_asio/reference/basic_signal_set/_basic_signal_set.html @@ -1671,6 +2405,8 @@ /doc/html/boost_asio/reference/basic_signal_set/clear/overload1.html /doc/html/boost_asio/reference/basic_signal_set/clear/overload2.html /doc/html/boost_asio/reference/basic_signal_set/executor_type.html +/doc/html/boost_asio/reference/basic_signal_set/flags.html +/doc/html/boost_asio/reference/basic_signal_set/flags_t.html /doc/html/boost_asio/reference/basic_signal_set/get_executor.html /doc/html/boost_asio/reference/basic_signal_set.html /doc/html/boost_asio/reference/basic_signal_set__rebind_executor/ @@ -1875,7 +2611,6 @@ /doc/html/boost_asio/reference/basic_socket/get_option/overload1.html /doc/html/boost_asio/reference/basic_socket/get_option/overload2.html /doc/html/boost_asio/reference/basic_socket.html -/doc/html/boost_asio/reference/basic_socket/impl_.html /doc/html/boost_asio/reference/basic_socket/io_control/ /doc/html/boost_asio/reference/basic_socket/io_control.html /doc/html/boost_asio/reference/basic_socket/io_control/overload1.html @@ -2051,6 +2786,95 @@ /doc/html/boost_asio/reference/basic_streambuf/reserve.html /doc/html/boost_asio/reference/basic_streambuf/size.html /doc/html/boost_asio/reference/basic_streambuf/underflow.html +/doc/html/boost_asio/reference/basic_stream_file/ +/doc/html/boost_asio/reference/basic_stream_file/append.html +/doc/html/boost_asio/reference/basic_stream_file/assign/ +/doc/html/boost_asio/reference/basic_stream_file/assign.html +/doc/html/boost_asio/reference/basic_stream_file/assign/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/assign/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/async_read_some.html +/doc/html/boost_asio/reference/basic_stream_file/async_write_some.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/ +/doc/html/boost_asio/reference/basic_stream_file/_basic_stream_file.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload10.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload3.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload4.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload5.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload6.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload7.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload8.html +/doc/html/boost_asio/reference/basic_stream_file/basic_stream_file/overload9.html +/doc/html/boost_asio/reference/basic_stream_file/cancel/ +/doc/html/boost_asio/reference/basic_stream_file/cancel.html +/doc/html/boost_asio/reference/basic_stream_file/cancel/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/cancel/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/close/ +/doc/html/boost_asio/reference/basic_stream_file/close.html +/doc/html/boost_asio/reference/basic_stream_file/close/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/close/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/create.html +/doc/html/boost_asio/reference/basic_stream_file/exclusive.html +/doc/html/boost_asio/reference/basic_stream_file/executor_type.html +/doc/html/boost_asio/reference/basic_stream_file/flags.html +/doc/html/boost_asio/reference/basic_stream_file/get_executor.html +/doc/html/boost_asio/reference/basic_stream_file.html +/doc/html/boost_asio/reference/basic_stream_file/is_open.html +/doc/html/boost_asio/reference/basic_stream_file/native_handle.html +/doc/html/boost_asio/reference/basic_stream_file/native_handle_type.html +/doc/html/boost_asio/reference/basic_stream_file/open/ +/doc/html/boost_asio/reference/basic_stream_file/open.html +/doc/html/boost_asio/reference/basic_stream_file/open/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/open/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/open/overload3.html +/doc/html/boost_asio/reference/basic_stream_file/open/overload4.html +/doc/html/boost_asio/reference/basic_stream_file/operator_eq_/ +/doc/html/boost_asio/reference/basic_stream_file/operator_eq_.html +/doc/html/boost_asio/reference/basic_stream_file/operator_eq_/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/operator_eq_/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/read_only.html +/doc/html/boost_asio/reference/basic_stream_file/read_some/ +/doc/html/boost_asio/reference/basic_stream_file/read_some.html +/doc/html/boost_asio/reference/basic_stream_file/read_some/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/read_some/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/read_write.html +/doc/html/boost_asio/reference/basic_stream_file__rebind_executor/ +/doc/html/boost_asio/reference/basic_stream_file__rebind_executor.html +/doc/html/boost_asio/reference/basic_stream_file__rebind_executor/other.html +/doc/html/boost_asio/reference/basic_stream_file/release/ +/doc/html/boost_asio/reference/basic_stream_file/release.html +/doc/html/boost_asio/reference/basic_stream_file/release/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/release/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/resize/ +/doc/html/boost_asio/reference/basic_stream_file/resize.html +/doc/html/boost_asio/reference/basic_stream_file/resize/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/resize/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/seek/ +/doc/html/boost_asio/reference/basic_stream_file/seek_basis.html +/doc/html/boost_asio/reference/basic_stream_file/seek.html +/doc/html/boost_asio/reference/basic_stream_file/seek/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/seek/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/size/ +/doc/html/boost_asio/reference/basic_stream_file/size.html +/doc/html/boost_asio/reference/basic_stream_file/size/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/size/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/sync_all/ +/doc/html/boost_asio/reference/basic_stream_file/sync_all.html +/doc/html/boost_asio/reference/basic_stream_file/sync_all_on_write.html +/doc/html/boost_asio/reference/basic_stream_file/sync_all/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/sync_all/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/sync_data/ +/doc/html/boost_asio/reference/basic_stream_file/sync_data.html +/doc/html/boost_asio/reference/basic_stream_file/sync_data/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/sync_data/overload2.html +/doc/html/boost_asio/reference/basic_stream_file/truncate.html +/doc/html/boost_asio/reference/basic_stream_file/write_only.html +/doc/html/boost_asio/reference/basic_stream_file/write_some/ +/doc/html/boost_asio/reference/basic_stream_file/write_some.html +/doc/html/boost_asio/reference/basic_stream_file/write_some/overload1.html +/doc/html/boost_asio/reference/basic_stream_file/write_some/overload2.html /doc/html/boost_asio/reference/basic_stream_socket/ /doc/html/boost_asio/reference/basic_stream_socket/assign/ /doc/html/boost_asio/reference/basic_stream_socket/assign.html @@ -2118,7 +2942,6 @@ /doc/html/boost_asio/reference/basic_stream_socket/get_option/overload1.html /doc/html/boost_asio/reference/basic_stream_socket/get_option/overload2.html /doc/html/boost_asio/reference/basic_stream_socket.html -/doc/html/boost_asio/reference/basic_stream_socket/impl_.html /doc/html/boost_asio/reference/basic_stream_socket/io_control/ /doc/html/boost_asio/reference/basic_stream_socket/io_control.html /doc/html/boost_asio/reference/basic_stream_socket/io_control/overload1.html @@ -2295,19 +3118,81 @@ /doc/html/boost_asio/reference/basic_waitable_timer/wait.html /doc/html/boost_asio/reference/basic_waitable_timer/wait/overload1.html /doc/html/boost_asio/reference/basic_waitable_timer/wait/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/ +/doc/html/boost_asio/reference/basic_writable_pipe/assign/ +/doc/html/boost_asio/reference/basic_writable_pipe/assign.html +/doc/html/boost_asio/reference/basic_writable_pipe/assign/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/assign/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/async_write_some.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/ +/doc/html/boost_asio/reference/basic_writable_pipe/_basic_writable_pipe.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/overload3.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/overload4.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/overload5.html +/doc/html/boost_asio/reference/basic_writable_pipe/basic_writable_pipe/overload6.html +/doc/html/boost_asio/reference/basic_writable_pipe/cancel/ +/doc/html/boost_asio/reference/basic_writable_pipe/cancel.html +/doc/html/boost_asio/reference/basic_writable_pipe/cancel/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/cancel/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/close/ +/doc/html/boost_asio/reference/basic_writable_pipe/close.html +/doc/html/boost_asio/reference/basic_writable_pipe/close/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/close/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/executor_type.html +/doc/html/boost_asio/reference/basic_writable_pipe/get_executor.html +/doc/html/boost_asio/reference/basic_writable_pipe.html +/doc/html/boost_asio/reference/basic_writable_pipe/is_open.html +/doc/html/boost_asio/reference/basic_writable_pipe/lowest_layer/ +/doc/html/boost_asio/reference/basic_writable_pipe/lowest_layer.html +/doc/html/boost_asio/reference/basic_writable_pipe/lowest_layer/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/lowest_layer/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/lowest_layer_type.html +/doc/html/boost_asio/reference/basic_writable_pipe/native_handle.html +/doc/html/boost_asio/reference/basic_writable_pipe/native_handle_type.html +/doc/html/boost_asio/reference/basic_writable_pipe/operator_eq_/ +/doc/html/boost_asio/reference/basic_writable_pipe/operator_eq_.html +/doc/html/boost_asio/reference/basic_writable_pipe/operator_eq_/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/operator_eq_/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe__rebind_executor/ +/doc/html/boost_asio/reference/basic_writable_pipe__rebind_executor.html +/doc/html/boost_asio/reference/basic_writable_pipe__rebind_executor/other.html +/doc/html/boost_asio/reference/basic_writable_pipe/release/ +/doc/html/boost_asio/reference/basic_writable_pipe/release.html +/doc/html/boost_asio/reference/basic_writable_pipe/release/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/release/overload2.html +/doc/html/boost_asio/reference/basic_writable_pipe/write_some/ +/doc/html/boost_asio/reference/basic_writable_pipe/write_some.html +/doc/html/boost_asio/reference/basic_writable_pipe/write_some/overload1.html +/doc/html/boost_asio/reference/basic_writable_pipe/write_some/overload2.html /doc/html/boost_asio/reference/basic_yield_context/ -/doc/html/boost_asio/reference/basic_yield_context/basic_yield_context/ /doc/html/boost_asio/reference/basic_yield_context/basic_yield_context.html -/doc/html/boost_asio/reference/basic_yield_context/basic_yield_context/overload1.html -/doc/html/boost_asio/reference/basic_yield_context/basic_yield_context/overload2.html -/doc/html/boost_asio/reference/basic_yield_context/callee_type.html -/doc/html/boost_asio/reference/basic_yield_context/caller_type.html +/doc/html/boost_asio/reference/basic_yield_context/cancellation_slot_type.html +/doc/html/boost_asio/reference/basic_yield_context/cancelled.html +/doc/html/boost_asio/reference/basic_yield_context/executor_type.html +/doc/html/boost_asio/reference/basic_yield_context/get_cancellation_slot.html +/doc/html/boost_asio/reference/basic_yield_context/get_cancellation_state.html +/doc/html/boost_asio/reference/basic_yield_context/get_executor.html /doc/html/boost_asio/reference/basic_yield_context.html /doc/html/boost_asio/reference/basic_yield_context/operator_lb__rb_.html +/doc/html/boost_asio/reference/basic_yield_context/reset_cancellation_state/ +/doc/html/boost_asio/reference/basic_yield_context/reset_cancellation_state.html +/doc/html/boost_asio/reference/basic_yield_context/reset_cancellation_state/overload1.html +/doc/html/boost_asio/reference/basic_yield_context/reset_cancellation_state/overload2.html +/doc/html/boost_asio/reference/basic_yield_context/reset_cancellation_state/overload3.html +/doc/html/boost_asio/reference/basic_yield_context/throw_if_cancelled/ +/doc/html/boost_asio/reference/basic_yield_context/throw_if_cancelled.html +/doc/html/boost_asio/reference/basic_yield_context/throw_if_cancelled/overload1.html +/doc/html/boost_asio/reference/basic_yield_context/throw_if_cancelled/overload2.html +/doc/html/boost_asio/reference/bind_allocator.html +/doc/html/boost_asio/reference/bind_cancellation_slot.html /doc/html/boost_asio/reference/bind_executor/ /doc/html/boost_asio/reference/bind_executor.html /doc/html/boost_asio/reference/bind_executor/overload1.html /doc/html/boost_asio/reference/bind_executor/overload2.html +/doc/html/boost_asio/reference/bind_immediate_executor.html /doc/html/boost_asio/reference/buffer/ /doc/html/boost_asio/reference/buffer_cast/ /doc/html/boost_asio/reference/buffer_cast.html @@ -2318,6 +3203,7 @@ /doc/html/boost_asio/reference/buffer_copy/overload1.html /doc/html/boost_asio/reference/buffer_copy/overload2.html /doc/html/boost_asio/reference/BufferedHandshakeHandler.html +/doc/html/boost_asio/reference/BufferedHandshakeToken.html /doc/html/boost_asio/reference/buffered_read_stream/ /doc/html/boost_asio/reference/buffered_read_stream/async_fill.html /doc/html/boost_asio/reference/buffered_read_stream/async_read_some.html @@ -2452,6 +3338,10 @@ /doc/html/boost_asio/reference/buffered_write_stream/write_some/overload1.html /doc/html/boost_asio/reference/buffered_write_stream/write_some/overload2.html /doc/html/boost_asio/reference/buffer.html +/doc/html/boost_asio/reference/buffer_literals__operator_quot__quot__buf/ +/doc/html/boost_asio/reference/buffer_literals__operator_quot__quot__buf.html +/doc/html/boost_asio/reference/buffer_literals__operator_quot__quot__buf/overload1.html +/doc/html/boost_asio/reference/buffer_literals__operator_quot__quot__buf/overload2.html /doc/html/boost_asio/reference/buffer/overload10.html /doc/html/boost_asio/reference/buffer/overload11.html /doc/html/boost_asio/reference/buffer/overload12.html @@ -2477,13 +3367,42 @@ /doc/html/boost_asio/reference/buffer/overload30.html /doc/html/boost_asio/reference/buffer/overload31.html /doc/html/boost_asio/reference/buffer/overload32.html +/doc/html/boost_asio/reference/buffer/overload33.html +/doc/html/boost_asio/reference/buffer/overload34.html +/doc/html/boost_asio/reference/buffer/overload35.html +/doc/html/boost_asio/reference/buffer/overload36.html +/doc/html/boost_asio/reference/buffer/overload37.html +/doc/html/boost_asio/reference/buffer/overload38.html +/doc/html/boost_asio/reference/buffer/overload39.html /doc/html/boost_asio/reference/buffer/overload3.html +/doc/html/boost_asio/reference/buffer/overload40.html +/doc/html/boost_asio/reference/buffer/overload41.html +/doc/html/boost_asio/reference/buffer/overload42.html /doc/html/boost_asio/reference/buffer/overload4.html /doc/html/boost_asio/reference/buffer/overload5.html /doc/html/boost_asio/reference/buffer/overload6.html /doc/html/boost_asio/reference/buffer/overload7.html /doc/html/boost_asio/reference/buffer/overload8.html /doc/html/boost_asio/reference/buffer/overload9.html +/doc/html/boost_asio/reference/buffer_registration/ +/doc/html/boost_asio/reference/buffer_registration/allocator_type.html +/doc/html/boost_asio/reference/buffer_registration/at.html +/doc/html/boost_asio/reference/buffer_registration/begin.html +/doc/html/boost_asio/reference/buffer_registration/buffer_registration/ +/doc/html/boost_asio/reference/buffer_registration/_buffer_registration.html +/doc/html/boost_asio/reference/buffer_registration/buffer_registration.html +/doc/html/boost_asio/reference/buffer_registration/buffer_registration/overload1.html +/doc/html/boost_asio/reference/buffer_registration/buffer_registration/overload2.html +/doc/html/boost_asio/reference/buffer_registration/buffer_registration/overload3.html +/doc/html/boost_asio/reference/buffer_registration/cbegin.html +/doc/html/boost_asio/reference/buffer_registration/cend.html +/doc/html/boost_asio/reference/buffer_registration/const_iterator.html +/doc/html/boost_asio/reference/buffer_registration/end.html +/doc/html/boost_asio/reference/buffer_registration.html +/doc/html/boost_asio/reference/buffer_registration/iterator.html +/doc/html/boost_asio/reference/buffer_registration/operator_eq_.html +/doc/html/boost_asio/reference/buffer_registration/operator_lb__rb_.html +/doc/html/boost_asio/reference/buffer_registration/size.html /doc/html/boost_asio/reference/buffers_begin.html /doc/html/boost_asio/reference/buffers_end.html /doc/html/boost_asio/reference/buffer_sequence_begin/ @@ -2492,12 +3411,16 @@ /doc/html/boost_asio/reference/buffer_sequence_begin/overload2.html /doc/html/boost_asio/reference/buffer_sequence_begin/overload3.html /doc/html/boost_asio/reference/buffer_sequence_begin/overload4.html +/doc/html/boost_asio/reference/buffer_sequence_begin/overload5.html +/doc/html/boost_asio/reference/buffer_sequence_begin/overload6.html /doc/html/boost_asio/reference/buffer_sequence_end/ /doc/html/boost_asio/reference/buffer_sequence_end.html /doc/html/boost_asio/reference/buffer_sequence_end/overload1.html /doc/html/boost_asio/reference/buffer_sequence_end/overload2.html /doc/html/boost_asio/reference/buffer_sequence_end/overload3.html /doc/html/boost_asio/reference/buffer_sequence_end/overload4.html +/doc/html/boost_asio/reference/buffer_sequence_end/overload5.html +/doc/html/boost_asio/reference/buffer_sequence_end/overload6.html /doc/html/boost_asio/reference/buffers_iterator/ /doc/html/boost_asio/reference/buffers_iterator/begin.html /doc/html/boost_asio/reference/buffers_iterator/buffers_iterator.html @@ -2536,12 +3459,77 @@ /doc/html/boost_asio/reference/buffers_iterator/reference.html /doc/html/boost_asio/reference/buffers_iterator/value_type.html /doc/html/boost_asio/reference/buffer_size.html +/doc/html/boost_asio/reference/cancellation_filter/ +/doc/html/boost_asio/reference/cancellation_filter.html +/doc/html/boost_asio/reference/cancellation_filter/operator_lp__rp_.html +/doc/html/boost_asio/reference/CancellationHandler.html +/doc/html/boost_asio/reference/cancellation_signal/ +/doc/html/boost_asio/reference/cancellation_signal/_cancellation_signal.html +/doc/html/boost_asio/reference/cancellation_signal/cancellation_signal.html +/doc/html/boost_asio/reference/cancellation_signal/emit.html +/doc/html/boost_asio/reference/cancellation_signal.html +/doc/html/boost_asio/reference/cancellation_signal/slot.html +/doc/html/boost_asio/reference/cancellation_slot/ +/doc/html/boost_asio/reference/cancellation_slot/assign.html +/doc/html/boost_asio/reference/cancellation_slot_binder/ +/doc/html/boost_asio/reference/cancellation_slot_binder/argument_type.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/ +/doc/html/boost_asio/reference/cancellation_slot_binder/_cancellation_slot_binder.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload1.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload2.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload3.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload4.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload5.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload6.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload7.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload8.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_binder/overload9.html +/doc/html/boost_asio/reference/cancellation_slot_binder/cancellation_slot_type.html +/doc/html/boost_asio/reference/cancellation_slot_binder/first_argument_type.html +/doc/html/boost_asio/reference/cancellation_slot_binder/get/ +/doc/html/boost_asio/reference/cancellation_slot_binder/get_cancellation_slot.html +/doc/html/boost_asio/reference/cancellation_slot_binder/get.html +/doc/html/boost_asio/reference/cancellation_slot_binder/get/overload1.html +/doc/html/boost_asio/reference/cancellation_slot_binder/get/overload2.html +/doc/html/boost_asio/reference/cancellation_slot_binder.html +/doc/html/boost_asio/reference/cancellation_slot_binder/operator_lp__rp_/ +/doc/html/boost_asio/reference/cancellation_slot_binder/operator_lp__rp_.html +/doc/html/boost_asio/reference/cancellation_slot_binder/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/cancellation_slot_binder/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/cancellation_slot_binder/result_type.html +/doc/html/boost_asio/reference/cancellation_slot_binder/second_argument_type.html +/doc/html/boost_asio/reference/cancellation_slot_binder/target_type.html +/doc/html/boost_asio/reference/cancellation_slot/cancellation_slot.html +/doc/html/boost_asio/reference/cancellation_slot/clear.html +/doc/html/boost_asio/reference/cancellation_slot/emplace.html +/doc/html/boost_asio/reference/cancellation_slot/has_handler.html +/doc/html/boost_asio/reference/CancellationSlot.html +/doc/html/boost_asio/reference/cancellation_slot.html +/doc/html/boost_asio/reference/cancellation_slot/is_connected.html +/doc/html/boost_asio/reference/cancellation_slot/operator_eq__eq_.html +/doc/html/boost_asio/reference/cancellation_slot/operator_not__eq_.html +/doc/html/boost_asio/reference/cancellation_state/ +/doc/html/boost_asio/reference/cancellation_state/cancellation_state/ +/doc/html/boost_asio/reference/cancellation_state/cancellation_state.html +/doc/html/boost_asio/reference/cancellation_state/cancellation_state/overload1.html +/doc/html/boost_asio/reference/cancellation_state/cancellation_state/overload2.html +/doc/html/boost_asio/reference/cancellation_state/cancellation_state/overload3.html +/doc/html/boost_asio/reference/cancellation_state/cancellation_state/overload4.html +/doc/html/boost_asio/reference/cancellation_state/cancelled.html +/doc/html/boost_asio/reference/cancellation_state/clear.html +/doc/html/boost_asio/reference/cancellation_state.html +/doc/html/boost_asio/reference/cancellation_state/slot.html +/doc/html/boost_asio/reference/cancellation_type.html +/doc/html/boost_asio/reference/cancellation_type_t.html /doc/html/boost_asio/reference/can_prefer.html /doc/html/boost_asio/reference/can_query.html /doc/html/boost_asio/reference/can_require_concept.html /doc/html/boost_asio/reference/can_require.html /doc/html/boost_asio/reference/CompletionCondition.html -/doc/html/boost_asio/reference/CompletionHandler.html +/doc/html/boost_asio/reference/completion_signature_of/ +/doc/html/boost_asio/reference/completion_signature_of.html +/doc/html/boost_asio/reference/completion_signature_of/type.html /doc/html/boost_asio/reference/connect/ /doc/html/boost_asio/reference/ConnectCondition.html /doc/html/boost_asio/reference/ConnectHandler.html @@ -2558,6 +3546,15 @@ /doc/html/boost_asio/reference/connect/overload7.html /doc/html/boost_asio/reference/connect/overload8.html /doc/html/boost_asio/reference/connect/overload9.html +/doc/html/boost_asio/reference/connect_pipe/ +/doc/html/boost_asio/reference/connect_pipe.html +/doc/html/boost_asio/reference/connect_pipe/overload1.html +/doc/html/boost_asio/reference/connect_pipe/overload2.html +/doc/html/boost_asio/reference/ConnectToken.html +/doc/html/boost_asio/reference/consign.html +/doc/html/boost_asio/reference/consign_t/ +/doc/html/boost_asio/reference/consign_t/consign_t.html +/doc/html/boost_asio/reference/consign_t.html /doc/html/boost_asio/reference/const_buffer/ /doc/html/boost_asio/reference/const_buffer/const_buffer/ /doc/html/boost_asio/reference/const_buffer/const_buffer.html @@ -2590,6 +3587,21 @@ /doc/html/boost_asio/reference/const_buffers_1/value_type.html /doc/html/boost_asio/reference/ConstBufferSequence.html /doc/html/boost_asio/reference/const_buffer/size.html +/doc/html/boost_asio/reference/const_registered_buffer/ +/doc/html/boost_asio/reference/const_registered_buffer/buffer.html +/doc/html/boost_asio/reference/const_registered_buffer/const_registered_buffer/ +/doc/html/boost_asio/reference/const_registered_buffer/const_registered_buffer.html +/doc/html/boost_asio/reference/const_registered_buffer/const_registered_buffer/overload1.html +/doc/html/boost_asio/reference/const_registered_buffer/const_registered_buffer/overload2.html +/doc/html/boost_asio/reference/const_registered_buffer/data.html +/doc/html/boost_asio/reference/const_registered_buffer.html +/doc/html/boost_asio/reference/const_registered_buffer/id.html +/doc/html/boost_asio/reference/const_registered_buffer/operator_plus_/ +/doc/html/boost_asio/reference/const_registered_buffer/operator_plus__eq_.html +/doc/html/boost_asio/reference/const_registered_buffer/operator_plus_.html +/doc/html/boost_asio/reference/const_registered_buffer/operator_plus_/overload1.html +/doc/html/boost_asio/reference/const_registered_buffer/operator_plus_/overload2.html +/doc/html/boost_asio/reference/const_registered_buffer/size.html /doc/html/boost_asio/reference/coroutine/ /doc/html/boost_asio/reference/coroutine/coroutine.html /doc/html/boost_asio/reference/coroutine.html @@ -2613,6 +3625,62 @@ /doc/html/boost_asio/reference/defer/overload1.html /doc/html/boost_asio/reference/defer/overload2.html /doc/html/boost_asio/reference/defer/overload3.html +/doc/html/boost_asio/reference/deferred_async_operation/ +/doc/html/boost_asio/reference/deferred_async_operation/deferred_async_operation.html +/doc/html/boost_asio/reference/deferred_async_operation/detail__index_sequence_for.html +/doc/html/boost_asio/reference/deferred_async_operation.html +/doc/html/boost_asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/ +/doc/html/boost_asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/deferred_async_operation.html +/doc/html/boost_asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/detail__index_sequence_for.html +/doc/html/boost_asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_.html +/doc/html/boost_asio/reference/deferred_async_operation_lt__deferred_signatures_lt__Signatures_ellipsis__gt__comma__Initiation_comma__InitArgs_ellipsis__gt_/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_async_operation/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_conditional/ +/doc/html/boost_asio/reference/deferred_conditional/deferred_conditional.html +/doc/html/boost_asio/reference/deferred_conditional.html +/doc/html/boost_asio/reference/deferred_conditional/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_conditional/otherwise.html +/doc/html/boost_asio/reference/deferred_conditional/then.html +/doc/html/boost_asio/reference/deferred_function/ +/doc/html/boost_asio/reference/deferred_function/deferred_function.html +/doc/html/boost_asio/reference/deferred_function/function_.html +/doc/html/boost_asio/reference/deferred_function.html +/doc/html/boost_asio/reference/deferred_function/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred.html +/doc/html/boost_asio/reference/deferred_init_tag.html +/doc/html/boost_asio/reference/deferred_noop/ +/doc/html/boost_asio/reference/deferred_noop.html +/doc/html/boost_asio/reference/deferred_noop/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_sequence/ +/doc/html/boost_asio/reference/deferred_sequence/deferred_sequence.html +/doc/html/boost_asio/reference/deferred_sequence.html +/doc/html/boost_asio/reference/deferred_sequence/operator_lp__rp_/ +/doc/html/boost_asio/reference/deferred_sequence/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_sequence/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/deferred_sequence/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/deferred_signatures.html +/doc/html/boost_asio/reference/deferred_t/ +/doc/html/boost_asio/reference/deferred_t/as_default_on.html +/doc/html/boost_asio/reference/deferred_t/deferred_t.html +/doc/html/boost_asio/reference/deferred_t__executor_with_default/ +/doc/html/boost_asio/reference/deferred_t__executor_with_default/default_completion_token_type.html +/doc/html/boost_asio/reference/deferred_t__executor_with_default/executor_with_default.html +/doc/html/boost_asio/reference/deferred_t__executor_with_default.html +/doc/html/boost_asio/reference/deferred_t.html +/doc/html/boost_asio/reference/deferred_t/operator_lp__rp_/ +/doc/html/boost_asio/reference/deferred_t/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_t/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/deferred_t/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/deferred_t/values.html +/doc/html/boost_asio/reference/deferred_t/when.html +/doc/html/boost_asio/reference/deferred_values/ +/doc/html/boost_asio/reference/deferred_values/deferred_values.html +/doc/html/boost_asio/reference/deferred_values/detail__index_sequence_for.html +/doc/html/boost_asio/reference/deferred_values.html +/doc/html/boost_asio/reference/deferred_values__initiate/ +/doc/html/boost_asio/reference/deferred_values__initiate.html +/doc/html/boost_asio/reference/deferred_values__initiate/operator_lp__rp_.html +/doc/html/boost_asio/reference/deferred_values/operator_lp__rp_.html /doc/html/boost_asio/reference/detached.html /doc/html/boost_asio/reference/detached_t/ /doc/html/boost_asio/reference/detached_t/as_default_on.html @@ -2625,6 +3693,7 @@ /doc/html/boost_asio/reference/detached_t__executor_with_default/executor_with_default/overload2.html /doc/html/boost_asio/reference/detached_t__executor_with_default.html /doc/html/boost_asio/reference/detached_t.html +/doc/html/boost_asio/reference/disable_cancellation.html /doc/html/boost_asio/reference/dispatch/ /doc/html/boost_asio/reference/dispatch.html /doc/html/boost_asio/reference/dispatch/overload1.html @@ -2683,11 +3752,15 @@ /doc/html/boost_asio/reference/dynamic_vector_buffer/prepare.html /doc/html/boost_asio/reference/dynamic_vector_buffer/shrink.html /doc/html/boost_asio/reference/dynamic_vector_buffer/size.html +/doc/html/boost_asio/reference/enable_partial_cancellation.html +/doc/html/boost_asio/reference/enable_terminal_cancellation.html +/doc/html/boost_asio/reference/enable_total_cancellation.html /doc/html/boost_asio/reference/Endpoint.html /doc/html/boost_asio/reference/EndpointSequence.html /doc/html/boost_asio/reference/error__addrinfo_category.html /doc/html/boost_asio/reference/error__addrinfo_errors.html /doc/html/boost_asio/reference/error__basic_errors.html +/doc/html/boost_asio/reference/error__clear.html /doc/html/boost_asio/reference/error__get_addrinfo_category.html /doc/html/boost_asio/reference/error__get_misc_category.html /doc/html/boost_asio/reference/error__get_netdb_category.html @@ -2719,12 +3792,16 @@ /doc/html/boost_asio/reference/execution__any_executor/any_executor/ /doc/html/boost_asio/reference/execution__any_executor/_any_executor.html /doc/html/boost_asio/reference/execution__any_executor/any_executor.html +/doc/html/boost_asio/reference/execution__any_executor/any_executor/overload10.html /doc/html/boost_asio/reference/execution__any_executor/any_executor/overload1.html /doc/html/boost_asio/reference/execution__any_executor/any_executor/overload2.html /doc/html/boost_asio/reference/execution__any_executor/any_executor/overload3.html /doc/html/boost_asio/reference/execution__any_executor/any_executor/overload4.html /doc/html/boost_asio/reference/execution__any_executor/any_executor/overload5.html /doc/html/boost_asio/reference/execution__any_executor/any_executor/overload6.html +/doc/html/boost_asio/reference/execution__any_executor/any_executor/overload7.html +/doc/html/boost_asio/reference/execution__any_executor/any_executor/overload8.html +/doc/html/boost_asio/reference/execution__any_executor/any_executor/overload9.html /doc/html/boost_asio/reference/execution__any_executor/context.html /doc/html/boost_asio/reference/execution__any_executor/execute.html /doc/html/boost_asio/reference/execution__any_executor.html @@ -3158,6 +4235,254 @@ /doc/html/boost_asio/reference/executor_work_guard.html /doc/html/boost_asio/reference/executor_work_guard/owns_work.html /doc/html/boost_asio/reference/executor_work_guard/reset.html +/doc/html/boost_asio/reference/experimental__as_single.html +/doc/html/boost_asio/reference/experimental__as_single_t/ +/doc/html/boost_asio/reference/experimental__as_single_t/as_default_on.html +/doc/html/boost_asio/reference/experimental__as_single_t/as_single_t/ +/doc/html/boost_asio/reference/experimental__as_single_t/as_single_t.html +/doc/html/boost_asio/reference/experimental__as_single_t/as_single_t/overload1.html +/doc/html/boost_asio/reference/experimental__as_single_t/as_single_t/overload2.html +/doc/html/boost_asio/reference/experimental__as_single_t__default_constructor_tag.html +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default/ +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default/default_completion_token_type.html +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default/executor_with_default/ +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default/executor_with_default.html +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default/executor_with_default/overload1.html +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default/executor_with_default/overload2.html +/doc/html/boost_asio/reference/experimental__as_single_t__executor_with_default.html +/doc/html/boost_asio/reference/experimental__as_single_t.html +/doc/html/boost_asio/reference/experimental__as_single_t/token_.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/ +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload1.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload2.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload3.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload4.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload5.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator__amp__amp_/overload6.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/ +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload1.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload2.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload3.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload4.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload5.html +/doc/html/boost_asio/reference/experimental__awaitable_operators__operator_pipe__pipe_/overload6.html +/doc/html/boost_asio/reference/experimental__basic_channel/ +/doc/html/boost_asio/reference/experimental__basic_channel/async_receive.html +/doc/html/boost_asio/reference/experimental__basic_channel/async_send.html +/doc/html/boost_asio/reference/experimental__basic_channel/basic_channel/ +/doc/html/boost_asio/reference/experimental__basic_channel/_basic_channel.html +/doc/html/boost_asio/reference/experimental__basic_channel/basic_channel.html +/doc/html/boost_asio/reference/experimental__basic_channel/basic_channel/overload1.html +/doc/html/boost_asio/reference/experimental__basic_channel/basic_channel/overload2.html +/doc/html/boost_asio/reference/experimental__basic_channel/basic_channel/overload3.html +/doc/html/boost_asio/reference/experimental__basic_channel/basic_channel/overload4.html +/doc/html/boost_asio/reference/experimental__basic_channel/cancel.html +/doc/html/boost_asio/reference/experimental__basic_channel/capacity.html +/doc/html/boost_asio/reference/experimental__basic_channel/close.html +/doc/html/boost_asio/reference/experimental__basic_channel/executor_type.html +/doc/html/boost_asio/reference/experimental__basic_channel/get_executor.html +/doc/html/boost_asio/reference/experimental__basic_channel.html +/doc/html/boost_asio/reference/experimental__basic_channel/is_open.html +/doc/html/boost_asio/reference/experimental__basic_channel/operator_eq_/ +/doc/html/boost_asio/reference/experimental__basic_channel/operator_eq_.html +/doc/html/boost_asio/reference/experimental__basic_channel/operator_eq_/overload1.html +/doc/html/boost_asio/reference/experimental__basic_channel/operator_eq_/overload2.html +/doc/html/boost_asio/reference/experimental__basic_channel/ready.html +/doc/html/boost_asio/reference/experimental__basic_channel__rebind_executor/ +/doc/html/boost_asio/reference/experimental__basic_channel__rebind_executor.html +/doc/html/boost_asio/reference/experimental__basic_channel__rebind_executor/other.html +/doc/html/boost_asio/reference/experimental__basic_channel/reset.html +/doc/html/boost_asio/reference/experimental__basic_channel/traits_type.html +/doc/html/boost_asio/reference/experimental__basic_channel/try_receive.html +/doc/html/boost_asio/reference/experimental__basic_channel/try_send.html +/doc/html/boost_asio/reference/experimental__basic_channel/try_send_n.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/ +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/async_receive.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/async_send.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/ +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/_basic_concurrent_channel.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload1.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload2.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload3.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/basic_concurrent_channel/overload4.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/cancel.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/capacity.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/close.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/executor_type.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/get_executor.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/is_open.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/operator_eq_/ +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/operator_eq_.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/operator_eq_/overload1.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/operator_eq_/overload2.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/ready.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel__rebind_executor/ +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel__rebind_executor.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel__rebind_executor/other.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/reset.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/traits_type.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/try_receive.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/try_send.html +/doc/html/boost_asio/reference/experimental__basic_concurrent_channel/try_send_n.html +/doc/html/boost_asio/reference/experimental__channel_traits/ +/doc/html/boost_asio/reference/experimental__channel_traits__container/ +/doc/html/boost_asio/reference/experimental__channel_traits__container.html +/doc/html/boost_asio/reference/experimental__channel_traits__container/type.html +/doc/html/boost_asio/reference/experimental__channel_traits.html +/doc/html/boost_asio/reference/experimental__channel_traits/invoke_receive_cancelled.html +/doc/html/boost_asio/reference/experimental__channel_traits/invoke_receive_closed.html +/doc/html/boost_asio/reference/experimental__channel_traits__rebind/ +/doc/html/boost_asio/reference/experimental__channel_traits__rebind.html +/doc/html/boost_asio/reference/experimental__channel_traits__rebind/other.html +/doc/html/boost_asio/reference/experimental__channel_traits/receive_cancelled_signature.html +/doc/html/boost_asio/reference/experimental__channel_traits/receive_closed_signature.html +/doc/html/boost_asio/reference/experimental__co_composed.html +/doc/html/boost_asio/reference/experimental__coro/ +/doc/html/boost_asio/reference/experimental__coro/async_resume/ +/doc/html/boost_asio/reference/experimental__coro/async_resume.html +/doc/html/boost_asio/reference/experimental__coro/async_resume/overload1.html +/doc/html/boost_asio/reference/experimental__coro/async_resume/overload2.html +/doc/html/boost_asio/reference/experimental__coro/coro/ +/doc/html/boost_asio/reference/experimental__coro/_coro.html +/doc/html/boost_asio/reference/experimental__coro/coro.html +/doc/html/boost_asio/reference/experimental__coro/coro/overload1.html +/doc/html/boost_asio/reference/experimental__coro/coro/overload2.html +/doc/html/boost_asio/reference/experimental__coro/coro/overload3.html +/doc/html/boost_asio/reference/experimental__coro/get_allocator.html +/doc/html/boost_asio/reference/experimental__coro/get_executor.html +/doc/html/boost_asio/reference/experimental__coro.html +/doc/html/boost_asio/reference/experimental__coro/is_noexcept.html +/doc/html/boost_asio/reference/experimental__coro/is_open.html +/doc/html/boost_asio/reference/experimental__coro/operator_bool.html +/doc/html/boost_asio/reference/experimental__coro/operator_co_await.html +/doc/html/boost_asio/reference/experimental__coro/operator_eq_/ +/doc/html/boost_asio/reference/experimental__coro/operator_eq_.html +/doc/html/boost_asio/reference/experimental__coro/operator_eq_/overload1.html +/doc/html/boost_asio/reference/experimental__coro/operator_eq_/overload2.html +/doc/html/boost_asio/reference/experimental__coro/operator_lp__rp_.html +/doc/html/boost_asio/reference/experimental__coro_traits/ +/doc/html/boost_asio/reference/experimental__coro_traits.html +/doc/html/boost_asio/reference/experimental__coro_traits/is_noexcept.html +/doc/html/boost_asio/reference/experimental__co_spawn/ +/doc/html/boost_asio/reference/experimental__co_spawn.html +/doc/html/boost_asio/reference/experimental__co_spawn/overload1.html +/doc/html/boost_asio/reference/experimental__co_spawn/overload2.html +/doc/html/boost_asio/reference/experimental__co_spawn/overload3.html +/doc/html/boost_asio/reference/experimental__co_spawn/overload4.html +/doc/html/boost_asio/reference/experimental__co_spawn/overload5.html +/doc/html/boost_asio/reference/experimental__co_spawn/overload6.html +/doc/html/boost_asio/reference/experimental__error__channel_category.html +/doc/html/boost_asio/reference/experimental__error__channel_errors.html +/doc/html/boost_asio/reference/experimental__error__get_channel_category.html +/doc/html/boost_asio/reference/experimental__error__make_error_code.html +/doc/html/boost_asio/reference/experimental__is_async_operation_range/ +/doc/html/boost_asio/reference/experimental__is_async_operation_range.html +/doc/html/boost_asio/reference/experimental__is_async_operation_range/value.html +/doc/html/boost_asio/reference/experimental__is_promise.html +/doc/html/boost_asio/reference/experimental__is_promise_lt__promise_lt__Ts_ellipsis__gt__gt_.html +/doc/html/boost_asio/reference/experimental__is_promise_v.html +/doc/html/boost_asio/reference/experimental__make_parallel_group/ +/doc/html/boost_asio/reference/experimental__make_parallel_group.html +/doc/html/boost_asio/reference/experimental__make_parallel_group/overload1.html +/doc/html/boost_asio/reference/experimental__make_parallel_group/overload2.html +/doc/html/boost_asio/reference/experimental__make_parallel_group/overload3.html +/doc/html/boost_asio/reference/experimental__parallel_group/ +/doc/html/boost_asio/reference/experimental__parallel_group/async_wait.html +/doc/html/boost_asio/reference/experimental__parallel_group.html +/doc/html/boost_asio/reference/experimental__parallel_group/parallel_group.html +/doc/html/boost_asio/reference/experimental__parallel_group/signature.html +/doc/html/boost_asio/reference/experimental__promise/ +/doc/html/boost_asio/reference/experimental__promise/cancel.html +/doc/html/boost_asio/reference/experimental__promise/completed.html +/doc/html/boost_asio/reference/experimental__promise.html +/doc/html/boost_asio/reference/experimental__promise/operator_lp__rp_.html +/doc/html/boost_asio/reference/experimental__promise/promise/ +/doc/html/boost_asio/reference/experimental__promise/_promise.html +/doc/html/boost_asio/reference/experimental__promise/promise.html +/doc/html/boost_asio/reference/experimental__promise/promise/overload1.html +/doc/html/boost_asio/reference/experimental__promise/promise/overload2.html +/doc/html/boost_asio/reference/experimental__promise/promise/overload3.html +/doc/html/boost_asio/reference/experimental__promise_value_type.html +/doc/html/boost_asio/reference/experimental__promise_value_type_lt__gt_.html +/doc/html/boost_asio/reference/experimental__promise_value_type_lt__T__gt_.html +/doc/html/boost_asio/reference/experimental__ranged_parallel_group/ +/doc/html/boost_asio/reference/experimental__ranged_parallel_group/async_wait.html +/doc/html/boost_asio/reference/experimental__ranged_parallel_group.html +/doc/html/boost_asio/reference/experimental__ranged_parallel_group/ranged_parallel_group.html +/doc/html/boost_asio/reference/experimental__ranged_parallel_group/signature.html +/doc/html/boost_asio/reference/experimental__use_coro.html +/doc/html/boost_asio/reference/experimental__use_coro_t/ +/doc/html/boost_asio/reference/experimental__use_coro_t/allocator_type.html +/doc/html/boost_asio/reference/experimental__use_coro_t/as_default_on.html +/doc/html/boost_asio/reference/experimental__use_coro_t__executor_with_default/ +/doc/html/boost_asio/reference/experimental__use_coro_t__executor_with_default/default_completion_token_type.html +/doc/html/boost_asio/reference/experimental__use_coro_t__executor_with_default/executor_with_default.html +/doc/html/boost_asio/reference/experimental__use_coro_t__executor_with_default.html +/doc/html/boost_asio/reference/experimental__use_coro_t/get_allocator.html +/doc/html/boost_asio/reference/experimental__use_coro_t.html +/doc/html/boost_asio/reference/experimental__use_coro_t/rebind.html +/doc/html/boost_asio/reference/experimental__use_coro_t/use_coro_t/ +/doc/html/boost_asio/reference/experimental__use_coro_t/use_coro_t.html +/doc/html/boost_asio/reference/experimental__use_coro_t/use_coro_t/overload1.html +/doc/html/boost_asio/reference/experimental__use_coro_t/use_coro_t/overload2.html +/doc/html/boost_asio/reference/experimental__use_promise.html +/doc/html/boost_asio/reference/experimental__use_promise_t/ +/doc/html/boost_asio/reference/experimental__use_promise_t/allocator_type.html +/doc/html/boost_asio/reference/experimental__use_promise_t/as_default_on.html +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default/ +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default/default_completion_token_type.html +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default/ +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default.html +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default/overload1.html +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default/executor_with_default/overload2.html +/doc/html/boost_asio/reference/experimental__use_promise_t__executor_with_default.html +/doc/html/boost_asio/reference/experimental__use_promise_t/get_allocator.html +/doc/html/boost_asio/reference/experimental__use_promise_t.html +/doc/html/boost_asio/reference/experimental__use_promise_t/rebind.html +/doc/html/boost_asio/reference/experimental__use_promise_t/use_promise_t/ +/doc/html/boost_asio/reference/experimental__use_promise_t/use_promise_t.html +/doc/html/boost_asio/reference/experimental__use_promise_t/use_promise_t/overload1.html +/doc/html/boost_asio/reference/experimental__use_promise_t/use_promise_t/overload2.html +/doc/html/boost_asio/reference/experimental__wait_for_all/ +/doc/html/boost_asio/reference/experimental__wait_for_all.html +/doc/html/boost_asio/reference/experimental__wait_for_all/operator_lp__rp_.html +/doc/html/boost_asio/reference/experimental__wait_for_one/ +/doc/html/boost_asio/reference/experimental__wait_for_one_error/ +/doc/html/boost_asio/reference/experimental__wait_for_one_error.html +/doc/html/boost_asio/reference/experimental__wait_for_one_error/operator_lp__rp_/ +/doc/html/boost_asio/reference/experimental__wait_for_one_error/operator_lp__rp_.html +/doc/html/boost_asio/reference/experimental__wait_for_one_error/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/experimental__wait_for_one_error/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/experimental__wait_for_one_error/operator_lp__rp_/overload3.html +/doc/html/boost_asio/reference/experimental__wait_for_one_error/wait_for_one_error.html +/doc/html/boost_asio/reference/experimental__wait_for_one.html +/doc/html/boost_asio/reference/experimental__wait_for_one/operator_lp__rp_.html +/doc/html/boost_asio/reference/experimental__wait_for_one_success/ +/doc/html/boost_asio/reference/experimental__wait_for_one_success.html +/doc/html/boost_asio/reference/experimental__wait_for_one_success/operator_lp__rp_/ +/doc/html/boost_asio/reference/experimental__wait_for_one_success/operator_lp__rp_.html +/doc/html/boost_asio/reference/experimental__wait_for_one_success/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/experimental__wait_for_one_success/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/experimental__wait_for_one_success/operator_lp__rp_/overload3.html +/doc/html/boost_asio/reference/experimental__wait_for_one_success/wait_for_one_success.html +/doc/html/boost_asio/reference/experimental__wait_for_one/wait_for_one.html +/doc/html/boost_asio/reference/file_base/ +/doc/html/boost_asio/reference/file_base/append.html +/doc/html/boost_asio/reference/file_base/create.html +/doc/html/boost_asio/reference/file_base/exclusive.html +/doc/html/boost_asio/reference/file_base/_file_base.html +/doc/html/boost_asio/reference/file_base/flags.html +/doc/html/boost_asio/reference/file_base.html +/doc/html/boost_asio/reference/file_base/read_only.html +/doc/html/boost_asio/reference/file_base/read_write.html +/doc/html/boost_asio/reference/file_base/seek_basis.html +/doc/html/boost_asio/reference/file_base/sync_all_on_write.html +/doc/html/boost_asio/reference/file_base/truncate.html +/doc/html/boost_asio/reference/file_base/write_only.html /doc/html/boost_asio/reference/generic__basic_endpoint/ /doc/html/boost_asio/reference/generic__basic_endpoint/basic_endpoint/ /doc/html/boost_asio/reference/generic__basic_endpoint/basic_endpoint.html @@ -3240,17 +4565,55 @@ /doc/html/boost_asio/reference/get_associated_allocator.html /doc/html/boost_asio/reference/get_associated_allocator/overload1.html /doc/html/boost_asio/reference/get_associated_allocator/overload2.html +/doc/html/boost_asio/reference/get_associated_cancellation_slot/ +/doc/html/boost_asio/reference/get_associated_cancellation_slot.html +/doc/html/boost_asio/reference/get_associated_cancellation_slot/overload1.html +/doc/html/boost_asio/reference/get_associated_cancellation_slot/overload2.html /doc/html/boost_asio/reference/get_associated_executor/ /doc/html/boost_asio/reference/get_associated_executor.html /doc/html/boost_asio/reference/get_associated_executor/overload1.html /doc/html/boost_asio/reference/get_associated_executor/overload2.html /doc/html/boost_asio/reference/get_associated_executor/overload3.html +/doc/html/boost_asio/reference/get_associated_immediate_executor/ +/doc/html/boost_asio/reference/get_associated_immediate_executor.html +/doc/html/boost_asio/reference/get_associated_immediate_executor/overload1.html +/doc/html/boost_asio/reference/get_associated_immediate_executor/overload2.html /doc/html/boost_asio/reference/GettableSerialPortOption.html /doc/html/boost_asio/reference/GettableSocketOption.html /doc/html/boost_asio/reference/Handler.html /doc/html/boost_asio/reference/HandshakeHandler.html +/doc/html/boost_asio/reference/HandshakeToken.html /doc/html/boost_asio/reference/high_resolution_timer.html /doc/html/boost_asio/reference.html +/doc/html/boost_asio/reference/immediate_executor_binder/ +/doc/html/boost_asio/reference/immediate_executor_binder/argument_type.html +/doc/html/boost_asio/reference/immediate_executor_binder/first_argument_type.html +/doc/html/boost_asio/reference/immediate_executor_binder/get/ +/doc/html/boost_asio/reference/immediate_executor_binder/get.html +/doc/html/boost_asio/reference/immediate_executor_binder/get_immediate_executor.html +/doc/html/boost_asio/reference/immediate_executor_binder/get/overload1.html +/doc/html/boost_asio/reference/immediate_executor_binder/get/overload2.html +/doc/html/boost_asio/reference/immediate_executor_binder.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/ +/doc/html/boost_asio/reference/immediate_executor_binder/_immediate_executor_binder.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload1.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload2.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload3.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload4.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload5.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload6.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload7.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload8.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_binder/overload9.html +/doc/html/boost_asio/reference/immediate_executor_binder/immediate_executor_type.html +/doc/html/boost_asio/reference/immediate_executor_binder/operator_lp__rp_/ +/doc/html/boost_asio/reference/immediate_executor_binder/operator_lp__rp_.html +/doc/html/boost_asio/reference/immediate_executor_binder/operator_lp__rp_/overload1.html +/doc/html/boost_asio/reference/immediate_executor_binder/operator_lp__rp_/overload2.html +/doc/html/boost_asio/reference/immediate_executor_binder/result_type.html +/doc/html/boost_asio/reference/immediate_executor_binder/second_argument_type.html +/doc/html/boost_asio/reference/immediate_executor_binder/target_type.html /doc/html/boost_asio/reference/InternetProtocol.html /doc/html/boost_asio/reference/invalid_service_owner/ /doc/html/boost_asio/reference/invalid_service_owner.html @@ -3689,6 +5052,7 @@ /doc/html/boost_asio/reference/ip__basic_resolver/basic_resolver/overload1.html /doc/html/boost_asio/reference/ip__basic_resolver/basic_resolver/overload2.html /doc/html/boost_asio/reference/ip__basic_resolver/basic_resolver/overload3.html +/doc/html/boost_asio/reference/ip__basic_resolver/basic_resolver/overload4.html /doc/html/boost_asio/reference/ip__basic_resolver/cancel.html /doc/html/boost_asio/reference/ip__basic_resolver/canonical_name.html /doc/html/boost_asio/reference/ip__basic_resolver/endpoint_type.html @@ -3746,7 +5110,10 @@ /doc/html/boost_asio/reference/ip__basic_resolver_iterator/value_type.html /doc/html/boost_asio/reference/ip__basic_resolver/numeric_host.html /doc/html/boost_asio/reference/ip__basic_resolver/numeric_service.html +/doc/html/boost_asio/reference/ip__basic_resolver/operator_eq_/ /doc/html/boost_asio/reference/ip__basic_resolver/operator_eq_.html +/doc/html/boost_asio/reference/ip__basic_resolver/operator_eq_/overload1.html +/doc/html/boost_asio/reference/ip__basic_resolver/operator_eq_/overload2.html /doc/html/boost_asio/reference/ip__basic_resolver/passive.html /doc/html/boost_asio/reference/ip__basic_resolver/protocol_type.html /doc/html/boost_asio/reference/ip__basic_resolver_query/ @@ -3920,6 +5287,7 @@ /doc/html/boost_asio/reference/ip__network_v6/to_string.html /doc/html/boost_asio/reference/ip__network_v6/to_string/overload1.html /doc/html/boost_asio/reference/ip__network_v6/to_string/overload2.html +/doc/html/boost_asio/reference/ip__port_type.html /doc/html/boost_asio/reference/ip__resolver_base/ /doc/html/boost_asio/reference/ip__resolver_base/address_configured.html /doc/html/boost_asio/reference/ip__resolver_base/all_matching.html @@ -3942,6 +5310,7 @@ /doc/html/boost_asio/reference/ip__resolver_query_base/passive.html /doc/html/boost_asio/reference/ip__resolver_query_base/_resolver_query_base.html /doc/html/boost_asio/reference/ip__resolver_query_base/v4_mapped.html +/doc/html/boost_asio/reference/ip__scope_id_type.html /doc/html/boost_asio/reference/ip__tcp/ /doc/html/boost_asio/reference/ip__tcp/acceptor.html /doc/html/boost_asio/reference/ip__tcp/endpoint.html @@ -3973,7 +5342,10 @@ /doc/html/boost_asio/reference/ip__v4_mapped_t.html /doc/html/boost_asio/reference/ip__v6_only.html /doc/html/boost_asio/reference/is_applicable_property.html +/doc/html/boost_asio/reference/is_async_operation.html /doc/html/boost_asio/reference/is_const_buffer_sequence.html +/doc/html/boost_asio/reference/is_contiguous_iterator.html +/doc/html/boost_asio/reference/is_deferred.html /doc/html/boost_asio/reference/is_dynamic_buffer.html /doc/html/boost_asio/reference/is_dynamic_buffer_v1.html /doc/html/boost_asio/reference/is_dynamic_buffer_v2.html @@ -3986,6 +5358,9 @@ /doc/html/boost_asio/reference/is_error_code_enum_lt__basic_errors__gt_/ /doc/html/boost_asio/reference/is_error_code_enum_lt__basic_errors__gt_.html /doc/html/boost_asio/reference/is_error_code_enum_lt__basic_errors__gt_/value.html +/doc/html/boost_asio/reference/is_error_code_enum_lt__boost__asio__experimental__error__channel_errors__gt_/ +/doc/html/boost_asio/reference/is_error_code_enum_lt__boost__asio__experimental__error__channel_errors__gt_.html +/doc/html/boost_asio/reference/is_error_code_enum_lt__boost__asio__experimental__error__channel_errors__gt_/value.html /doc/html/boost_asio/reference/is_error_code_enum_lt__boost__asio__ssl__error__stream_errors__gt_/ /doc/html/boost_asio/reference/is_error_code_enum_lt__boost__asio__ssl__error__stream_errors__gt_.html /doc/html/boost_asio/reference/is_error_code_enum_lt__boost__asio__ssl__error__stream_errors__gt_/value.html @@ -4014,6 +5389,7 @@ /doc/html/boost_asio/reference/is_write_buffered.html /doc/html/boost_asio/reference/is_write_buffered/value.html /doc/html/boost_asio/reference/IteratorConnectHandler.html +/doc/html/boost_asio/reference/IteratorConnectToken.html /doc/html/boost_asio/reference/LegacyCompletionHandler.html /doc/html/boost_asio/reference/local__basic_endpoint/ /doc/html/boost_asio/reference/local__basic_endpoint/basic_endpoint/ @@ -4057,6 +5433,14 @@ /doc/html/boost_asio/reference/local__datagram_protocol/protocol.html /doc/html/boost_asio/reference/local__datagram_protocol/socket.html /doc/html/boost_asio/reference/local__datagram_protocol/type.html +/doc/html/boost_asio/reference/local__seq_packet_protocol/ +/doc/html/boost_asio/reference/local__seq_packet_protocol/acceptor.html +/doc/html/boost_asio/reference/local__seq_packet_protocol/endpoint.html +/doc/html/boost_asio/reference/local__seq_packet_protocol/family.html +/doc/html/boost_asio/reference/local__seq_packet_protocol.html +/doc/html/boost_asio/reference/local__seq_packet_protocol/protocol.html +/doc/html/boost_asio/reference/local__seq_packet_protocol/socket.html +/doc/html/boost_asio/reference/local__seq_packet_protocol/type.html /doc/html/boost_asio/reference/local__stream_protocol/ /doc/html/boost_asio/reference/local__stream_protocol/acceptor.html /doc/html/boost_asio/reference/local__stream_protocol/endpoint.html @@ -4078,6 +5462,7 @@ /doc/html/boost_asio/reference/make_work_guard/overload4.html /doc/html/boost_asio/reference/make_work_guard/overload5.html /doc/html/boost_asio/reference/MoveAcceptHandler.html +/doc/html/boost_asio/reference/MoveAcceptToken.html /doc/html/boost_asio/reference/multiple_exceptions/ /doc/html/boost_asio/reference/multiple_exceptions/first_exception.html /doc/html/boost_asio/reference/multiple_exceptions.html @@ -4114,6 +5499,19 @@ /doc/html/boost_asio/reference/mutable_buffers_1/value_type.html /doc/html/boost_asio/reference/MutableBufferSequence.html /doc/html/boost_asio/reference/mutable_buffer/size.html +/doc/html/boost_asio/reference/mutable_registered_buffer/ +/doc/html/boost_asio/reference/mutable_registered_buffer/buffer.html +/doc/html/boost_asio/reference/mutable_registered_buffer/data.html +/doc/html/boost_asio/reference/mutable_registered_buffer.html +/doc/html/boost_asio/reference/mutable_registered_buffer/id.html +/doc/html/boost_asio/reference/mutable_registered_buffer/mutable_registered_buffer.html +/doc/html/boost_asio/reference/mutable_registered_buffer/operator_plus_/ +/doc/html/boost_asio/reference/mutable_registered_buffer/operator_plus__eq_.html +/doc/html/boost_asio/reference/mutable_registered_buffer/operator_plus_.html +/doc/html/boost_asio/reference/mutable_registered_buffer/operator_plus_/overload1.html +/doc/html/boost_asio/reference/mutable_registered_buffer/operator_plus_/overload2.html +/doc/html/boost_asio/reference/mutable_registered_buffer/size.html +/doc/html/boost_asio/reference/NullaryToken.html /doc/html/boost_asio/reference/null_buffers/ /doc/html/boost_asio/reference/null_buffers/begin.html /doc/html/boost_asio/reference/null_buffers/const_iterator.html @@ -4121,6 +5519,7 @@ /doc/html/boost_asio/reference/null_buffers.html /doc/html/boost_asio/reference/null_buffers/value_type.html /doc/html/boost_asio/reference/OperationState.html +/doc/html/boost_asio/reference/operator_pipe_.html /doc/html/boost_asio/reference/placeholders__bytes_transferred.html /doc/html/boost_asio/reference/placeholders__endpoint.html /doc/html/boost_asio/reference/placeholders__error.html @@ -4141,6 +5540,7 @@ /doc/html/boost_asio/reference/posix__basic_descriptor/basic_descriptor/overload3.html /doc/html/boost_asio/reference/posix__basic_descriptor/basic_descriptor/overload4.html /doc/html/boost_asio/reference/posix__basic_descriptor/basic_descriptor/overload5.html +/doc/html/boost_asio/reference/posix__basic_descriptor/basic_descriptor/overload6.html /doc/html/boost_asio/reference/posix__basic_descriptor/bytes_readable.html /doc/html/boost_asio/reference/posix__basic_descriptor/cancel/ /doc/html/boost_asio/reference/posix__basic_descriptor/cancel.html @@ -4153,7 +5553,6 @@ /doc/html/boost_asio/reference/posix__basic_descriptor/executor_type.html /doc/html/boost_asio/reference/posix__basic_descriptor/get_executor.html /doc/html/boost_asio/reference/posix__basic_descriptor.html -/doc/html/boost_asio/reference/posix__basic_descriptor/impl_.html /doc/html/boost_asio/reference/posix__basic_descriptor/io_control/ /doc/html/boost_asio/reference/posix__basic_descriptor/io_control.html /doc/html/boost_asio/reference/posix__basic_descriptor/io_control/overload1.html @@ -4176,7 +5575,10 @@ /doc/html/boost_asio/reference/posix__basic_descriptor/non_blocking/overload1.html /doc/html/boost_asio/reference/posix__basic_descriptor/non_blocking/overload2.html /doc/html/boost_asio/reference/posix__basic_descriptor/non_blocking/overload3.html +/doc/html/boost_asio/reference/posix__basic_descriptor/operator_eq_/ /doc/html/boost_asio/reference/posix__basic_descriptor/operator_eq_.html +/doc/html/boost_asio/reference/posix__basic_descriptor/operator_eq_/overload1.html +/doc/html/boost_asio/reference/posix__basic_descriptor/operator_eq_/overload2.html /doc/html/boost_asio/reference/posix__basic_descriptor__rebind_executor/ /doc/html/boost_asio/reference/posix__basic_descriptor__rebind_executor.html /doc/html/boost_asio/reference/posix__basic_descriptor__rebind_executor/other.html @@ -4201,6 +5603,7 @@ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload3.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload4.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload5.html +/doc/html/boost_asio/reference/posix__basic_stream_descriptor/basic_stream_descriptor/overload6.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/bytes_readable.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/cancel/ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/cancel.html @@ -4213,7 +5616,6 @@ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/executor_type.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/get_executor.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor.html -/doc/html/boost_asio/reference/posix__basic_stream_descriptor/impl_.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/io_control/ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/io_control.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/io_control/overload1.html @@ -4236,7 +5638,10 @@ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/non_blocking/overload1.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/non_blocking/overload2.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/non_blocking/overload3.html +/doc/html/boost_asio/reference/posix__basic_stream_descriptor/operator_eq_/ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/operator_eq_.html +/doc/html/boost_asio/reference/posix__basic_stream_descriptor/operator_eq_/overload1.html +/doc/html/boost_asio/reference/posix__basic_stream_descriptor/operator_eq_/overload2.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/read_some/ /doc/html/boost_asio/reference/posix__basic_stream_descriptor/read_some.html /doc/html/boost_asio/reference/posix__basic_stream_descriptor/read_some/overload1.html @@ -4270,14 +5675,23 @@ /doc/html/boost_asio/reference/prefer_result/ /doc/html/boost_asio/reference/prefer_result.html /doc/html/boost_asio/reference/prefer_result/type.html +/doc/html/boost_asio/reference/prepend.html +/doc/html/boost_asio/reference/prepend_t/ +/doc/html/boost_asio/reference/prepend_t.html +/doc/html/boost_asio/reference/prepend_t/prepend_t.html +/doc/html/boost_asio/reference/prepend_t/token_.html +/doc/html/boost_asio/reference/prepend_t/values_.html /doc/html/boost_asio/reference/ProtoAllocator.html /doc/html/boost_asio/reference/Protocol.html /doc/html/boost_asio/reference/query.html /doc/html/boost_asio/reference/query_result/ /doc/html/boost_asio/reference/query_result.html /doc/html/boost_asio/reference/query_result/type.html +/doc/html/boost_asio/reference/random_access_file.html /doc/html/boost_asio/reference/RangeConnectHandler.html +/doc/html/boost_asio/reference/RangeConnectToken.html /doc/html/boost_asio/reference/read/ +/doc/html/boost_asio/reference/readable_pipe.html /doc/html/boost_asio/reference/read_at/ /doc/html/boost_asio/reference/read_at.html /doc/html/boost_asio/reference/read_at/overload1.html @@ -4306,6 +5720,7 @@ /doc/html/boost_asio/reference/read/overload7.html /doc/html/boost_asio/reference/read/overload8.html /doc/html/boost_asio/reference/read/overload9.html +/doc/html/boost_asio/reference/ReadToken.html /doc/html/boost_asio/reference/read_until/ /doc/html/boost_asio/reference/read_until.html /doc/html/boost_asio/reference/read_until/overload10.html @@ -4334,12 +5749,51 @@ /doc/html/boost_asio/reference/read_until/overload9.html /doc/html/boost_asio/reference/read_write_operations.html /doc/html/boost_asio/reference/Receiver.html +/doc/html/boost_asio/reference/recycling_allocator/ +/doc/html/boost_asio/reference/recycling_allocator/allocate.html +/doc/html/boost_asio/reference/recycling_allocator/deallocate.html +/doc/html/boost_asio/reference/recycling_allocator.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/ +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/operator_eq__eq_.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/operator_not__eq_.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt___rebind/ +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt___rebind.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt___rebind/other.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator/ +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator/overload1.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/recycling_allocator/overload2.html +/doc/html/boost_asio/reference/recycling_allocator_lt__void__gt_/value_type.html +/doc/html/boost_asio/reference/recycling_allocator/operator_eq__eq_.html +/doc/html/boost_asio/reference/recycling_allocator/operator_not__eq_.html +/doc/html/boost_asio/reference/recycling_allocator__rebind/ +/doc/html/boost_asio/reference/recycling_allocator__rebind.html +/doc/html/boost_asio/reference/recycling_allocator__rebind/other.html +/doc/html/boost_asio/reference/recycling_allocator/recycling_allocator/ +/doc/html/boost_asio/reference/recycling_allocator/recycling_allocator.html +/doc/html/boost_asio/reference/recycling_allocator/recycling_allocator/overload1.html +/doc/html/boost_asio/reference/recycling_allocator/recycling_allocator/overload2.html +/doc/html/boost_asio/reference/recycling_allocator/value_type.html /doc/html/boost_asio/reference/redirect_error.html /doc/html/boost_asio/reference/redirect_error_t/ /doc/html/boost_asio/reference/redirect_error_t/ec_.html /doc/html/boost_asio/reference/redirect_error_t.html /doc/html/boost_asio/reference/redirect_error_t/redirect_error_t.html /doc/html/boost_asio/reference/redirect_error_t/token_.html +/doc/html/boost_asio/reference/register_buffers/ +/doc/html/boost_asio/reference/register_buffers.html +/doc/html/boost_asio/reference/register_buffers/overload1.html +/doc/html/boost_asio/reference/register_buffers/overload2.html +/doc/html/boost_asio/reference/register_buffers/overload3.html +/doc/html/boost_asio/reference/register_buffers/overload4.html +/doc/html/boost_asio/reference/registered_buffer_id/ +/doc/html/boost_asio/reference/registered_buffer_id.html +/doc/html/boost_asio/reference/registered_buffer_id/native_handle.html +/doc/html/boost_asio/reference/registered_buffer_id/native_handle_type.html +/doc/html/boost_asio/reference/registered_buffer_id/operator_eq__eq_.html +/doc/html/boost_asio/reference/registered_buffer_id/operator_not__eq_.html +/doc/html/boost_asio/reference/registered_buffer_id/registered_buffer_id.html /doc/html/boost_asio/reference/require_concept.html /doc/html/boost_asio/reference/require_concept_result/ /doc/html/boost_asio/reference/require_concept_result.html @@ -4350,6 +5804,7 @@ /doc/html/boost_asio/reference/require_result/type.html /doc/html/boost_asio/reference/ResolveHandler.html /doc/html/boost_asio/reference/resolver_errc__try_again.html +/doc/html/boost_asio/reference/ResolveToken.html /doc/html/boost_asio/reference/Scheduler.html /doc/html/boost_asio/reference/Sender.html /doc/html/boost_asio/reference/serial_port_base/ @@ -4396,8 +5851,15 @@ /doc/html/boost_asio/reference/SettableSerialPortOption.html /doc/html/boost_asio/reference/SettableSocketOption.html /doc/html/boost_asio/reference/ShutdownHandler.html +/doc/html/boost_asio/reference/ShutdownToken.html /doc/html/boost_asio/reference/SignalHandler.html +/doc/html/boost_asio/reference/signal_set_base/ +/doc/html/boost_asio/reference/signal_set_base/flags.html +/doc/html/boost_asio/reference/signal_set_base/flags_t.html +/doc/html/boost_asio/reference/signal_set_base.html +/doc/html/boost_asio/reference/signal_set_base/_signal_set_base.html /doc/html/boost_asio/reference/signal_set.html +/doc/html/boost_asio/reference/SignalToken.html /doc/html/boost_asio/reference/socket_base/ /doc/html/boost_asio/reference/socket_base/broadcast.html /doc/html/boost_asio/reference/socket_base/bytes_readable.html @@ -4425,6 +5887,10 @@ /doc/html/boost_asio/reference/socket_base/wait_type.html /doc/html/boost_asio/reference/spawn/ /doc/html/boost_asio/reference/spawn.html +/doc/html/boost_asio/reference/spawn/overload10.html +/doc/html/boost_asio/reference/spawn/overload11.html +/doc/html/boost_asio/reference/spawn/overload12.html +/doc/html/boost_asio/reference/spawn/overload13.html /doc/html/boost_asio/reference/spawn/overload1.html /doc/html/boost_asio/reference/spawn/overload2.html /doc/html/boost_asio/reference/spawn/overload3.html @@ -4432,6 +5898,8 @@ /doc/html/boost_asio/reference/spawn/overload5.html /doc/html/boost_asio/reference/spawn/overload6.html /doc/html/boost_asio/reference/spawn/overload7.html +/doc/html/boost_asio/reference/spawn/overload8.html +/doc/html/boost_asio/reference/spawn/overload9.html /doc/html/boost_asio/reference/ssl__context/ /doc/html/boost_asio/reference/ssl__context/add_certificate_authority/ /doc/html/boost_asio/reference/ssl__context/add_certificate_authority.html @@ -4603,6 +6071,7 @@ /doc/html/boost_asio/reference/ssl__stream/next_layer/overload1.html /doc/html/boost_asio/reference/ssl__stream/next_layer/overload2.html /doc/html/boost_asio/reference/ssl__stream/next_layer_type.html +/doc/html/boost_asio/reference/ssl__stream/operator_eq_.html /doc/html/boost_asio/reference/ssl__stream/read_some/ /doc/html/boost_asio/reference/ssl__stream/read_some.html /doc/html/boost_asio/reference/ssl__stream/read_some/overload1.html @@ -4628,6 +6097,7 @@ /doc/html/boost_asio/reference/ssl__stream/stream.html /doc/html/boost_asio/reference/ssl__stream/stream/overload1.html /doc/html/boost_asio/reference/ssl__stream/stream/overload2.html +/doc/html/boost_asio/reference/ssl__stream/stream/overload3.html /doc/html/boost_asio/reference/ssl__stream/write_some/ /doc/html/boost_asio/reference/ssl__stream/write_some.html /doc/html/boost_asio/reference/ssl__stream/write_some/overload1.html @@ -4645,12 +6115,15 @@ /doc/html/boost_asio/reference/static_thread_pool.html /doc/html/boost_asio/reference/steady_timer.html /doc/html/boost_asio/reference/strand/ +/doc/html/boost_asio/reference/strand/context.html /doc/html/boost_asio/reference/strand/defer.html /doc/html/boost_asio/reference/strand/dispatch.html /doc/html/boost_asio/reference/strand/execute.html /doc/html/boost_asio/reference/strand/get_inner_executor.html /doc/html/boost_asio/reference/strand.html /doc/html/boost_asio/reference/strand/inner_executor_type.html +/doc/html/boost_asio/reference/strand/on_work_finished.html +/doc/html/boost_asio/reference/strand/on_work_started.html /doc/html/boost_asio/reference/strand/operator_eq_/ /doc/html/boost_asio/reference/strand/operator_eq__eq_.html /doc/html/boost_asio/reference/strand/operator_eq_.html @@ -4674,6 +6147,7 @@ /doc/html/boost_asio/reference/strand/strand/overload5.html /doc/html/boost_asio/reference/strand/strand/overload6.html /doc/html/boost_asio/reference/streambuf.html +/doc/html/boost_asio/reference/stream_file.html /doc/html/boost_asio/reference/synchronous_socket_operations.html /doc/html/boost_asio/reference/SyncRandomAccessReadDevice.html /doc/html/boost_asio/reference/SyncRandomAccessWriteDevice.html @@ -4700,10 +6174,23 @@ /doc/html/boost_asio/reference/system_context/use_service/overload2.html /doc/html/boost_asio/reference/system_executor.html /doc/html/boost_asio/reference/system_timer.html +/doc/html/boost_asio/reference/this_coro__cancellation_state.html +/doc/html/boost_asio/reference/this_coro__cancellation_state_t/ +/doc/html/boost_asio/reference/this_coro__cancellation_state_t/cancellation_state_t.html +/doc/html/boost_asio/reference/this_coro__cancellation_state_t.html /doc/html/boost_asio/reference/this_coro__executor.html /doc/html/boost_asio/reference/this_coro__executor_t/ /doc/html/boost_asio/reference/this_coro__executor_t/executor_t.html /doc/html/boost_asio/reference/this_coro__executor_t.html +/doc/html/boost_asio/reference/this_coro__reset_cancellation_state/ +/doc/html/boost_asio/reference/this_coro__reset_cancellation_state.html +/doc/html/boost_asio/reference/this_coro__reset_cancellation_state/overload1.html +/doc/html/boost_asio/reference/this_coro__reset_cancellation_state/overload2.html +/doc/html/boost_asio/reference/this_coro__reset_cancellation_state/overload3.html +/doc/html/boost_asio/reference/this_coro__throw_if_cancelled/ +/doc/html/boost_asio/reference/this_coro__throw_if_cancelled.html +/doc/html/boost_asio/reference/this_coro__throw_if_cancelled/overload1.html +/doc/html/boost_asio/reference/this_coro__throw_if_cancelled/overload2.html /doc/html/boost_asio/reference/thread_pool/ /doc/html/boost_asio/reference/thread_pool/add_service.html /doc/html/boost_asio/reference/thread_pool/attach.html @@ -4714,11 +6201,13 @@ /doc/html/boost_asio/reference/thread_pool__basic_executor_type/basic_executor_type/overload1.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/basic_executor_type/overload2.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/bulk_execute.html +/doc/html/boost_asio/reference/thread_pool__basic_executor_type/connect.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/context.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/defer.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/dispatch.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/execute.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type.html +/doc/html/boost_asio/reference/thread_pool__basic_executor_type/index_type.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/on_work_finished.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/on_work_started.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/operator_eq_/ @@ -4755,6 +6244,7 @@ /doc/html/boost_asio/reference/thread_pool__basic_executor_type/running_in_this_thread.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/schedule.html /doc/html/boost_asio/reference/thread_pool__basic_executor_type/sender_type.html +/doc/html/boost_asio/reference/thread_pool__basic_executor_type/shape_type.html /doc/html/boost_asio/reference/thread_pool/destroy.html /doc/html/boost_asio/reference/thread_pool/executor.html /doc/html/boost_asio/reference/thread_pool/executor_type.html @@ -4797,10 +6287,7 @@ /doc/html/boost_asio/reference/use_awaitable_t/as_default_on.html /doc/html/boost_asio/reference/use_awaitable_t__executor_with_default/ /doc/html/boost_asio/reference/use_awaitable_t__executor_with_default/default_completion_token_type.html -/doc/html/boost_asio/reference/use_awaitable_t__executor_with_default/executor_with_default/ /doc/html/boost_asio/reference/use_awaitable_t__executor_with_default/executor_with_default.html -/doc/html/boost_asio/reference/use_awaitable_t__executor_with_default/executor_with_default/overload1.html -/doc/html/boost_asio/reference/use_awaitable_t__executor_with_default/executor_with_default/overload2.html /doc/html/boost_asio/reference/use_awaitable_t__executor_with_default.html /doc/html/boost_asio/reference/use_awaitable_t.html /doc/html/boost_asio/reference/use_awaitable_t/use_awaitable_t/ @@ -4821,6 +6308,7 @@ /doc/html/boost_asio/reference/use_future_t/use_future_t/overload2.html /doc/html/boost_asio/reference/uses_executor.html /doc/html/boost_asio/reference/WaitHandler.html +/doc/html/boost_asio/reference/WaitToken.html /doc/html/boost_asio/reference/wait_traits/ /doc/html/boost_asio/reference/WaitTraits.html /doc/html/boost_asio/reference/wait_traits.html @@ -4841,6 +6329,7 @@ /doc/html/boost_asio/reference/windows__basic_object_handle/basic_object_handle/overload3.html /doc/html/boost_asio/reference/windows__basic_object_handle/basic_object_handle/overload4.html /doc/html/boost_asio/reference/windows__basic_object_handle/basic_object_handle/overload5.html +/doc/html/boost_asio/reference/windows__basic_object_handle/basic_object_handle/overload6.html /doc/html/boost_asio/reference/windows__basic_object_handle/cancel/ /doc/html/boost_asio/reference/windows__basic_object_handle/cancel.html /doc/html/boost_asio/reference/windows__basic_object_handle/cancel/overload1.html @@ -4860,7 +6349,10 @@ /doc/html/boost_asio/reference/windows__basic_object_handle/lowest_layer_type.html /doc/html/boost_asio/reference/windows__basic_object_handle/native_handle.html /doc/html/boost_asio/reference/windows__basic_object_handle/native_handle_type.html +/doc/html/boost_asio/reference/windows__basic_object_handle/operator_eq_/ /doc/html/boost_asio/reference/windows__basic_object_handle/operator_eq_.html +/doc/html/boost_asio/reference/windows__basic_object_handle/operator_eq_/overload1.html +/doc/html/boost_asio/reference/windows__basic_object_handle/operator_eq_/overload2.html /doc/html/boost_asio/reference/windows__basic_object_handle__rebind_executor/ /doc/html/boost_asio/reference/windows__basic_object_handle__rebind_executor.html /doc/html/boost_asio/reference/windows__basic_object_handle__rebind_executor/other.html @@ -4881,6 +6373,7 @@ /doc/html/boost_asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload3.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload4.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload5.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/basic_overlapped_handle/overload6.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/cancel/ /doc/html/boost_asio/reference/windows__basic_overlapped_handle/cancel.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/cancel/overload1.html @@ -4892,7 +6385,6 @@ /doc/html/boost_asio/reference/windows__basic_overlapped_handle/executor_type.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/get_executor.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle.html -/doc/html/boost_asio/reference/windows__basic_overlapped_handle/impl_.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/is_open.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/lowest_layer/ /doc/html/boost_asio/reference/windows__basic_overlapped_handle/lowest_layer.html @@ -4901,10 +6393,17 @@ /doc/html/boost_asio/reference/windows__basic_overlapped_handle/lowest_layer_type.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/native_handle.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle/native_handle_type.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/operator_eq_/ /doc/html/boost_asio/reference/windows__basic_overlapped_handle/operator_eq_.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/operator_eq_/overload1.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/operator_eq_/overload2.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle__rebind_executor/ /doc/html/boost_asio/reference/windows__basic_overlapped_handle__rebind_executor.html /doc/html/boost_asio/reference/windows__basic_overlapped_handle__rebind_executor/other.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/release/ +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/release.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/release/overload1.html +/doc/html/boost_asio/reference/windows__basic_overlapped_handle/release/overload2.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/assign/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/assign.html @@ -4919,6 +6418,7 @@ /doc/html/boost_asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload3.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload4.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload5.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/basic_random_access_handle/overload6.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/cancel/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/cancel.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/cancel/overload1.html @@ -4930,7 +6430,6 @@ /doc/html/boost_asio/reference/windows__basic_random_access_handle/executor_type.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/get_executor.html /doc/html/boost_asio/reference/windows__basic_random_access_handle.html -/doc/html/boost_asio/reference/windows__basic_random_access_handle/impl_.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/is_open.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/lowest_layer/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/lowest_layer.html @@ -4939,7 +6438,10 @@ /doc/html/boost_asio/reference/windows__basic_random_access_handle/lowest_layer_type.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/native_handle.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/native_handle_type.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/operator_eq_/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/operator_eq_.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/operator_eq_/overload1.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/operator_eq_/overload2.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/read_some_at/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/read_some_at.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/read_some_at/overload1.html @@ -4947,6 +6449,10 @@ /doc/html/boost_asio/reference/windows__basic_random_access_handle__rebind_executor/ /doc/html/boost_asio/reference/windows__basic_random_access_handle__rebind_executor.html /doc/html/boost_asio/reference/windows__basic_random_access_handle__rebind_executor/other.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/release/ +/doc/html/boost_asio/reference/windows__basic_random_access_handle/release.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/release/overload1.html +/doc/html/boost_asio/reference/windows__basic_random_access_handle/release/overload2.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/write_some_at/ /doc/html/boost_asio/reference/windows__basic_random_access_handle/write_some_at.html /doc/html/boost_asio/reference/windows__basic_random_access_handle/write_some_at/overload1.html @@ -4965,6 +6471,7 @@ /doc/html/boost_asio/reference/windows__basic_stream_handle/basic_stream_handle/overload3.html /doc/html/boost_asio/reference/windows__basic_stream_handle/basic_stream_handle/overload4.html /doc/html/boost_asio/reference/windows__basic_stream_handle/basic_stream_handle/overload5.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/basic_stream_handle/overload6.html /doc/html/boost_asio/reference/windows__basic_stream_handle/cancel/ /doc/html/boost_asio/reference/windows__basic_stream_handle/cancel.html /doc/html/boost_asio/reference/windows__basic_stream_handle/cancel/overload1.html @@ -4976,7 +6483,6 @@ /doc/html/boost_asio/reference/windows__basic_stream_handle/executor_type.html /doc/html/boost_asio/reference/windows__basic_stream_handle/get_executor.html /doc/html/boost_asio/reference/windows__basic_stream_handle.html -/doc/html/boost_asio/reference/windows__basic_stream_handle/impl_.html /doc/html/boost_asio/reference/windows__basic_stream_handle/is_open.html /doc/html/boost_asio/reference/windows__basic_stream_handle/lowest_layer/ /doc/html/boost_asio/reference/windows__basic_stream_handle/lowest_layer.html @@ -4985,7 +6491,10 @@ /doc/html/boost_asio/reference/windows__basic_stream_handle/lowest_layer_type.html /doc/html/boost_asio/reference/windows__basic_stream_handle/native_handle.html /doc/html/boost_asio/reference/windows__basic_stream_handle/native_handle_type.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/operator_eq_/ /doc/html/boost_asio/reference/windows__basic_stream_handle/operator_eq_.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/operator_eq_/overload1.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/operator_eq_/overload2.html /doc/html/boost_asio/reference/windows__basic_stream_handle/read_some/ /doc/html/boost_asio/reference/windows__basic_stream_handle/read_some.html /doc/html/boost_asio/reference/windows__basic_stream_handle/read_some/overload1.html @@ -4993,6 +6502,10 @@ /doc/html/boost_asio/reference/windows__basic_stream_handle__rebind_executor/ /doc/html/boost_asio/reference/windows__basic_stream_handle__rebind_executor.html /doc/html/boost_asio/reference/windows__basic_stream_handle__rebind_executor/other.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/release/ +/doc/html/boost_asio/reference/windows__basic_stream_handle/release.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/release/overload1.html +/doc/html/boost_asio/reference/windows__basic_stream_handle/release/overload2.html /doc/html/boost_asio/reference/windows__basic_stream_handle/write_some/ /doc/html/boost_asio/reference/windows__basic_stream_handle/write_some.html /doc/html/boost_asio/reference/windows__basic_stream_handle/write_some/overload1.html @@ -5020,6 +6533,7 @@ /doc/html/boost_asio/reference/windows__overlapped_ptr/reset/overload3.html /doc/html/boost_asio/reference/windows__random_access_handle.html /doc/html/boost_asio/reference/windows__stream_handle.html +/doc/html/boost_asio/reference/writable_pipe.html /doc/html/boost_asio/reference/write/ /doc/html/boost_asio/reference/write_at/ /doc/html/boost_asio/reference/write_at.html @@ -5049,7 +6563,9 @@ /doc/html/boost_asio/reference/write/overload7.html /doc/html/boost_asio/reference/write/overload8.html /doc/html/boost_asio/reference/write/overload9.html +/doc/html/boost_asio/reference/WriteToken.html /doc/html/boost_asio/reference/yield_context.html +/doc/html/boost_asio/std_executors.html /doc/html/boost_asio/sync_op.png /doc/html/boost_asio/tutorial/ /doc/html/boost_asio/tutorial.html @@ -5092,167 +6608,15 @@ /doc/html/boost_asio/using.html /libs/ /libs/asio/ +/libs/asio/CMakeLists.txt /libs/asio/doc/ /libs/asio/doc/asio.qbk /libs/asio/doc/doxy2qbk.pl /libs/asio/doc/examples.qbk /libs/asio/doc/history.qbk -/libs/asio/doc/html/ -/libs/asio/doc/html/boost_asio/ -/libs/asio/doc/html/boost_asio/example/ -/libs/asio/doc/html/boost_asio/example/cpp03/ -/libs/asio/doc/html/boost_asio/example/cpp03/allocation/ -/libs/asio/doc/html/boost_asio/example/cpp03/buffers/ -/libs/asio/doc/html/boost_asio/example/cpp03/chat/ -/libs/asio/doc/html/boost_asio/example/cpp03/echo/ -/libs/asio/doc/html/boost_asio/example/cpp03/fork/ -/libs/asio/doc/html/boost_asio/example/cpp03/http/ -/libs/asio/doc/html/boost_asio/example/cpp03/http/client/ -/libs/asio/doc/html/boost_asio/example/cpp03/http/server/ -/libs/asio/doc/html/boost_asio/example/cpp03/http/server2/ -/libs/asio/doc/html/boost_asio/example/cpp03/http/server3/ -/libs/asio/doc/html/boost_asio/example/cpp03/http/server4/ -/libs/asio/doc/html/boost_asio/example/cpp03/icmp/ -/libs/asio/doc/html/boost_asio/example/cpp03/invocation/ -/libs/asio/doc/html/boost_asio/example/cpp03/iostreams/ -/libs/asio/doc/html/boost_asio/example/cpp03/local/ -/libs/asio/doc/html/boost_asio/example/cpp03/multicast/ -/libs/asio/doc/html/boost_asio/example/cpp03/nonblocking/ -/libs/asio/doc/html/boost_asio/example/cpp03/porthopper/ -/libs/asio/doc/html/boost_asio/example/cpp03/serialization/ -/libs/asio/doc/html/boost_asio/example/cpp03/services/ -/libs/asio/doc/html/boost_asio/example/cpp03/socks4/ -/libs/asio/doc/html/boost_asio/example/cpp03/spawn/ -/libs/asio/doc/html/boost_asio/example/cpp03/ssl/ -/libs/asio/doc/html/boost_asio/example/cpp03/timeouts/ -/libs/asio/doc/html/boost_asio/example/cpp03/timers/ -/libs/asio/doc/html/boost_asio/example/cpp03/windows/ -/libs/asio/doc/html/boost_asio/example/cpp11/ -/libs/asio/doc/html/boost_asio/example/cpp11/allocation/ -/libs/asio/doc/html/boost_asio/example/cpp11/buffers/ -/libs/asio/doc/html/boost_asio/example/cpp11/chat/ -/libs/asio/doc/html/boost_asio/example/cpp11/echo/ -/libs/asio/doc/html/boost_asio/example/cpp11/executors/ -/libs/asio/doc/html/boost_asio/example/cpp11/fork/ -/libs/asio/doc/html/boost_asio/example/cpp11/futures/ -/libs/asio/doc/html/boost_asio/example/cpp11/handler_tracking/ -/libs/asio/doc/html/boost_asio/example/cpp11/http/ -/libs/asio/doc/html/boost_asio/example/cpp11/http/server/ -/libs/asio/doc/html/boost_asio/example/cpp11/invocation/ -/libs/asio/doc/html/boost_asio/example/cpp11/local/ -/libs/asio/doc/html/boost_asio/example/cpp11/multicast/ -/libs/asio/doc/html/boost_asio/example/cpp11/nonblocking/ -/libs/asio/doc/html/boost_asio/example/cpp11/operations/ -/libs/asio/doc/html/boost_asio/example/cpp11/socks4/ -/libs/asio/doc/html/boost_asio/example/cpp11/spawn/ -/libs/asio/doc/html/boost_asio/example/cpp11/ssl/ -/libs/asio/doc/html/boost_asio/example/cpp11/timeouts/ -/libs/asio/doc/html/boost_asio/example/cpp11/timers/ -/libs/asio/doc/html/boost_asio/example/cpp14/ -/libs/asio/doc/html/boost_asio/example/cpp14/operations/ -/libs/asio/doc/html/boost_asio/example/cpp17/ -/libs/asio/doc/html/boost_asio/example/cpp17/coroutines_ts/ -/libs/asio/doc/html/boost_asio/examples/ -/libs/asio/doc/html/boost_asio/examples/cpp03_examples.html -/libs/asio/doc/html/boost_asio/examples/cpp11_examples.html -/libs/asio/doc/html/boost_asio/examples/cpp14_examples.html -/libs/asio/doc/html/boost_asio/examples/cpp17_examples.html -/libs/asio/doc/html/boost_asio/examples.html -/libs/asio/doc/html/boost_asio/history.html -/libs/asio/doc/html/boost_asio/index.html -/libs/asio/doc/html/boost_asio/net_ts.html -/libs/asio/doc/html/boost_asio/overview/ -/libs/asio/doc/html/boost_asio/overview/core/ -/libs/asio/doc/html/boost_asio/overview/core/allocation.html -/libs/asio/doc/html/boost_asio/overview/core/async.html -/libs/asio/doc/html/boost_asio/overview/core/basics.html -/libs/asio/doc/html/boost_asio/overview/core/buffers.html -/libs/asio/doc/html/boost_asio/overview/core/concurrency_hint.html -/libs/asio/doc/html/boost_asio/overview/core/coroutine.html -/libs/asio/doc/html/boost_asio/overview/core/coroutines_ts.html -/libs/asio/doc/html/boost_asio/overview/core/handler_tracking.html -/libs/asio/doc/html/boost_asio/overview/core.html -/libs/asio/doc/html/boost_asio/overview/core/line_based.html -/libs/asio/doc/html/boost_asio/overview/core/reactor.html -/libs/asio/doc/html/boost_asio/overview/core/spawn.html -/libs/asio/doc/html/boost_asio/overview/core/strands.html -/libs/asio/doc/html/boost_asio/overview/core/streams.html -/libs/asio/doc/html/boost_asio/overview/core/threads.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/ -/libs/asio/doc/html/boost_asio/overview/cpp2011/array.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/atomic.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/chrono.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/futures.html -/libs/asio/doc/html/boost_asio/overview/cpp2011.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/move_handlers.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/move_objects.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/shared_ptr.html -/libs/asio/doc/html/boost_asio/overview/cpp2011/variadic.html -/libs/asio/doc/html/boost_asio/overview.html -/libs/asio/doc/html/boost_asio/overview/implementation.html -/libs/asio/doc/html/boost_asio/overview/networking/ -/libs/asio/doc/html/boost_asio/overview/networking/bsd_sockets.html -/libs/asio/doc/html/boost_asio/overview/networking.html -/libs/asio/doc/html/boost_asio/overview/networking/iostreams.html -/libs/asio/doc/html/boost_asio/overview/networking/other_protocols.html -/libs/asio/doc/html/boost_asio/overview/networking/protocols.html -/libs/asio/doc/html/boost_asio/overview/posix/ -/libs/asio/doc/html/boost_asio/overview/posix/fork.html -/libs/asio/doc/html/boost_asio/overview/posix.html -/libs/asio/doc/html/boost_asio/overview/posix/local.html -/libs/asio/doc/html/boost_asio/overview/posix/stream_descriptor.html -/libs/asio/doc/html/boost_asio/overview/rationale.html -/libs/asio/doc/html/boost_asio/overview/serial_ports.html -/libs/asio/doc/html/boost_asio/overview/signals.html -/libs/asio/doc/html/boost_asio/overview/ssl.html -/libs/asio/doc/html/boost_asio/overview/timers.html -/libs/asio/doc/html/boost_asio/overview/windows/ -/libs/asio/doc/html/boost_asio/overview/windows.html -/libs/asio/doc/html/boost_asio/overview/windows/object_handle.html -/libs/asio/doc/html/boost_asio/overview/windows/random_access_handle.html -/libs/asio/doc/html/boost_asio/overview/windows/stream_handle.html -/libs/asio/doc/html/boost_asio/tutorial/ -/libs/asio/doc/html/boost_asio/tutorial.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime1/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime1.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime1/src.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime2/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime2.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime2/src.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime3/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime3.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime3/src.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime4/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime4.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime4/src.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime5/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime5.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime5/src.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime6/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime6.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime6/src.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime7/ -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime7.html -/libs/asio/doc/html/boost_asio/tutorial/tutdaytime7/src.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer1/ -/libs/asio/doc/html/boost_asio/tutorial/tuttimer1.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer1/src.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer2/ -/libs/asio/doc/html/boost_asio/tutorial/tuttimer2.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer2/src.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer3/ -/libs/asio/doc/html/boost_asio/tutorial/tuttimer3.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer3/src.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer4/ -/libs/asio/doc/html/boost_asio/tutorial/tuttimer4.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer4/src.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer5/ -/libs/asio/doc/html/boost_asio/tutorial/tuttimer5.html -/libs/asio/doc/html/boost_asio/tutorial/tuttimer5/src.html -/libs/asio/doc/html/boost_asio/using.html -/libs/asio/doc/html/index.html /libs/asio/doc/index.xml /libs/asio/doc/Jamfile.v2 +/libs/asio/doc/model_dox.txt /libs/asio/doc/net_ts.qbk /libs/asio/doc/noncopyable_dox.txt /libs/asio/doc/overview/ @@ -5265,18 +6629,51 @@ /libs/asio/doc/overview/basics.qbk /libs/asio/doc/overview/bsd_sockets.qbk /libs/asio/doc/overview/buffers.qbk +/libs/asio/doc/overview/cancellation.qbk +/libs/asio/doc/overview/channels.qbk +/libs/asio/doc/overview/compose.qbk /libs/asio/doc/overview/concurrency_hint.qbk +/libs/asio/doc/overview/coro.qbk /libs/asio/doc/overview/coroutine.qbk -/libs/asio/doc/overview/coroutines_ts.qbk /libs/asio/doc/overview/cpp2011.qbk +/libs/asio/doc/overview/cpp20_coroutines.qbk +/libs/asio/doc/overview/deferred.qbk +/libs/asio/doc/overview/files.qbk +/libs/asio/doc/overview/futures.qbk /libs/asio/doc/overview/handler_tracking.qbk +/libs/asio/doc/overview/immediate_completion.qbk /libs/asio/doc/overview/implementation.qbk /libs/asio/doc/overview/iostreams.qbk /libs/asio/doc/overview/line_based.qbk +/libs/asio/doc/overview/model/ +/libs/asio/doc/overview/model/allocators.qbk +/libs/asio/doc/overview/model/associators.qbk +/libs/asio/doc/overview/model/async_agent_chain.png +/libs/asio/doc/overview/model/async_agent_model.png +/libs/asio/doc/overview/model/async_agents.qbk +/libs/asio/doc/overview/model/async_child_agent_chain.png +/libs/asio/doc/overview/model/async_op_init_complete.png +/libs/asio/doc/overview/model/async_op_model.png +/libs/asio/doc/overview/model/async_op_phases.png +/libs/asio/doc/overview/model/async_ops.qbk +/libs/asio/doc/overview/model/async_op_trivial_chain.png +/libs/asio/doc/overview/model/cancellation.qbk +/libs/asio/doc/overview/model/child_agents.qbk +/libs/asio/doc/overview/model/completion_token_model.png +/libs/asio/doc/overview/model/completion_tokens.qbk +/libs/asio/doc/overview/model/completion_token_transform.png +/libs/asio/doc/overview/model/executors.qbk +/libs/asio/doc/overview/model/higher_level_model.png +/libs/asio/doc/overview/model/higher_levels.qbk +/libs/asio/doc/overview/model/library_elements.qbk +/libs/asio/doc/overview/model.qbk /libs/asio/doc/overview/other_protocols.qbk +/libs/asio/doc/overview/parallel_group.qbk +/libs/asio/doc/overview/pipes.qbk /libs/asio/doc/overview/posix.qbk /libs/asio/doc/overview/proactor.dot /libs/asio/doc/overview/proactor.png +/libs/asio/doc/overview/promises.qbk /libs/asio/doc/overview/protocols.qbk /libs/asio/doc/overview.qbk /libs/asio/doc/overview/rationale.qbk @@ -5291,7 +6688,11 @@ /libs/asio/doc/overview/sync_op.png /libs/asio/doc/overview/threads.qbk /libs/asio/doc/overview/timers.qbk +/libs/asio/doc/overview/token_adapters.qbk +/libs/asio/doc/overview/type_erasure.qbk /libs/asio/doc/overview/windows.qbk +/libs/asio/doc/platform_macros.pl +/libs/asio/doc/platform_macros.qbk /libs/asio/doc/quickref.xml /libs/asio/doc/reference.dox /libs/asio/doc/reference.qbk @@ -5299,6 +6700,7 @@ /libs/asio/doc/requirements/ /libs/asio/doc/requirements/AcceptableProtocol.qbk /libs/asio/doc/requirements/AcceptHandler.qbk +/libs/asio/doc/requirements/AcceptToken.qbk /libs/asio/doc/requirements/asynchronous_operations.qbk /libs/asio/doc/requirements/asynchronous_socket_operations.qbk /libs/asio/doc/requirements/AsyncRandomAccessReadDevice.qbk @@ -5306,10 +6708,13 @@ /libs/asio/doc/requirements/AsyncReadStream.qbk /libs/asio/doc/requirements/AsyncWriteStream.qbk /libs/asio/doc/requirements/BufferedHandshakeHandler.qbk +/libs/asio/doc/requirements/BufferedHandshakeToken.qbk +/libs/asio/doc/requirements/CancellationHandler.qbk +/libs/asio/doc/requirements/CancellationSlot.qbk /libs/asio/doc/requirements/CompletionCondition.qbk -/libs/asio/doc/requirements/CompletionHandler.qbk /libs/asio/doc/requirements/ConnectCondition.qbk /libs/asio/doc/requirements/ConnectHandler.qbk +/libs/asio/doc/requirements/ConnectToken.qbk /libs/asio/doc/requirements/ConstBufferSequence.qbk /libs/asio/doc/requirements/DynamicBuffer.qbk /libs/asio/doc/requirements/DynamicBuffer_v1.qbk @@ -5322,29 +6727,38 @@ /libs/asio/doc/requirements/GettableSocketOption.qbk /libs/asio/doc/requirements/Handler.qbk /libs/asio/doc/requirements/HandshakeHandler.qbk +/libs/asio/doc/requirements/HandshakeToken.qbk /libs/asio/doc/requirements/InternetProtocol.qbk /libs/asio/doc/requirements/IoControlCommand.qbk /libs/asio/doc/requirements/IoObjectService.qbk /libs/asio/doc/requirements/IteratorConnectHandler.qbk +/libs/asio/doc/requirements/IteratorConnectToken.qbk /libs/asio/doc/requirements/LegacyCompletionHandler.qbk /libs/asio/doc/requirements/MoveAcceptHandler.qbk +/libs/asio/doc/requirements/MoveAcceptToken.qbk /libs/asio/doc/requirements/MutableBufferSequence.qbk +/libs/asio/doc/requirements/NullaryToken.qbk /libs/asio/doc/requirements/OperationState.qbk /libs/asio/doc/requirements/ProtoAllocator.qbk /libs/asio/doc/requirements/Protocol.qbk /libs/asio/doc/requirements.qbk /libs/asio/doc/requirements/RangeConnectHandler.qbk +/libs/asio/doc/requirements/RangeConnectToken.qbk /libs/asio/doc/requirements/ReadHandler.qbk +/libs/asio/doc/requirements/ReadToken.qbk /libs/asio/doc/requirements/read_write_operations.qbk /libs/asio/doc/requirements/Receiver.qbk /libs/asio/doc/requirements/ResolveHandler.qbk +/libs/asio/doc/requirements/ResolveToken.qbk /libs/asio/doc/requirements/Scheduler.qbk /libs/asio/doc/requirements/Sender.qbk /libs/asio/doc/requirements/Service.qbk /libs/asio/doc/requirements/SettableSerialPortOption.qbk /libs/asio/doc/requirements/SettableSocketOption.qbk /libs/asio/doc/requirements/ShutdownHandler.qbk +/libs/asio/doc/requirements/ShutdownToken.qbk /libs/asio/doc/requirements/SignalHandler.qbk +/libs/asio/doc/requirements/SignalToken.qbk /libs/asio/doc/requirements/synchronous_socket_operations.qbk /libs/asio/doc/requirements/SyncRandomAccessReadDevice.qbk /libs/asio/doc/requirements/SyncRandomAccessWriteDevice.qbk @@ -5352,9 +6766,12 @@ /libs/asio/doc/requirements/SyncWriteStream.qbk /libs/asio/doc/requirements/TimeTraits.qbk /libs/asio/doc/requirements/WaitHandler.qbk +/libs/asio/doc/requirements/WaitToken.qbk /libs/asio/doc/requirements/WaitTraits.qbk /libs/asio/doc/requirements/WriteHandler.qbk +/libs/asio/doc/requirements/WriteToken.qbk /libs/asio/doc/std_exception_dox.txt +/libs/asio/doc/std_executors.qbk /libs/asio/doc/tutorial.dox /libs/asio/doc/tutorial.qbk /libs/asio/doc/tutorial.xsl @@ -5520,7 +6937,7 @@ /libs/asio/example/cpp03/ssl/ /libs/asio/example/cpp03/ssl/ca.pem /libs/asio/example/cpp03/ssl/client.cpp -/libs/asio/example/cpp03/ssl/dh2048.pem +/libs/asio/example/cpp03/ssl/dh4096.pem /libs/asio/example/cpp03/ssl/Jamfile.v2 /libs/asio/example/cpp03/ssl/README /libs/asio/example/cpp03/ssl/server.cpp @@ -5579,6 +6996,10 @@ /libs/asio/example/cpp11/chat/chat_message.hpp /libs/asio/example/cpp11/chat/chat_server.cpp /libs/asio/example/cpp11/chat/Jamfile.v2 +/libs/asio/example/cpp11/deferred/ +/libs/asio/example/cpp11/deferred/deferred_1.cpp +/libs/asio/example/cpp11/deferred/deferred_2.cpp +/libs/asio/example/cpp11/deferred/Jamfile.v2 /libs/asio/example/cpp11/echo/ /libs/asio/example/cpp11/echo/async_tcp_echo_server.cpp /libs/asio/example/cpp11/echo/async_udp_echo_server.cpp @@ -5595,6 +7016,10 @@ /libs/asio/example/cpp11/executors/Jamfile.v2 /libs/asio/example/cpp11/executors/pipeline.cpp /libs/asio/example/cpp11/executors/priority_scheduler.cpp +/libs/asio/example/cpp11/files/ +/libs/asio/example/cpp11/files/async_file_copy.cpp +/libs/asio/example/cpp11/files/blocking_file_copy.cpp +/libs/asio/example/cpp11/files/Jamfile.v2 /libs/asio/example/cpp11/fork/ /libs/asio/example/cpp11/fork/daemon.cpp /libs/asio/example/cpp11/fork/Jamfile.v2 @@ -5634,6 +7059,8 @@ /libs/asio/example/cpp11/iostreams/Jamfile.v2 /libs/asio/example/cpp11/local/ /libs/asio/example/cpp11/local/connect_pair.cpp +/libs/asio/example/cpp11/local/fd_passing_stream_client.cpp +/libs/asio/example/cpp11/local/fd_passing_stream_server.cpp /libs/asio/example/cpp11/local/iostream_client.cpp /libs/asio/example/cpp11/local/Jamfile.v2 /libs/asio/example/cpp11/local/stream_client.cpp @@ -5655,6 +7082,13 @@ /libs/asio/example/cpp11/operations/composed_7.cpp /libs/asio/example/cpp11/operations/composed_8.cpp /libs/asio/example/cpp11/operations/Jamfile.v2 +/libs/asio/example/cpp11/parallel_group/ +/libs/asio/example/cpp11/parallel_group/Jamfile.v2 +/libs/asio/example/cpp11/parallel_group/ranged_wait_for_all.cpp +/libs/asio/example/cpp11/parallel_group/wait_for_all.cpp +/libs/asio/example/cpp11/parallel_group/wait_for_one.cpp +/libs/asio/example/cpp11/parallel_group/wait_for_one_error.cpp +/libs/asio/example/cpp11/parallel_group/wait_for_one_success.cpp /libs/asio/example/cpp11/socks4/ /libs/asio/example/cpp11/socks4/Jamfile.v2 /libs/asio/example/cpp11/socks4/socks4.hpp @@ -5666,7 +7100,7 @@ /libs/asio/example/cpp11/ssl/ /libs/asio/example/cpp11/ssl/ca.pem /libs/asio/example/cpp11/ssl/client.cpp -/libs/asio/example/cpp11/ssl/dh2048.pem +/libs/asio/example/cpp11/ssl/dh4096.pem /libs/asio/example/cpp11/ssl/Jamfile.v2 /libs/asio/example/cpp11/ssl/README /libs/asio/example/cpp11/ssl/server.cpp @@ -5681,7 +7115,24 @@ /libs/asio/example/cpp11/timers/ /libs/asio/example/cpp11/timers/Jamfile.v2 /libs/asio/example/cpp11/timers/time_t_timer.cpp +/libs/asio/example/cpp11/type_erasure/ +/libs/asio/example/cpp11/type_erasure/Jamfile.v2 +/libs/asio/example/cpp11/type_erasure/line_reader.hpp +/libs/asio/example/cpp11/type_erasure/main.cpp +/libs/asio/example/cpp11/type_erasure/sleep.cpp +/libs/asio/example/cpp11/type_erasure/sleep.hpp +/libs/asio/example/cpp11/type_erasure/stdin_line_reader.cpp +/libs/asio/example/cpp11/type_erasure/stdin_line_reader.hpp /libs/asio/example/cpp14/ +/libs/asio/example/cpp14/deferred/ +/libs/asio/example/cpp14/deferred/deferred_1.cpp +/libs/asio/example/cpp14/deferred/deferred_2.cpp +/libs/asio/example/cpp14/deferred/deferred_3.cpp +/libs/asio/example/cpp14/deferred/deferred_4.cpp +/libs/asio/example/cpp14/deferred/deferred_5.cpp +/libs/asio/example/cpp14/deferred/deferred_6.cpp +/libs/asio/example/cpp14/deferred/deferred_7.cpp +/libs/asio/example/cpp14/deferred/Jamfile.v2 /libs/asio/example/cpp14/executors/ /libs/asio/example/cpp14/executors/actor.cpp /libs/asio/example/cpp14/executors/async_1.cpp @@ -5692,7 +7143,12 @@ /libs/asio/example/cpp14/executors/Jamfile.v2 /libs/asio/example/cpp14/executors/pipeline.cpp /libs/asio/example/cpp14/executors/priority_scheduler.cpp +/libs/asio/example/cpp14/iostreams/ +/libs/asio/example/cpp14/iostreams/http_client.cpp +/libs/asio/example/cpp14/iostreams/Jamfile.v2 /libs/asio/example/cpp14/operations/ +/libs/asio/example/cpp14/operations/callback_wrapper.cpp +/libs/asio/example/cpp14/operations/c_callback_wrapper.cpp /libs/asio/example/cpp14/operations/composed_1.cpp /libs/asio/example/cpp14/operations/composed_2.cpp /libs/asio/example/cpp14/operations/composed_3.cpp @@ -5702,13 +7158,57 @@ /libs/asio/example/cpp14/operations/composed_7.cpp /libs/asio/example/cpp14/operations/composed_8.cpp /libs/asio/example/cpp14/operations/Jamfile.v2 +/libs/asio/example/cpp14/parallel_group/ +/libs/asio/example/cpp14/parallel_group/Jamfile.v2 +/libs/asio/example/cpp14/parallel_group/parallel_sort.cpp +/libs/asio/example/cpp14/parallel_group/ranged_wait_for_all.cpp +/libs/asio/example/cpp14/parallel_group/wait_for_all.cpp +/libs/asio/example/cpp14/parallel_group/wait_for_one.cpp +/libs/asio/example/cpp14/parallel_group/wait_for_one_error.cpp +/libs/asio/example/cpp14/parallel_group/wait_for_one_success.cpp /libs/asio/example/cpp17/ /libs/asio/example/cpp17/coroutines_ts/ /libs/asio/example/cpp17/coroutines_ts/chat_server.cpp /libs/asio/example/cpp17/coroutines_ts/echo_server.cpp +/libs/asio/example/cpp17/coroutines_ts/echo_server_with_as_single_default.cpp +/libs/asio/example/cpp17/coroutines_ts/echo_server_with_as_tuple_default.cpp /libs/asio/example/cpp17/coroutines_ts/echo_server_with_default.cpp /libs/asio/example/cpp17/coroutines_ts/range_based_for.cpp /libs/asio/example/cpp17/coroutines_ts/refactored_echo_server.cpp +/libs/asio/example/cpp20/ +/libs/asio/example/cpp20/channels/ +/libs/asio/example/cpp20/channels/throttling_proxy.cpp +/libs/asio/example/cpp20/coroutines/ +/libs/asio/example/cpp20/coroutines/chat_server.cpp +/libs/asio/example/cpp20/coroutines/echo_server.cpp +/libs/asio/example/cpp20/coroutines/echo_server_with_as_single_default.cpp +/libs/asio/example/cpp20/coroutines/echo_server_with_as_tuple_default.cpp +/libs/asio/example/cpp20/coroutines/echo_server_with_default.cpp +/libs/asio/example/cpp20/coroutines/echo_server_with_deferred.cpp +/libs/asio/example/cpp20/coroutines/echo_server_with_deferred_default.cpp +/libs/asio/example/cpp20/coroutines/Jamfile.v2 +/libs/asio/example/cpp20/coroutines/refactored_echo_server.cpp +/libs/asio/example/cpp20/coroutines/timeout.cpp +/libs/asio/example/cpp20/operations/ +/libs/asio/example/cpp20/operations/callback_wrapper.cpp +/libs/asio/example/cpp20/operations/c_callback_wrapper.cpp +/libs/asio/example/cpp20/operations/composed_1.cpp +/libs/asio/example/cpp20/operations/composed_2.cpp +/libs/asio/example/cpp20/operations/composed_3.cpp +/libs/asio/example/cpp20/operations/composed_4.cpp +/libs/asio/example/cpp20/operations/composed_5.cpp +/libs/asio/example/cpp20/operations/composed_6.cpp +/libs/asio/example/cpp20/operations/composed_7.cpp +/libs/asio/example/cpp20/operations/composed_8.cpp +/libs/asio/example/cpp20/operations/Jamfile.v2 +/libs/asio/example/cpp20/type_erasure/ +/libs/asio/example/cpp20/type_erasure/Jamfile.v2 +/libs/asio/example/cpp20/type_erasure/line_reader.hpp +/libs/asio/example/cpp20/type_erasure/main.cpp +/libs/asio/example/cpp20/type_erasure/sleep.cpp +/libs/asio/example/cpp20/type_erasure/sleep.hpp +/libs/asio/example/cpp20/type_erasure/stdin_line_reader.cpp +/libs/asio/example/cpp20/type_erasure/stdin_line_reader.hpp /libs/asio/.github/ /libs/asio/.github/ISSUE_TEMPLATE/ /libs/asio/.github/ISSUE_TEMPLATE/config.yml @@ -5718,6 +7218,7 @@ /libs/asio/meta/ /libs/asio/meta/libraries.json /libs/asio/test/ +/libs/asio/test/append.cpp /libs/asio/test/archetypes/ /libs/asio/test/archetypes/async_ops.hpp /libs/asio/test/archetypes/async_result.hpp @@ -5725,33 +7226,52 @@ /libs/asio/test/archetypes/io_control_command.hpp /libs/asio/test/archetypes/settable_socket_option.hpp /libs/asio/test/associated_allocator.cpp +/libs/asio/test/associated_cancellation_slot.cpp /libs/asio/test/associated_executor.cpp +/libs/asio/test/associated_immediate_executor.cpp +/libs/asio/test/associator.cpp +/libs/asio/test/as_tuple.cpp /libs/asio/test/async_result.cpp /libs/asio/test/awaitable.cpp /libs/asio/test/basic_datagram_socket.cpp /libs/asio/test/basic_deadline_timer.cpp +/libs/asio/test/basic_file.cpp +/libs/asio/test/basic_random_access_file.cpp /libs/asio/test/basic_raw_socket.cpp +/libs/asio/test/basic_readable_pipe.cpp /libs/asio/test/basic_seq_packet_socket.cpp /libs/asio/test/basic_serial_port.cpp /libs/asio/test/basic_signal_set.cpp /libs/asio/test/basic_socket_acceptor.cpp /libs/asio/test/basic_socket.cpp /libs/asio/test/basic_streambuf.cpp +/libs/asio/test/basic_stream_file.cpp /libs/asio/test/basic_stream_socket.cpp /libs/asio/test/basic_waitable_timer.cpp +/libs/asio/test/basic_writable_pipe.cpp +/libs/asio/test/bind_allocator.cpp +/libs/asio/test/bind_cancellation_slot.cpp /libs/asio/test/bind_executor.cpp +/libs/asio/test/bind_immediate_executor.cpp /libs/asio/test/buffer.cpp /libs/asio/test/buffered_read_stream.cpp /libs/asio/test/buffered_stream.cpp /libs/asio/test/buffered_write_stream.cpp +/libs/asio/test/buffer_registration.cpp /libs/asio/test/buffers_iterator.cpp +/libs/asio/test/cancellation_signal.cpp +/libs/asio/test/cancellation_state.cpp +/libs/asio/test/cancellation_type.cpp /libs/asio/test/completion_condition.cpp /libs/asio/test/compose.cpp /libs/asio/test/connect.cpp +/libs/asio/test/connect_pipe.cpp +/libs/asio/test/consign.cpp /libs/asio/test/coroutine.cpp /libs/asio/test/co_spawn.cpp /libs/asio/test/deadline_timer.cpp /libs/asio/test/defer.cpp +/libs/asio/test/deferred.cpp /libs/asio/test/detached.cpp /libs/asio/test/dispatch.cpp /libs/asio/test/error.cpp @@ -5784,6 +7304,28 @@ /libs/asio/test/execution/submit.cpp /libs/asio/test/executor.cpp /libs/asio/test/executor_work_guard.cpp +/libs/asio/test/experimental/ +/libs/asio/test/experimental/awaitable_operators.cpp +/libs/asio/test/experimental/basic_channel.cpp +/libs/asio/test/experimental/basic_concurrent_channel.cpp +/libs/asio/test/experimental/channel.cpp +/libs/asio/test/experimental/channel_traits.cpp +/libs/asio/test/experimental/co_composed.cpp +/libs/asio/test/experimental/concurrent_channel.cpp +/libs/asio/test/experimental/coro/ +/libs/asio/test/experimental/coro/allocator.cpp +/libs/asio/test/experimental/coro/cancel.cpp +/libs/asio/test/experimental/coro/co_spawn.cpp +/libs/asio/test/experimental/coro/exception.cpp +/libs/asio/test/experimental/coro/executor.cpp +/libs/asio/test/experimental/coro/Jamfile.v2 +/libs/asio/test/experimental/coro/partial.cpp +/libs/asio/test/experimental/coro/simple_test.cpp +/libs/asio/test/experimental/coro/stack_test.cpp +/libs/asio/test/experimental/coro/use_coro.cpp +/libs/asio/test/experimental/Jamfile.v2 +/libs/asio/test/experimental/promise.cpp +/libs/asio/test/file_base.cpp /libs/asio/test/generic/ /libs/asio/test/generic/basic_endpoint.cpp /libs/asio/test/generic/datagram_protocol.cpp @@ -5831,6 +7373,7 @@ /libs/asio/test/local/basic_endpoint.cpp /libs/asio/test/local/connect_pair.cpp /libs/asio/test/local/datagram_protocol.cpp +/libs/asio/test/local/seq_packet_protocol.cpp /libs/asio/test/local/stream_protocol.cpp /libs/asio/test/packaged_task.cpp /libs/asio/test/placeholders.cpp @@ -5841,6 +7384,7 @@ /libs/asio/test/posix/descriptor.cpp /libs/asio/test/posix/stream_descriptor.cpp /libs/asio/test/post.cpp +/libs/asio/test/prepend.cpp /libs/asio/test/properties/ /libs/asio/test/properties/cpp03/ /libs/asio/test/properties/cpp03/can_prefer_free_prefer.cpp @@ -6019,12 +7563,17 @@ /libs/asio/test/properties/cpp14/require_free.cpp /libs/asio/test/properties/cpp14/require_member.cpp /libs/asio/test/properties/cpp14/require_static.cpp +/libs/asio/test/random_access_file.cpp +/libs/asio/test/readable_pipe.cpp /libs/asio/test/read_at.cpp /libs/asio/test/read.cpp /libs/asio/test/read_until.cpp +/libs/asio/test/recycling_allocator.cpp /libs/asio/test/redirect_error.cpp +/libs/asio/test/registered_buffer.cpp /libs/asio/test/serial_port_base.cpp /libs/asio/test/serial_port.cpp +/libs/asio/test/signal_set_base.cpp /libs/asio/test/signal_set.cpp /libs/asio/test/socket_base.cpp /libs/asio/test/ssl/ @@ -6040,6 +7589,7 @@ /libs/asio/test/steady_timer.cpp /libs/asio/test/strand.cpp /libs/asio/test/streambuf.cpp +/libs/asio/test/stream_file.cpp /libs/asio/test/system_context.cpp /libs/asio/test/system_executor.cpp /libs/asio/test/system_timer.cpp @@ -6070,6 +7620,7 @@ /libs/asio/test/windows/overlapped_ptr.cpp /libs/asio/test/windows/random_access_handle.cpp /libs/asio/test/windows/stream_handle.cpp +/libs/asio/test/writable_pipe.cpp /libs/asio/test/write_at.cpp /libs/asio/test/write.cpp /libs/asio/tools/ @@ -6094,9 +7645,20 @@ /libs/system/doc/system/introduction.adoc /libs/system/doc/system/rationale.adoc /libs/system/doc/system/reference.adoc +/libs/system/doc/system/usage.adoc +/libs/system/.drone/ +/libs/system/.drone/drone.bat +/libs/system/.drone/drone.sh +/libs/system/.drone.jsonnet +/libs/system/extra/ +/libs/system/extra/boost_system.natvis +/libs/system/.github/ +/libs/system/.github/workflows/ +/libs/system/.github/workflows/ci.yml /libs/system/index.html /libs/system/meta/ /libs/system/meta/libraries.json +/libs/system/README.md /libs/system/src/ /libs/system/src/error_code.cpp /libs/system/test/ @@ -6104,21 +7666,46 @@ /libs/system/test/before_main_test.cpp /libs/system/test/cmake_install_test/ /libs/system/test/cmake_install_test/CMakeLists.txt +/libs/system/test/cmake_install_test/main.cpp /libs/system/test/CMakeLists.txt /libs/system/test/cmake_subdir_test/ /libs/system/test/cmake_subdir_test/CMakeLists.txt /libs/system/test/config_test.cpp +/libs/system/test/constexpr_test2.cpp /libs/system/test/constexpr_test.cpp +/libs/system/test/cygwin_error_test.cpp /libs/system/test/dynamic_link_test.cpp +/libs/system/test/ec_hash_value_test.cpp +/libs/system/test/ec_location_test2.cpp +/libs/system/test/ec_location_test3.cpp +/libs/system/test/ec_location_test4.cpp +/libs/system/test/ec_location_test.cpp +/libs/system/test/ec_what_test.cpp +/libs/system/test/ec_wstream_test.cpp +/libs/system/test/errc_test2.cpp +/libs/system/test/errc_test3.cpp +/libs/system/test/errc_test4.cpp +/libs/system/test/errc_test.cpp +/libs/system/test/error_category_test2.cpp /libs/system/test/error_category_test.cpp +/libs/system/test/error_code_test2.cpp +/libs/system/test/error_code_test3.cpp /libs/system/test/error_code_test.cpp /libs/system/test/error_code_user_test.cpp +/libs/system/test/error_condition_test2.cpp +/libs/system/test/error_condition_test3.cpp +/libs/system/test/error_condition_test.cpp /libs/system/test/failed_constexpr_test.cpp /libs/system/test/failed_test.cpp +/libs/system/test/generic_category_test2.cpp +/libs/system/test/generic_category_test3.cpp /libs/system/test/generic_category_test.cpp /libs/system/test/header_only_test.cpp /libs/system/test/initialization_test.cpp +/libs/system/test/is_error_code_enum_test.cpp +/libs/system/test/is_error_condition_enum_test.cpp /libs/system/test/Jamfile.v2 +/libs/system/test/linux_error_test.cpp /libs/system/test/msvc/ /libs/system/test/msvc/common.props /libs/system/test/msvc/config_test/ @@ -6135,19 +7722,64 @@ /libs/system/test/msvc/system-dll/system-dll.vcxproj /libs/system/test/msvc/system.sln /libs/system/test/quick.cpp +/libs/system/test/result_convert_construct.cpp +/libs/system/test/result_copy_assign.cpp +/libs/system/test/result_copy_construct.cpp +/libs/system/test/result_default_construct.cpp +/libs/system/test/result_emplace.cpp +/libs/system/test/result_eq.cpp +/libs/system/test/result_errc_construct.cpp +/libs/system/test/result_error_access.cpp +/libs/system/test/result_error_construct2.cpp +/libs/system/test/result_error_construct3.cpp +/libs/system/test/result_error_construct4.cpp +/libs/system/test/result_error_construct.cpp +/libs/system/test/result_move_assign.cpp +/libs/system/test/result_move_construct.cpp +/libs/system/test/result_range_for.cpp +/libs/system/test/result_swap.cpp +/libs/system/test/result_typedefs.cpp +/libs/system/test/result_value_access.cpp +/libs/system/test/result_value_construct2.cpp +/libs/system/test/result_value_construct3.cpp +/libs/system/test/result_value_construct4.cpp +/libs/system/test/result_value_construct5.cpp +/libs/system/test/result_value_construct.cpp /libs/system/test/single_instance_1.cpp /libs/system/test/single_instance_2.cpp /libs/system/test/single_instance_test.cpp +/libs/system/test/snprintf_test.cpp +/libs/system/test/std_interop_test10.cpp +/libs/system/test/std_interop_test11.cpp +/libs/system/test/std_interop_test12.cpp +/libs/system/test/std_interop_test13.cpp +/libs/system/test/std_interop_test14.cpp +/libs/system/test/std_interop_test15.cpp +/libs/system/test/std_interop_test16.cpp +/libs/system/test/std_interop_test2.cpp +/libs/system/test/std_interop_test3.cpp +/libs/system/test/std_interop_test4.cpp +/libs/system/test/std_interop_test5.cpp +/libs/system/test/std_interop_test6.cpp +/libs/system/test/std_interop_test7.cpp +/libs/system/test/std_interop_test8.cpp +/libs/system/test/std_interop_test9.cpp /libs/system/test/std_interop_test.cpp /libs/system/test/std_mismatch_test.cpp /libs/system/test/std_single_instance_1.cpp /libs/system/test/std_single_instance_2.cpp /libs/system/test/std_single_instance_test.cpp +/libs/system/test/system_category_test2.cpp +/libs/system/test/system_category_test3.cpp /libs/system/test/system_category_test.cpp +/libs/system/test/system_error_test2.cpp +/libs/system/test/system_error_test3.cpp /libs/system/test/system_error_test.cpp /libs/system/test/throws_assign_fail.cpp /libs/system/test/throw_test.cpp /libs/system/test/warnings_test.cpp +/libs/system/test/win32_generic_test.cpp /libs/system/test/win32_hresult_test.cpp +/libs/system/test/windows_error_test.cpp /libs/system/.travis.yml /README.txt diff --git a/tidal-link/link/modules/asio-standalone/asio/boostify.pl b/tidal-link/link/modules/asio-standalone/asio/boostify.pl old mode 100644 new mode 100755 index 460aab952..485206c31 --- a/tidal-link/link/modules/asio-standalone/asio/boostify.pl +++ b/tidal-link/link/modules/asio-standalone/asio/boostify.pl @@ -100,11 +100,17 @@ sub copy_source_file my $is_xsl = 0; $is_xsl = 1 if ($from =~ /.xsl$/); + my $is_quickref = 0; + $is_quickref = 1 if ($from =~ /quickref.xml$/); + my $is_test = 0; $is_test = 1 if ($from =~ /tests\/unit/); my $is_coroutine_related = 0; - $is_coroutine_related = 1 if ($from =~ /await/); + $is_coroutine_related = 1 if ($from =~ /await/ || $from =~ /partial_promise/ || $from =~ /co_composed/); + + my $is_hash_related = 0; + $is_hash_related = 1 if ($from =~ /ip\/address/ || $from =~ /ip\/basic_endpoint/); # Open the files. open(my $input, "<$from") or die("Can't open $from for reading"); @@ -136,8 +142,8 @@ sub copy_source_file $line =~ s/ASIO_/BOOST_ASIO_/g; } - # Extra replacements for quickbook and XSL source only. - if ($is_qbk || $is_xsl) + # Extra replacements for quickbook, XSL and quickref.xml source only. + if ($is_qbk || $is_xsl || $is_quickref) { $line =~ s/asio\.examples/boost_asio.examples/g; $line =~ s/asio\.history/boost_asio.history/g; @@ -156,6 +162,7 @@ sub copy_source_file $line =~ s/\^asio/^boost\/asio/g; $line =~ s/namespaceasio/namespaceboost_1_1asio/g; $line =~ s/ \(\[\@examples\/diffs.*$//; + $line =~ s/boost\/tools\/boostbook/tools\/boostbook/g; } # Conditional replacements. @@ -274,7 +281,7 @@ sub copy_source_file print_line($output, $1 . "boost::thread" . $2, $from, $lineno); } } - elsif ($line =~ /namespace std \{ *$/ && !$is_coroutine_related) + elsif ($line =~ /namespace std \{ *$/ && !$is_coroutine_related && !$is_hash_related) { print_line($output, "namespace boost {", $from, $lineno); print_line($output, "namespace system {", $from, $lineno); @@ -285,7 +292,12 @@ sub copy_source_file $line =~ s/asio::/boost::asio::/g if !$is_xsl; print_line($output, $line, $from, $lineno); } - elsif ($line =~ /^} \/\/ namespace std/ && !$is_coroutine_related) + elsif ($line =~ /ec\.assign\(0, ec\.category\(\)\)/) + { + $line =~ s/ec\.assign\(0, ec\.category\(\)\)/ec = boost::system::error_code()/g; + print_line($output, $line, $from, $lineno); + } + elsif ($line =~ /^} \/\/ namespace std/ && !$is_coroutine_related && !$is_hash_related) { print_line($output, "} // namespace system", $from, $lineno); print_line($output, "} // namespace boost", $from, $lineno); @@ -319,6 +331,16 @@ sub copy_source_file $line =~ s/asio_handler_invoke_helpers/boost_asio_handler_invoke_helpers/g; print_line($output, $line, $from, $lineno); } + elsif ($line =~ /asio_(prefer|query|require|require_concept)_fn/) + { + $line =~ s/asio_(prefer|query|require|require_concept)_fn/boost_asio_$1_fn/g; + print_line($output, $line, $from, $lineno); + } + elsif ($line =~ /asio_execution_/ && !($line =~ /_is_unspecialised/)) + { + $line =~ s/asio_execution_/boost_asio_execution_/g; + print_line($output, $line, $from, $lineno); + } elsif ($line =~ /[\\@]ref boost_bind/) { $line =~ s/[\\@]ref boost_bind/boost::bind()/g; @@ -350,6 +372,25 @@ sub copy_source_file print_line($output, "//", $from, $lineno); print_line($output, $line, $from, $lineno); } + elsif ($is_quickref) + { + if ($line =~ /asio\.reference\.error_code">/) + { + # Line is removed. + } + elsif ($line =~ /asio\.reference\.system_error">/) + { + # Line is removed. + } + elsif ($line =~ /asio\.reference\.thread">/) + { + # Line is removed. + } + else + { + print_line($output, $line, $from, $lineno); + } + } else { print_line($output, $line, $from, $lineno); @@ -373,6 +414,8 @@ sub copy_include_files "include/asio/execution/detail", "include/asio/execution/impl", "include/asio/experimental", + "include/asio/experimental/detail", + "include/asio/experimental/detail/impl", "include/asio/experimental/impl", "include/asio/generic", "include/asio/generic/detail", @@ -399,7 +442,7 @@ sub copy_include_files foreach my $dir (@dirs) { our $boost_dir; - my @files = ( glob("$dir/*.hpp"), glob("$dir/*.ipp"), glob("$dir/*cpp") ); + my @files = ( glob("$dir/*.hpp"), glob("$dir/*.ipp") ); foreach my $file (@files) { if ($file ne "include/asio/thread.hpp" @@ -437,6 +480,8 @@ sub copy_unit_tests "src/tests/unit", "src/tests/unit/archetypes", "src/tests/unit/execution", + "src/tests/unit/experimental", + "src/tests/unit/experimental/coro", "src/tests/unit/generic", "src/tests/unit/ip", "src/tests/unit/local", @@ -549,9 +594,11 @@ sub copy_examples "src/examples/cpp11/allocation", "src/examples/cpp11/buffers", "src/examples/cpp11/chat", + "src/examples/cpp11/deferred", "src/examples/cpp11/echo", "src/examples/cpp11/executors", "src/examples/cpp11/fork", + "src/examples/cpp11/files", "src/examples/cpp11/futures", "src/examples/cpp11/handler_tracking", "src/examples/cpp11/http/server", @@ -561,14 +608,23 @@ sub copy_examples "src/examples/cpp11/multicast", "src/examples/cpp11/nonblocking", "src/examples/cpp11/operations", + "src/examples/cpp11/parallel_group", "src/examples/cpp11/socks4", "src/examples/cpp11/spawn", "src/examples/cpp11/ssl", "src/examples/cpp11/timeouts", "src/examples/cpp11/timers", + "src/examples/cpp11/type_erasure", + "src/examples/cpp14/deferred", "src/examples/cpp14/executors", + "src/examples/cpp14/iostreams", "src/examples/cpp14/operations", - "src/examples/cpp17/coroutines_ts"); + "src/examples/cpp14/parallel_group", + "src/examples/cpp17/coroutines_ts", + "src/examples/cpp20/channels", + "src/examples/cpp20/coroutines", + "src/examples/cpp20/operations", + "src/examples/cpp20/type_erasure"); our $boost_dir; foreach my $dir (@dirs) @@ -597,10 +653,13 @@ sub copy_doc "src/doc/asio.qbk", "src/doc/examples.qbk", "src/doc/net_ts.qbk", + "src/doc/overview.qbk", + "src/doc/quickref.xml", "src/doc/reference.xsl", "src/doc/std_executors.qbk", "src/doc/tutorial.xsl", glob("src/doc/overview/*.qbk"), + glob("src/doc/overview/model/*.qbk"), glob("src/doc/requirements/*.qbk")); foreach my $file (@files) { diff --git a/tidal-link/link/modules/asio-standalone/asio/configure.ac b/tidal-link/link/modules/asio-standalone/asio/configure.ac index fd1954cbc..8eabb6740 100644 --- a/tidal-link/link/modules/asio-standalone/asio/configure.ac +++ b/tidal-link/link/modules/asio-standalone/asio/configure.ac @@ -1,13 +1,14 @@ -AC_INIT(asio, [1.17.0]) +AC_INIT(asio, [1.28.0]) AC_CONFIG_SRCDIR(include/asio.hpp) AM_MAINTAINER_MODE -AM_INIT_AUTOMAKE([tar-ustar]) +AM_INIT_AUTOMAKE([tar-pax]) AC_CANONICAL_HOST AM_PROG_CC_C_O AC_PROG_CXX AC_LANG(C++) AC_PROG_RANLIB +PKG_INSTALLDIR AC_DEFINE(_REENTRANT, [1], [Define this]) @@ -169,13 +170,36 @@ AC_COMPILE_IFELSE( [AC_MSG_RESULT([no]) HAVE_CXX17=no;]) +AC_MSG_CHECKING([whether C++20 is enabled]) +AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [[#if __cplusplus < 202002L]] + [[#error C++20 not available]] + [[#endif]])], + [AC_MSG_RESULT([yes]) + HAVE_CXX20=yes;], + [AC_MSG_RESULT([no]) + HAVE_CXX20=no;]) + AC_MSG_CHECKING([whether coroutines are enabled]) AC_COMPILE_IFELSE( [AC_LANG_PROGRAM( [[#if defined(__clang__)]] - [[# if (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)]] - [[# if __has_include()]] - [[# define ASIO_HAS_CO_AWAIT 1]] + [[# if (__clang_major__ >= 14)]] + [[# if (__cplusplus >= 202002) && (__cpp_impl_coroutine >= 201902)]] + [[# if __has_include()]] + [[# define ASIO_HAS_CO_AWAIT 1]] + [[# endif]] + [[# elif (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)]] + [[# if __has_include()]] + [[# define ASIO_HAS_CO_AWAIT 1]] + [[# endif]] + [[# endif]] + [[# else]] + [[# if (__cplusplus >= 201703) && (__cpp_coroutines >= 201703)]] + [[# if __has_include()]] + [[# define ASIO_HAS_CO_AWAIT 1]] + [[# endif]] [[# endif]] [[# endif]] [[#elif defined(__GNUC__)]] @@ -216,8 +240,12 @@ AM_CONDITIONAL(HAVE_CXX14,test x$HAVE_CXX14 = xyes) AM_CONDITIONAL(HAVE_CXX17,test x$HAVE_CXX17 = xyes) +AM_CONDITIONAL(HAVE_CXX20,test x$HAVE_CXX20 = xyes) + AM_CONDITIONAL(HAVE_COROUTINES,test x$HAVE_COROUTINES = xyes) +AC_CONFIG_FILES([asio.pc]) + AC_OUTPUT([ Makefile include/Makefile @@ -227,4 +255,5 @@ AC_OUTPUT([ src/examples/cpp03/Makefile src/examples/cpp11/Makefile src/examples/cpp14/Makefile - src/examples/cpp17/Makefile]) + src/examples/cpp17/Makefile + src/examples/cpp20/Makefile]) diff --git a/tidal-link/link/modules/asio-standalone/asio/include/Makefile.am b/tidal-link/link/modules/asio-standalone/asio/include/Makefile.am index 265e37ed5..d7a9b9c60 100644 --- a/tidal-link/link/modules/asio-standalone/asio/include/Makefile.am +++ b/tidal-link/link/modules/asio-standalone/asio/include/Makefile.am @@ -1,14 +1,24 @@ # find . -name "*.*pp" | sed -e 's/^\.\///' | sed -e 's/^.*$/ & \\/' | sort nobase_include_HEADERS = \ + asio/any_completion_executor.hpp \ + asio/any_completion_handler.hpp \ asio/any_io_executor.hpp \ + asio/append.hpp \ + asio/as_tuple.hpp \ asio/associated_allocator.hpp \ + asio/associated_cancellation_slot.hpp \ asio/associated_executor.hpp \ + asio/associated_immediate_executor.hpp \ + asio/associator.hpp \ asio/async_result.hpp \ asio/awaitable.hpp \ asio/basic_datagram_socket.hpp \ asio/basic_deadline_timer.hpp \ + asio/basic_file.hpp \ asio/basic_io_object.hpp \ + asio/basic_random_access_file.hpp \ asio/basic_raw_socket.hpp \ + asio/basic_readable_pipe.hpp \ asio/basic_seq_packet_socket.hpp \ asio/basic_serial_port.hpp \ asio/basic_signal_set.hpp \ @@ -18,9 +28,14 @@ nobase_include_HEADERS = \ asio/basic_socket_streambuf.hpp \ asio/basic_streambuf_fwd.hpp \ asio/basic_streambuf.hpp \ + asio/basic_stream_file.hpp \ asio/basic_stream_socket.hpp \ asio/basic_waitable_timer.hpp \ + asio/basic_writable_pipe.hpp \ + asio/bind_allocator.hpp \ + asio/bind_cancellation_slot.hpp \ asio/bind_executor.hpp \ + asio/bind_immediate_executor.hpp \ asio/buffered_read_stream_fwd.hpp \ asio/buffered_read_stream.hpp \ asio/buffered_stream_fwd.hpp \ @@ -28,19 +43,27 @@ nobase_include_HEADERS = \ asio/buffered_write_stream_fwd.hpp \ asio/buffered_write_stream.hpp \ asio/buffer.hpp \ + asio/buffer_registration.hpp \ asio/buffers_iterator.hpp \ + asio/cancellation_signal.hpp \ + asio/cancellation_state.hpp \ + asio/cancellation_type.hpp \ asio/co_spawn.hpp \ asio/completion_condition.hpp \ asio/compose.hpp \ asio/connect.hpp \ + asio/connect_pipe.hpp \ + asio/consign.hpp \ asio/coroutine.hpp \ asio/deadline_timer.hpp \ asio/defer.hpp \ + asio/deferred.hpp \ asio/detached.hpp \ asio/detail/array_fwd.hpp \ asio/detail/array.hpp \ asio/detail/assert.hpp \ asio/detail/atomic_count.hpp \ + asio/detail/base_from_cancellation_state.hpp \ asio/detail/base_from_completion_cond.hpp \ asio/detail/bind_handler.hpp \ asio/detail/blocking_executor_op.hpp \ @@ -52,6 +75,7 @@ nobase_include_HEADERS = \ asio/detail/chrono.hpp \ asio/detail/chrono_time_traits.hpp \ asio/detail/completion_handler.hpp \ + asio/detail/composed_work.hpp \ asio/detail/concurrency_hint.hpp \ asio/detail/conditionally_enabled_event.hpp \ asio/detail/conditionally_enabled_mutex.hpp \ @@ -69,6 +93,7 @@ nobase_include_HEADERS = \ asio/detail/epoll_reactor.hpp \ asio/detail/eventfd_select_interrupter.hpp \ asio/detail/event.hpp \ + asio/detail/exception.hpp \ asio/detail/executor_function.hpp \ asio/detail/executor_op.hpp \ asio/detail/fd_set_adapter.hpp \ @@ -95,16 +120,21 @@ nobase_include_HEADERS = \ asio/detail/impl/epoll_reactor.ipp \ asio/detail/impl/eventfd_select_interrupter.ipp \ asio/detail/impl/handler_tracking.ipp \ + asio/detail/impl/io_uring_descriptor_service.ipp \ + asio/detail/impl/io_uring_file_service.ipp \ + asio/detail/impl/io_uring_service.hpp \ + asio/detail/impl/io_uring_service.ipp \ + asio/detail/impl/io_uring_socket_service_base.ipp \ asio/detail/impl/kqueue_reactor.hpp \ asio/detail/impl/kqueue_reactor.ipp \ asio/detail/impl/null_event.ipp \ asio/detail/impl/pipe_select_interrupter.ipp \ asio/detail/impl/posix_event.ipp \ asio/detail/impl/posix_mutex.ipp \ + asio/detail/impl/posix_serial_port_service.ipp \ asio/detail/impl/posix_thread.ipp \ asio/detail/impl/posix_tss_ptr.ipp \ asio/detail/impl/reactive_descriptor_service.ipp \ - asio/detail/impl/reactive_serial_port_service.ipp \ asio/detail/impl/reactive_socket_service_base.ipp \ asio/detail/impl/resolver_service_base.ipp \ asio/detail/impl/scheduler.ipp \ @@ -119,10 +149,12 @@ nobase_include_HEADERS = \ asio/detail/impl/strand_executor_service.ipp \ asio/detail/impl/strand_service.hpp \ asio/detail/impl/strand_service.ipp \ + asio/detail/impl/thread_context.ipp \ asio/detail/impl/throw_error.ipp \ asio/detail/impl/timer_queue_ptime.ipp \ asio/detail/impl/timer_queue_set.ipp \ asio/detail/impl/win_event.ipp \ + asio/detail/impl/win_iocp_file_service.ipp \ asio/detail/impl/win_iocp_handle_service.ipp \ asio/detail/impl/win_iocp_io_context.hpp \ asio/detail/impl/win_iocp_io_context.ipp \ @@ -137,8 +169,30 @@ nobase_include_HEADERS = \ asio/detail/impl/win_static_mutex.ipp \ asio/detail/impl/win_thread.ipp \ asio/detail/impl/win_tss_ptr.ipp \ + asio/detail/initiate_defer.hpp \ + asio/detail/initiate_dispatch.hpp \ + asio/detail/initiate_post.hpp \ asio/detail/io_control.hpp \ asio/detail/io_object_impl.hpp \ + asio/detail/io_uring_descriptor_read_at_op.hpp \ + asio/detail/io_uring_descriptor_read_op.hpp \ + asio/detail/io_uring_descriptor_service.hpp \ + asio/detail/io_uring_descriptor_write_at_op.hpp \ + asio/detail/io_uring_descriptor_write_op.hpp \ + asio/detail/io_uring_file_service.hpp \ + asio/detail/io_uring_null_buffers_op.hpp \ + asio/detail/io_uring_operation.hpp \ + asio/detail/io_uring_service.hpp \ + asio/detail/io_uring_socket_accept_op.hpp \ + asio/detail/io_uring_socket_connect_op.hpp \ + asio/detail/io_uring_socket_recvfrom_op.hpp \ + asio/detail/io_uring_socket_recvmsg_op.hpp \ + asio/detail/io_uring_socket_recv_op.hpp \ + asio/detail/io_uring_socket_send_op.hpp \ + asio/detail/io_uring_socket_sendto_op.hpp \ + asio/detail/io_uring_socket_service_base.hpp \ + asio/detail/io_uring_socket_service.hpp \ + asio/detail/io_uring_wait_op.hpp \ asio/detail/is_buffer_sequence.hpp \ asio/detail/is_executor.hpp \ asio/detail/keyword_tss_ptr.hpp \ @@ -170,6 +224,7 @@ nobase_include_HEADERS = \ asio/detail/posix_fd_set_adapter.hpp \ asio/detail/posix_global.hpp \ asio/detail/posix_mutex.hpp \ + asio/detail/posix_serial_port_service.hpp \ asio/detail/posix_signal_blocker.hpp \ asio/detail/posix_static_mutex.hpp \ asio/detail/posix_thread.hpp \ @@ -177,7 +232,6 @@ nobase_include_HEADERS = \ asio/detail/push_options.hpp \ asio/detail/reactive_descriptor_service.hpp \ asio/detail/reactive_null_buffers_op.hpp \ - asio/detail/reactive_serial_port_service.hpp \ asio/detail/reactive_socket_accept_op.hpp \ asio/detail/reactive_socket_connect_op.hpp \ asio/detail/reactive_socket_recvfrom_op.hpp \ @@ -188,7 +242,6 @@ nobase_include_HEADERS = \ asio/detail/reactive_socket_service_base.hpp \ asio/detail/reactive_socket_service.hpp \ asio/detail/reactive_wait_op.hpp \ - asio/detail/reactor_fwd.hpp \ asio/detail/reactor.hpp \ asio/detail/reactor_op.hpp \ asio/detail/reactor_op_queue.hpp \ @@ -201,6 +254,7 @@ nobase_include_HEADERS = \ asio/detail/resolver_service.hpp \ asio/detail/scheduler.hpp \ asio/detail/scheduler_operation.hpp \ + asio/detail/scheduler_task.hpp \ asio/detail/scheduler_thread_info.hpp \ asio/detail/scoped_lock.hpp \ asio/detail/scoped_ptr.hpp \ @@ -243,6 +297,7 @@ nobase_include_HEADERS = \ asio/detail/timer_scheduler.hpp \ asio/detail/tss_ptr.hpp \ asio/detail/type_traits.hpp \ + asio/detail/utility.hpp \ asio/detail/variadic_templates.hpp \ asio/detail/wait_handler.hpp \ asio/detail/wait_op.hpp \ @@ -252,6 +307,7 @@ nobase_include_HEADERS = \ asio/detail/win_fd_set_adapter.hpp \ asio/detail/win_fenced_block.hpp \ asio/detail/win_global.hpp \ + asio/detail/win_iocp_file_service.hpp \ asio/detail/win_iocp_handle_read_op.hpp \ asio/detail/win_iocp_handle_service.hpp \ asio/detail/win_iocp_handle_write_op.hpp \ @@ -309,8 +365,8 @@ nobase_include_HEADERS = \ asio/execution/detail/as_operation.hpp \ asio/execution/detail/as_receiver.hpp \ asio/execution/detail/bulk_sender.hpp \ - asio/execution/detail/void_receiver.hpp \ asio/execution/detail/submit_receiver.hpp \ + asio/execution/detail/void_receiver.hpp \ asio/execution/execute.hpp \ asio/execution/executor.hpp \ asio/execution/impl/bad_executor.ipp \ @@ -334,6 +390,49 @@ nobase_include_HEADERS = \ asio/execution/submit.hpp \ asio/executor.hpp \ asio/executor_work_guard.hpp \ + asio/experimental/append.hpp \ + asio/experimental/as_single.hpp \ + asio/experimental/as_tuple.hpp \ + asio/experimental/awaitable_operators.hpp \ + asio/experimental/basic_channel.hpp \ + asio/experimental/basic_concurrent_channel.hpp \ + asio/experimental/cancellation_condition.hpp \ + asio/experimental/channel.hpp \ + asio/experimental/channel_error.hpp \ + asio/experimental/channel_traits.hpp \ + asio/experimental/co_composed.hpp \ + asio/experimental/co_spawn.hpp \ + asio/experimental/concurrent_channel.hpp \ + asio/experimental/coro.hpp \ + asio/experimental/coro_traits.hpp \ + asio/experimental/deferred.hpp \ + asio/experimental/detail/channel_handler.hpp \ + asio/experimental/detail/channel_message.hpp \ + asio/experimental/detail/channel_operation.hpp \ + asio/experimental/detail/channel_payload.hpp \ + asio/experimental/detail/channel_receive_op.hpp \ + asio/experimental/detail/channel_send_functions.hpp \ + asio/experimental/detail/channel_send_op.hpp \ + asio/experimental/detail/channel_service.hpp \ + asio/experimental/detail/coro_completion_handler.hpp \ + asio/experimental/detail/coro_promise_allocator.hpp \ + asio/experimental/detail/has_signature.hpp \ + asio/experimental/detail/impl/channel_service.hpp \ + asio/experimental/detail/partial_promise.hpp \ + asio/experimental/impl/as_single.hpp \ + asio/experimental/impl/channel_error.ipp \ + asio/experimental/impl/co_composed.hpp \ + asio/experimental/impl/coro.hpp \ + asio/experimental/impl/parallel_group.hpp \ + asio/experimental/impl/promise.hpp \ + asio/experimental/impl/use_coro.hpp \ + asio/experimental/impl/use_promise.hpp \ + asio/experimental/parallel_group.hpp \ + asio/experimental/prepend.hpp \ + asio/experimental/promise.hpp \ + asio/experimental/use_coro.hpp \ + asio/experimental/use_promise.hpp \ + asio/file_base.hpp \ asio/generic/basic_endpoint.hpp \ asio/generic/datagram_protocol.hpp \ asio/generic/detail/endpoint.hpp \ @@ -346,15 +445,21 @@ nobase_include_HEADERS = \ asio/handler_invoke_hook.hpp \ asio/high_resolution_timer.hpp \ asio.hpp \ + asio/impl/any_completion_executor.ipp \ + asio/impl/any_io_executor.ipp \ + asio/impl/append.hpp \ + asio/impl/as_tuple.hpp \ asio/impl/awaitable.hpp \ asio/impl/buffered_read_stream.hpp \ asio/impl/buffered_write_stream.hpp \ + asio/impl/cancellation_signal.ipp \ asio/impl/co_spawn.hpp \ - asio/impl/compose.hpp \ asio/impl/connect.hpp \ - asio/impl/defer.hpp \ + asio/impl/connect_pipe.hpp \ + asio/impl/connect_pipe.ipp \ + asio/impl/consign.hpp \ + asio/impl/deferred.hpp \ asio/impl/detached.hpp \ - asio/impl/dispatch.hpp \ asio/impl/error_code.ipp \ asio/impl/error.ipp \ asio/impl/execution_context.hpp \ @@ -365,7 +470,7 @@ nobase_include_HEADERS = \ asio/impl/io_context.hpp \ asio/impl/io_context.ipp \ asio/impl/multiple_exceptions.ipp \ - asio/impl/post.hpp \ + asio/impl/prepend.hpp \ asio/impl/read_at.hpp \ asio/impl/read.hpp \ asio/impl/read_until.hpp \ @@ -373,7 +478,6 @@ nobase_include_HEADERS = \ asio/impl/serial_port_base.hpp \ asio/impl/serial_port_base.ipp \ asio/impl/spawn.hpp \ - asio/impl/src.cpp \ asio/impl/src.hpp \ asio/impl/system_context.hpp \ asio/impl/system_context.ipp \ @@ -429,6 +533,7 @@ nobase_include_HEADERS = \ asio/ip/unicast.hpp \ asio/ip/v6_only.hpp \ asio/is_applicable_property.hpp \ + asio/is_contiguous_iterator.hpp \ asio/is_executor.hpp \ asio/is_read_buffered.hpp \ asio/is_write_buffered.hpp \ @@ -437,6 +542,7 @@ nobase_include_HEADERS = \ asio/local/datagram_protocol.hpp \ asio/local/detail/endpoint.hpp \ asio/local/detail/impl/endpoint.ipp \ + asio/local/seq_packet_protocol.hpp \ asio/local/stream_protocol.hpp \ asio/multiple_exceptions.hpp \ asio/packaged_task.hpp \ @@ -448,15 +554,21 @@ nobase_include_HEADERS = \ asio/posix/stream_descriptor.hpp \ asio/post.hpp \ asio/prefer.hpp \ + asio/prepend.hpp \ asio/query.hpp \ + asio/random_access_file.hpp \ asio/read_at.hpp \ asio/read.hpp \ asio/read_until.hpp \ + asio/readable_pipe.hpp \ + asio/recycling_allocator.hpp \ asio/redirect_error.hpp \ + asio/registered_buffer.hpp \ asio/require.hpp \ asio/require_concept.hpp \ asio/serial_port_base.hpp \ asio/serial_port.hpp \ + asio/signal_set_base.hpp \ asio/signal_set.hpp \ asio/socket_base.hpp \ asio/spawn.hpp \ @@ -494,6 +606,7 @@ nobase_include_HEADERS = \ asio/steady_timer.hpp \ asio/strand.hpp \ asio/streambuf.hpp \ + asio/stream_file.hpp \ asio/system_context.hpp \ asio/system_error.hpp \ asio/system_executor.hpp \ @@ -556,6 +669,7 @@ nobase_include_HEADERS = \ asio/windows/overlapped_ptr.hpp \ asio/windows/random_access_handle.hpp \ asio/windows/stream_handle.hpp \ + asio/writable_pipe.hpp \ asio/write_at.hpp \ asio/write.hpp \ asio/yield.hpp diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio.hpp index 345aec71e..a973ab178 100644 --- a/tidal-link/link/modules/asio-standalone/asio/include/asio.hpp +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio.hpp @@ -2,7 +2,7 @@ // asio.hpp // ~~~~~~~~ // -// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -15,14 +15,25 @@ # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) +#include "asio/any_completion_executor.hpp" +#include "asio/any_completion_handler.hpp" +#include "asio/any_io_executor.hpp" +#include "asio/append.hpp" +#include "asio/as_tuple.hpp" #include "asio/associated_allocator.hpp" +#include "asio/associated_cancellation_slot.hpp" #include "asio/associated_executor.hpp" +#include "asio/associated_immediate_executor.hpp" +#include "asio/associator.hpp" #include "asio/async_result.hpp" #include "asio/awaitable.hpp" #include "asio/basic_datagram_socket.hpp" #include "asio/basic_deadline_timer.hpp" +#include "asio/basic_file.hpp" #include "asio/basic_io_object.hpp" +#include "asio/basic_random_access_file.hpp" #include "asio/basic_raw_socket.hpp" +#include "asio/basic_readable_pipe.hpp" #include "asio/basic_seq_packet_socket.hpp" #include "asio/basic_serial_port.hpp" #include "asio/basic_signal_set.hpp" @@ -30,11 +41,17 @@ #include "asio/basic_socket_acceptor.hpp" #include "asio/basic_socket_iostream.hpp" #include "asio/basic_socket_streambuf.hpp" +#include "asio/basic_stream_file.hpp" #include "asio/basic_stream_socket.hpp" #include "asio/basic_streambuf.hpp" #include "asio/basic_waitable_timer.hpp" +#include "asio/basic_writable_pipe.hpp" +#include "asio/bind_allocator.hpp" +#include "asio/bind_cancellation_slot.hpp" #include "asio/bind_executor.hpp" +#include "asio/bind_immediate_executor.hpp" #include "asio/buffer.hpp" +#include "asio/buffer_registration.hpp" #include "asio/buffered_read_stream_fwd.hpp" #include "asio/buffered_read_stream.hpp" #include "asio/buffered_stream_fwd.hpp" @@ -42,13 +59,19 @@ #include "asio/buffered_write_stream_fwd.hpp" #include "asio/buffered_write_stream.hpp" #include "asio/buffers_iterator.hpp" +#include "asio/cancellation_signal.hpp" +#include "asio/cancellation_state.hpp" +#include "asio/cancellation_type.hpp" #include "asio/co_spawn.hpp" #include "asio/completion_condition.hpp" #include "asio/compose.hpp" #include "asio/connect.hpp" +#include "asio/connect_pipe.hpp" +#include "asio/consign.hpp" #include "asio/coroutine.hpp" #include "asio/deadline_timer.hpp" #include "asio/defer.hpp" +#include "asio/deferred.hpp" #include "asio/detached.hpp" #include "asio/dispatch.hpp" #include "asio/error.hpp" @@ -84,6 +107,7 @@ #include "asio/execution_context.hpp" #include "asio/executor.hpp" #include "asio/executor_work_guard.hpp" +#include "asio/file_base.hpp" #include "asio/generic/basic_endpoint.hpp" #include "asio/generic/datagram_protocol.hpp" #include "asio/generic/raw_protocol.hpp" @@ -122,12 +146,14 @@ #include "asio/ip/unicast.hpp" #include "asio/ip/v6_only.hpp" #include "asio/is_applicable_property.hpp" +#include "asio/is_contiguous_iterator.hpp" #include "asio/is_executor.hpp" #include "asio/is_read_buffered.hpp" #include "asio/is_write_buffered.hpp" #include "asio/local/basic_endpoint.hpp" #include "asio/local/connect_pair.hpp" #include "asio/local/datagram_protocol.hpp" +#include "asio/local/seq_packet_protocol.hpp" #include "asio/local/stream_protocol.hpp" #include "asio/multiple_exceptions.hpp" #include "asio/packaged_task.hpp" @@ -139,20 +165,27 @@ #include "asio/posix/stream_descriptor.hpp" #include "asio/post.hpp" #include "asio/prefer.hpp" +#include "asio/prepend.hpp" #include "asio/query.hpp" +#include "asio/random_access_file.hpp" #include "asio/read.hpp" #include "asio/read_at.hpp" #include "asio/read_until.hpp" +#include "asio/readable_pipe.hpp" +#include "asio/recycling_allocator.hpp" #include "asio/redirect_error.hpp" +#include "asio/registered_buffer.hpp" #include "asio/require.hpp" #include "asio/require_concept.hpp" #include "asio/serial_port.hpp" #include "asio/serial_port_base.hpp" #include "asio/signal_set.hpp" +#include "asio/signal_set_base.hpp" #include "asio/socket_base.hpp" #include "asio/static_thread_pool.hpp" #include "asio/steady_timer.hpp" #include "asio/strand.hpp" +#include "asio/stream_file.hpp" #include "asio/streambuf.hpp" #include "asio/system_context.hpp" #include "asio/system_error.hpp" @@ -176,6 +209,7 @@ #include "asio/windows/overlapped_ptr.hpp" #include "asio/windows/random_access_handle.hpp" #include "asio/windows/stream_handle.hpp" +#include "asio/writable_pipe.hpp" #include "asio/write.hpp" #include "asio/write_at.hpp" diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/any_completion_executor.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/any_completion_executor.hpp new file mode 100644 index 000000000..420927cc1 --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/any_completion_executor.hpp @@ -0,0 +1,342 @@ +// +// any_completion_executor.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_ANY_COMPLETION_EXECUTOR_HPP +#define ASIO_ANY_COMPLETION_EXECUTOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" +#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) +# include "asio/executor.hpp" +#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) +# include "asio/execution.hpp" +#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + +#include "asio/detail/push_options.hpp" + +namespace asio { + +#if defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + +typedef executor any_completion_executor; + +#else // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + +/// Polymorphic executor type for use with I/O objects. +/** + * The @c any_completion_executor type is a polymorphic executor that supports + * the set of properties required for the execution of completion handlers. It + * is defined as the execution::any_executor class template parameterised as + * follows: + * @code execution::any_executor< + * execution::prefer_only, + * execution::prefer_only + * execution::prefer_only, + * execution::prefer_only + * > @endcode + */ +class any_completion_executor : +#if defined(GENERATING_DOCUMENTATION) + public execution::any_executor<...> +#else // defined(GENERATING_DOCUMENTATION) + public execution::any_executor< + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only + > +#endif // defined(GENERATING_DOCUMENTATION) +{ +public: +#if !defined(GENERATING_DOCUMENTATION) + typedef execution::any_executor< + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only + > base_type; + + typedef void supportable_properties_type( + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only + ); +#endif // !defined(GENERATING_DOCUMENTATION) + + /// Default constructor. + ASIO_DECL any_completion_executor() ASIO_NOEXCEPT; + + /// Construct in an empty state. Equivalent effects to default constructor. + ASIO_DECL any_completion_executor(nullptr_t) ASIO_NOEXCEPT; + + /// Copy constructor. + ASIO_DECL any_completion_executor( + const any_completion_executor& e) ASIO_NOEXCEPT; + +#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + /// Move constructor. + ASIO_DECL any_completion_executor( + any_completion_executor&& e) ASIO_NOEXCEPT; +#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + + /// Construct to point to the same target as another any_executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_completion_executor( + execution::any_executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(OtherAnyExecutor e, + typename constraint< + conditional< + !is_same::value + && is_base_of::value, + typename execution::detail::supportable_properties< + 0, supportable_properties_type>::template + is_valid_target, + false_type + >::type::value + >::type = 0) + : base_type(ASIO_MOVE_CAST(OtherAnyExecutor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Construct to point to the same target as another any_executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(std::nothrow_t, + execution::any_executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(std::nothrow_t, OtherAnyExecutor e, + typename constraint< + conditional< + !is_same::value + && is_base_of::value, + typename execution::detail::supportable_properties< + 0, supportable_properties_type>::template + is_valid_target, + false_type + >::type::value + >::type = 0) ASIO_NOEXCEPT + : base_type(std::nothrow, ASIO_MOVE_CAST(OtherAnyExecutor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Construct to point to the same target as another any_executor. + ASIO_DECL any_completion_executor(std::nothrow_t, + const any_completion_executor& e) ASIO_NOEXCEPT; + +#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + /// Construct to point to the same target as another any_executor. + ASIO_DECL any_completion_executor(std::nothrow_t, + any_completion_executor&& e) ASIO_NOEXCEPT; +#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + + /// Construct a polymorphic wrapper for the specified executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(Executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(Executor e, + typename constraint< + conditional< + !is_same::value + && !is_base_of::value, + execution::detail::is_valid_target_executor< + Executor, supportable_properties_type>, + false_type + >::type::value + >::type = 0) + : base_type(ASIO_MOVE_CAST(Executor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Construct a polymorphic wrapper for the specified executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(std::nothrow_t, Executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_completion_executor(std::nothrow_t, Executor e, + typename constraint< + conditional< + !is_same::value + && !is_base_of::value, + execution::detail::is_valid_target_executor< + Executor, supportable_properties_type>, + false_type + >::type::value + >::type = 0) ASIO_NOEXCEPT + : base_type(std::nothrow, ASIO_MOVE_CAST(Executor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Assignment operator. + ASIO_DECL any_completion_executor& operator=( + const any_completion_executor& e) ASIO_NOEXCEPT; + +#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + /// Move assignment operator. + ASIO_DECL any_completion_executor& operator=( + any_completion_executor&& e) ASIO_NOEXCEPT; +#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + + /// Assignment operator that sets the polymorphic wrapper to the empty state. + ASIO_DECL any_completion_executor& operator=(nullptr_t); + + /// Destructor. + ASIO_DECL ~any_completion_executor(); + + /// Swap targets with another polymorphic wrapper. + ASIO_DECL void swap(any_completion_executor& other) ASIO_NOEXCEPT; + + /// Obtain a polymorphic wrapper with the specified property. + /** + * Do not call this function directly. It is intended for use with the + * asio::require and asio::prefer customisation points. + * + * For example: + * @code any_completion_executor ex = ...; + * auto ex2 = asio::require(ex, execution::relationship.fork); @endcode + */ + template + any_completion_executor require(const Property& p, + typename constraint< + traits::require_member::is_valid + >::type = 0) const + { + return static_cast(*this).require(p); + } + + /// Obtain a polymorphic wrapper with the specified property. + /** + * Do not call this function directly. It is intended for use with the + * asio::prefer customisation point. + * + * For example: + * @code any_completion_executor ex = ...; + * auto ex2 = asio::prefer(ex, execution::relationship.fork); @endcode + */ + template + any_completion_executor prefer(const Property& p, + typename constraint< + traits::prefer_member::is_valid + >::type = 0) const + { + return static_cast(*this).prefer(p); + } +}; + +#if !defined(GENERATING_DOCUMENTATION) + +template <> +ASIO_DECL any_completion_executor any_completion_executor::prefer( + const execution::outstanding_work_t::tracked_t&, int) const; + +template <> +ASIO_DECL any_completion_executor any_completion_executor::prefer( + const execution::outstanding_work_t::untracked_t&, int) const; + +template <> +ASIO_DECL any_completion_executor any_completion_executor::prefer( + const execution::relationship_t::fork_t&, int) const; + +template <> +ASIO_DECL any_completion_executor any_completion_executor::prefer( + const execution::relationship_t::continuation_t&, int) const; + +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable +{ + static const bool is_valid = true; + static const bool is_noexcept = true; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template +struct execute_member +{ + static const bool is_valid = true; + static const bool is_noexcept = false; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template +struct query_member : + query_member +{ +}; + +#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +template +struct require_member : + require_member +{ + typedef any_completion_executor result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT) + +template +struct prefer_member : + prefer_member +{ + typedef any_completion_executor result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT) + +} // namespace traits + +#endif // !defined(GENERATING_DOCUMENTATION) + +#endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#if defined(ASIO_HEADER_ONLY) \ + && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) +# include "asio/impl/any_completion_executor.ipp" +#endif // defined(ASIO_HEADER_ONLY) + // && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + +#endif // ASIO_ANY_COMPLETION_EXECUTOR_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/any_completion_handler.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/any_completion_handler.hpp new file mode 100644 index 000000000..cd114537f --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/any_completion_handler.hpp @@ -0,0 +1,762 @@ +// +// any_completion_handler.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_ANY_COMPLETION_HANDLER_HPP +#define ASIO_ANY_COMPLETION_HANDLER_HPP + +#include "asio/detail/config.hpp" + +#if (defined(ASIO_HAS_STD_TUPLE) \ + && defined(ASIO_HAS_MOVE) \ + && defined(ASIO_HAS_VARIADIC_TEMPLATES)) \ + || defined(GENERATING_DOCUMENTATION) + +#include +#include +#include +#include +#include "asio/any_completion_executor.hpp" +#include "asio/associated_allocator.hpp" +#include "asio/associated_cancellation_slot.hpp" +#include "asio/associated_executor.hpp" +#include "asio/cancellation_state.hpp" +#include "asio/recycling_allocator.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { +namespace detail { + +class any_completion_handler_impl_base +{ +public: + template + explicit any_completion_handler_impl_base(S&& slot) + : cancel_state_(ASIO_MOVE_CAST(S)(slot), enable_total_cancellation()) + { + } + + cancellation_slot get_cancellation_slot() const ASIO_NOEXCEPT + { + return cancel_state_.slot(); + } + +private: + cancellation_state cancel_state_; +}; + +template +class any_completion_handler_impl : + public any_completion_handler_impl_base +{ +public: + template + any_completion_handler_impl(S&& slot, H&& h) + : any_completion_handler_impl_base(ASIO_MOVE_CAST(S)(slot)), + handler_(ASIO_MOVE_CAST(H)(h)) + { + } + + struct uninit_deleter + { + typename std::allocator_traits< + associated_allocator_t>>::template + rebind_alloc alloc; + + void operator()(any_completion_handler_impl* ptr) + { + std::allocator_traits::deallocate(alloc, ptr, 1); + } + }; + + struct deleter + { + typename std::allocator_traits< + associated_allocator_t>>::template + rebind_alloc alloc; + + void operator()(any_completion_handler_impl* ptr) + { + std::allocator_traits::destroy(alloc, ptr); + std::allocator_traits::deallocate(alloc, ptr, 1); + } + }; + + template + static any_completion_handler_impl* create(S&& slot, H&& h) + { + uninit_deleter d{ + (get_associated_allocator)(h, + asio::recycling_allocator())}; + + std::unique_ptr uninit_ptr( + std::allocator_traits::allocate(d.alloc, 1), d); + + any_completion_handler_impl* ptr = + new (uninit_ptr.get()) any_completion_handler_impl( + ASIO_MOVE_CAST(S)(slot), ASIO_MOVE_CAST(H)(h)); + + uninit_ptr.release(); + return ptr; + } + + void destroy() + { + deleter d{ + (get_associated_allocator)(handler_, + asio::recycling_allocator())}; + + d(this); + } + + any_completion_executor executor( + const any_completion_executor& candidate) const ASIO_NOEXCEPT + { + return any_completion_executor(std::nothrow, + (get_associated_executor)(handler_, candidate)); + } + + void* allocate(std::size_t size, std::size_t align) const + { + typename std::allocator_traits< + associated_allocator_t>>::template + rebind_alloc alloc( + (get_associated_allocator)(handler_, + asio::recycling_allocator())); + + std::size_t space = size + align - 1; + unsigned char* base = + std::allocator_traits::allocate( + alloc, space + sizeof(std::ptrdiff_t)); + + void* p = base; + if (detail::align(align, size, p, space)) + { + std::ptrdiff_t off = static_cast(p) - base; + std::memcpy(static_cast(p) + size, &off, sizeof(off)); + return p; + } + + std::bad_alloc ex; + asio::detail::throw_exception(ex); + return nullptr; + } + + void deallocate(void* p, std::size_t size, std::size_t align) const + { + if (p) + { + typename std::allocator_traits< + associated_allocator_t>>::template + rebind_alloc alloc( + (get_associated_allocator)(handler_, + asio::recycling_allocator())); + + std::ptrdiff_t off; + std::memcpy(&off, static_cast(p) + size, sizeof(off)); + unsigned char* base = static_cast(p) - off; + + std::allocator_traits::deallocate( + alloc, base, size + align -1 + sizeof(std::ptrdiff_t)); + } + } + + template + void call(Args&&... args) + { + deleter d{ + (get_associated_allocator)(handler_, + asio::recycling_allocator())}; + + std::unique_ptr ptr(this, d); + Handler handler(ASIO_MOVE_CAST(Handler)(handler_)); + ptr.reset(); + + ASIO_MOVE_CAST(Handler)(handler)( + ASIO_MOVE_CAST(Args)(args)...); + } + +private: + Handler handler_; +}; + +template +class any_completion_handler_call_fn; + +template +class any_completion_handler_call_fn +{ +public: + using type = void(*)(any_completion_handler_impl_base*, Args...); + + constexpr any_completion_handler_call_fn(type fn) + : call_fn_(fn) + { + } + + void call(any_completion_handler_impl_base* impl, Args... args) const + { + call_fn_(impl, ASIO_MOVE_CAST(Args)(args)...); + } + + template + static void impl(any_completion_handler_impl_base* impl, Args... args) + { + static_cast*>(impl)->call( + ASIO_MOVE_CAST(Args)(args)...); + } + +private: + type call_fn_; +}; + +template +class any_completion_handler_call_fns; + +template +class any_completion_handler_call_fns : + public any_completion_handler_call_fn +{ +public: + using any_completion_handler_call_fn< + Signature>::any_completion_handler_call_fn; + using any_completion_handler_call_fn::call; +}; + +template +class any_completion_handler_call_fns : + public any_completion_handler_call_fn, + public any_completion_handler_call_fns +{ +public: + template + constexpr any_completion_handler_call_fns(CallFn fn, CallFns... fns) + : any_completion_handler_call_fn(fn), + any_completion_handler_call_fns(fns...) + { + } + + using any_completion_handler_call_fn::call; + using any_completion_handler_call_fns::call; +}; + +class any_completion_handler_destroy_fn +{ +public: + using type = void(*)(any_completion_handler_impl_base*); + + constexpr any_completion_handler_destroy_fn(type fn) + : destroy_fn_(fn) + { + } + + void destroy(any_completion_handler_impl_base* impl) const + { + destroy_fn_(impl); + } + + template + static void impl(any_completion_handler_impl_base* impl) + { + static_cast*>(impl)->destroy(); + } + +private: + type destroy_fn_; +}; + +class any_completion_handler_executor_fn +{ +public: + using type = any_completion_executor(*)( + any_completion_handler_impl_base*, const any_completion_executor&); + + constexpr any_completion_handler_executor_fn(type fn) + : executor_fn_(fn) + { + } + + any_completion_executor executor(any_completion_handler_impl_base* impl, + const any_completion_executor& candidate) const + { + return executor_fn_(impl, candidate); + } + + template + static any_completion_executor impl(any_completion_handler_impl_base* impl, + const any_completion_executor& candidate) + { + return static_cast*>(impl)->executor( + candidate); + } + +private: + type executor_fn_; +}; + +class any_completion_handler_allocate_fn +{ +public: + using type = void*(*)(any_completion_handler_impl_base*, + std::size_t, std::size_t); + + constexpr any_completion_handler_allocate_fn(type fn) + : allocate_fn_(fn) + { + } + + void* allocate(any_completion_handler_impl_base* impl, + std::size_t size, std::size_t align) const + { + return allocate_fn_(impl, size, align); + } + + template + static void* impl(any_completion_handler_impl_base* impl, + std::size_t size, std::size_t align) + { + return static_cast*>(impl)->allocate( + size, align); + } + +private: + type allocate_fn_; +}; + +class any_completion_handler_deallocate_fn +{ +public: + using type = void(*)(any_completion_handler_impl_base*, + void*, std::size_t, std::size_t); + + constexpr any_completion_handler_deallocate_fn(type fn) + : deallocate_fn_(fn) + { + } + + void deallocate(any_completion_handler_impl_base* impl, + void* p, std::size_t size, std::size_t align) const + { + deallocate_fn_(impl, p, size, align); + } + + template + static void impl(any_completion_handler_impl_base* impl, + void* p, std::size_t size, std::size_t align) + { + static_cast*>(impl)->deallocate( + p, size, align); + } + +private: + type deallocate_fn_; +}; + +template +class any_completion_handler_fn_table + : private any_completion_handler_destroy_fn, + private any_completion_handler_executor_fn, + private any_completion_handler_allocate_fn, + private any_completion_handler_deallocate_fn, + private any_completion_handler_call_fns +{ +public: + template + constexpr any_completion_handler_fn_table( + any_completion_handler_destroy_fn::type destroy_fn, + any_completion_handler_executor_fn::type executor_fn, + any_completion_handler_allocate_fn::type allocate_fn, + any_completion_handler_deallocate_fn::type deallocate_fn, + CallFns... call_fns) + : any_completion_handler_destroy_fn(destroy_fn), + any_completion_handler_executor_fn(executor_fn), + any_completion_handler_allocate_fn(allocate_fn), + any_completion_handler_deallocate_fn(deallocate_fn), + any_completion_handler_call_fns(call_fns...) + { + } + + using any_completion_handler_destroy_fn::destroy; + using any_completion_handler_executor_fn::executor; + using any_completion_handler_allocate_fn::allocate; + using any_completion_handler_deallocate_fn::deallocate; + using any_completion_handler_call_fns::call; +}; + +template +struct any_completion_handler_fn_table_instance +{ + static constexpr any_completion_handler_fn_table + value = any_completion_handler_fn_table( + &any_completion_handler_destroy_fn::impl, + &any_completion_handler_executor_fn::impl, + &any_completion_handler_allocate_fn::impl, + &any_completion_handler_deallocate_fn::impl, + &any_completion_handler_call_fn::template impl...); +}; + +template +constexpr any_completion_handler_fn_table +any_completion_handler_fn_table_instance::value; + +} // namespace detail + +template +class any_completion_handler; + +/// An allocator type that forwards memory allocation operations through an +/// instance of @c any_completion_handler. +template +class any_completion_handler_allocator +{ +private: + template + friend class any_completion_handler; + + template + friend class any_completion_handler_allocator; + + const detail::any_completion_handler_fn_table* fn_table_; + detail::any_completion_handler_impl_base* impl_; + + constexpr any_completion_handler_allocator(int, + const any_completion_handler& h) ASIO_NOEXCEPT + : fn_table_(h.fn_table_), + impl_(h.impl_) + { + } + +public: + /// The type of objects that may be allocated by the allocator. + typedef T value_type; + + /// Rebinds an allocator to another value type. + template + struct rebind + { + /// Specifies the type of the rebound allocator. + typedef any_completion_handler_allocator other; + }; + + /// Construct from another @c any_completion_handler_allocator. + template + constexpr any_completion_handler_allocator( + const any_completion_handler_allocator& a) + ASIO_NOEXCEPT + : fn_table_(a.fn_table_), + impl_(a.impl_) + { + } + + /// Equality operator. + constexpr bool operator==( + const any_completion_handler_allocator& other) const ASIO_NOEXCEPT + { + return fn_table_ == other.fn_table_ && impl_ == other.impl_; + } + + /// Inequality operator. + constexpr bool operator!=( + const any_completion_handler_allocator& other) const ASIO_NOEXCEPT + { + return fn_table_ != other.fn_table_ || impl_ != other.impl_; + } + + /// Allocate space for @c n objects of the allocator's value type. + T* allocate(std::size_t n) const + { + return static_cast( + fn_table_->allocate( + impl_, sizeof(T) * n, alignof(T))); + } + + /// Deallocate space for @c n objects of the allocator's value type. + void deallocate(T* p, std::size_t n) const + { + fn_table_->deallocate(impl_, p, sizeof(T) * n, alignof(T)); + } +}; + +/// A protoco-allocator type that may be rebound to obtain an allocator that +/// forwards memory allocation operations through an instance of +/// @c any_completion_handler. +template +class any_completion_handler_allocator +{ +private: + template + friend class any_completion_handler; + + template + friend class any_completion_handler_allocator; + + const detail::any_completion_handler_fn_table* fn_table_; + detail::any_completion_handler_impl_base* impl_; + + constexpr any_completion_handler_allocator(int, + const any_completion_handler& h) ASIO_NOEXCEPT + : fn_table_(h.fn_table_), + impl_(h.impl_) + { + } + +public: + /// @c void as no objects can be allocated through a proto-allocator. + typedef void value_type; + + /// Rebinds an allocator to another value type. + template + struct rebind + { + /// Specifies the type of the rebound allocator. + typedef any_completion_handler_allocator other; + }; + + /// Construct from another @c any_completion_handler_allocator. + template + constexpr any_completion_handler_allocator( + const any_completion_handler_allocator& a) + ASIO_NOEXCEPT + : fn_table_(a.fn_table_), + impl_(a.impl_) + { + } + + /// Equality operator. + constexpr bool operator==( + const any_completion_handler_allocator& other) const ASIO_NOEXCEPT + { + return fn_table_ == other.fn_table_ && impl_ == other.impl_; + } + + /// Inequality operator. + constexpr bool operator!=( + const any_completion_handler_allocator& other) const ASIO_NOEXCEPT + { + return fn_table_ != other.fn_table_ || impl_ != other.impl_; + } +}; + +/// Polymorphic wrapper for completion handlers. +/** + * The @c any_completion_handler class template is a polymorphic wrapper for + * completion handlers that propagates the associated executor, associated + * allocator, and associated cancellation slot through a type-erasing interface. + * + * When using @c any_completion_handler, specify one or more completion + * signatures as template parameters. These will dictate the arguments that may + * be passed to the handler through the polymorphic interface. + * + * Typical uses for @c any_completion_handler include: + * + * @li Separate compilation of asynchronous operation implementations. + * + * @li Enabling interoperability between asynchronous operations and virtual + * functions. + */ +template +class any_completion_handler +{ +#if !defined(GENERATING_DOCUMENTATION) +private: + template + friend class any_completion_handler_allocator; + + template + friend struct associated_executor; + + const detail::any_completion_handler_fn_table* fn_table_; + detail::any_completion_handler_impl_base* impl_; +#endif // !defined(GENERATING_DOCUMENTATION) + +public: + /// The associated allocator type. + using allocator_type = any_completion_handler_allocator; + + /// The associated cancellation slot type. + using cancellation_slot_type = cancellation_slot; + + /// Construct an @c any_completion_handler in an empty state, without a target + /// object. + constexpr any_completion_handler() + : fn_table_(nullptr), + impl_(nullptr) + { + } + + /// Construct an @c any_completion_handler in an empty state, without a target + /// object. + constexpr any_completion_handler(nullptr_t) + : fn_table_(nullptr), + impl_(nullptr) + { + } + + /// Construct an @c any_completion_handler to contain the specified target. + template ::type> + any_completion_handler(H&& h, + typename constraint< + !is_same::type, any_completion_handler>::value + >::type = 0) + : fn_table_( + &detail::any_completion_handler_fn_table_instance< + Handler, Signatures...>::value), + impl_(detail::any_completion_handler_impl::create( + (get_associated_cancellation_slot)(h), ASIO_MOVE_CAST(H)(h))) + { + } + + /// Move-construct an @c any_completion_handler from another. + /** + * After the operation, the moved-from object @c other has no target. + */ + any_completion_handler(any_completion_handler&& other) ASIO_NOEXCEPT + : fn_table_(other.fn_table_), + impl_(other.impl_) + { + other.fn_table_ = nullptr; + other.impl_ = nullptr; + } + + /// Move-assign an @c any_completion_handler from another. + /** + * After the operation, the moved-from object @c other has no target. + */ + any_completion_handler& operator=( + any_completion_handler&& other) ASIO_NOEXCEPT + { + any_completion_handler( + ASIO_MOVE_CAST(any_completion_handler)(other)).swap(*this); + return *this; + } + + /// Assignment operator that sets the polymorphic wrapper to the empty state. + any_completion_handler& operator=(nullptr_t) ASIO_NOEXCEPT + { + any_completion_handler().swap(*this); + return *this; + } + + /// Destructor. + ~any_completion_handler() + { + if (impl_) + fn_table_->destroy(impl_); + } + + /// Test if the polymorphic wrapper is empty. + constexpr explicit operator bool() const ASIO_NOEXCEPT + { + return impl_ != nullptr; + } + + /// Test if the polymorphic wrapper is non-empty. + constexpr bool operator!() const ASIO_NOEXCEPT + { + return impl_ == nullptr; + } + + /// Swap the content of an @c any_completion_handler with another. + void swap(any_completion_handler& other) ASIO_NOEXCEPT + { + std::swap(fn_table_, other.fn_table_); + std::swap(impl_, other.impl_); + } + + /// Get the associated allocator. + allocator_type get_allocator() const ASIO_NOEXCEPT + { + return allocator_type(0, *this); + } + + /// Get the associated cancellation slot. + cancellation_slot_type get_cancellation_slot() const ASIO_NOEXCEPT + { + return impl_->get_cancellation_slot(); + } + + /// Function call operator. + /** + * Invokes target completion handler with the supplied arguments. + * + * This function may only be called once, as the target handler is moved from. + * The polymorphic wrapper is left in an empty state. + * + * Throws @c std::bad_function_call if the polymorphic wrapper is empty. + */ + template + auto operator()(Args&&... args) + -> decltype(fn_table_->call(impl_, ASIO_MOVE_CAST(Args)(args)...)) + { + if (detail::any_completion_handler_impl_base* impl = impl_) + { + impl_ = nullptr; + return fn_table_->call(impl, ASIO_MOVE_CAST(Args)(args)...); + } + std::bad_function_call ex; + asio::detail::throw_exception(ex); + } + + /// Equality operator. + friend constexpr bool operator==( + const any_completion_handler& a, nullptr_t) ASIO_NOEXCEPT + { + return a.impl_ == nullptr; + } + + /// Equality operator. + friend constexpr bool operator==( + nullptr_t, const any_completion_handler& b) ASIO_NOEXCEPT + { + return nullptr == b.impl_; + } + + /// Inequality operator. + friend constexpr bool operator!=( + const any_completion_handler& a, nullptr_t) ASIO_NOEXCEPT + { + return a.impl_ != nullptr; + } + + /// Inequality operator. + friend constexpr bool operator!=( + nullptr_t, const any_completion_handler& b) ASIO_NOEXCEPT + { + return nullptr != b.impl_; + } +}; + +template +struct associated_executor, Candidate> +{ + using type = any_completion_executor; + + static type get(const any_completion_handler& handler, + const Candidate& candidate = Candidate()) ASIO_NOEXCEPT + { + return handler.fn_table_->executor(handler.impl_, + any_completion_executor(std::nothrow, candidate)); + } +}; + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#endif // (defined(ASIO_HAS_STD_TUPLE) + // && defined(ASIO_HAS_MOVE) + // && defined(ASIO_HAS_VARIADIC_TEMPLATES)) + // || defined(GENERATING_DOCUMENTATION) + +#endif // ASIO_ANY_COMPLETION_HANDLER_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/any_io_executor.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/any_io_executor.hpp index 3a4d13b6c..7a77c90d1 100644 --- a/tidal-link/link/modules/asio-standalone/asio/include/asio/any_io_executor.hpp +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/any_io_executor.hpp @@ -2,7 +2,7 @@ // any_io_executor.hpp // ~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -48,19 +48,301 @@ typedef executor any_io_executor; * execution::prefer_only * > @endcode */ +class any_io_executor : #if defined(GENERATING_DOCUMENTATION) -typedef execution::any_executor<...> any_io_executor; + public execution::any_executor<...> #else // defined(GENERATING_DOCUMENTATION) -typedef execution::any_executor< - execution::context_as_t, - execution::blocking_t::never_t, - execution::prefer_only, - execution::prefer_only, - execution::prefer_only, - execution::prefer_only, - execution::prefer_only - > any_io_executor; + public execution::any_executor< + execution::context_as_t, + execution::blocking_t::never_t, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only + > #endif // defined(GENERATING_DOCUMENTATION) +{ +public: +#if !defined(GENERATING_DOCUMENTATION) + typedef execution::any_executor< + execution::context_as_t, + execution::blocking_t::never_t, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only + > base_type; + + typedef void supportable_properties_type( + execution::context_as_t, + execution::blocking_t::never_t, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only, + execution::prefer_only + ); +#endif // !defined(GENERATING_DOCUMENTATION) + + /// Default constructor. + ASIO_DECL any_io_executor() ASIO_NOEXCEPT; + + /// Construct in an empty state. Equivalent effects to default constructor. + ASIO_DECL any_io_executor(nullptr_t) ASIO_NOEXCEPT; + + /// Copy constructor. + ASIO_DECL any_io_executor(const any_io_executor& e) ASIO_NOEXCEPT; + +#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + /// Move constructor. + ASIO_DECL any_io_executor(any_io_executor&& e) ASIO_NOEXCEPT; +#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + + /// Construct to point to the same target as another any_executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_io_executor(execution::any_executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_io_executor(OtherAnyExecutor e, + typename constraint< + conditional< + !is_same::value + && is_base_of::value, + typename execution::detail::supportable_properties< + 0, supportable_properties_type>::template + is_valid_target, + false_type + >::type::value + >::type = 0) + : base_type(ASIO_MOVE_CAST(OtherAnyExecutor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Construct to point to the same target as another any_executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_io_executor(std::nothrow_t, + execution::any_executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_io_executor(std::nothrow_t, OtherAnyExecutor e, + typename constraint< + conditional< + !is_same::value + && is_base_of::value, + typename execution::detail::supportable_properties< + 0, supportable_properties_type>::template + is_valid_target, + false_type + >::type::value + >::type = 0) ASIO_NOEXCEPT + : base_type(std::nothrow, ASIO_MOVE_CAST(OtherAnyExecutor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Construct to point to the same target as another any_executor. + ASIO_DECL any_io_executor(std::nothrow_t, + const any_io_executor& e) ASIO_NOEXCEPT; + +#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + /// Construct to point to the same target as another any_executor. + ASIO_DECL any_io_executor(std::nothrow_t, + any_io_executor&& e) ASIO_NOEXCEPT; +#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + + /// Construct a polymorphic wrapper for the specified executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_io_executor(Executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_io_executor(Executor e, + typename constraint< + conditional< + !is_same::value + && !is_base_of::value, + execution::detail::is_valid_target_executor< + Executor, supportable_properties_type>, + false_type + >::type::value + >::type = 0) + : base_type(ASIO_MOVE_CAST(Executor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Construct a polymorphic wrapper for the specified executor. +#if defined(GENERATING_DOCUMENTATION) + template + any_io_executor(std::nothrow_t, Executor e); +#else // defined(GENERATING_DOCUMENTATION) + template + any_io_executor(std::nothrow_t, Executor e, + typename constraint< + conditional< + !is_same::value + && !is_base_of::value, + execution::detail::is_valid_target_executor< + Executor, supportable_properties_type>, + false_type + >::type::value + >::type = 0) ASIO_NOEXCEPT + : base_type(std::nothrow, ASIO_MOVE_CAST(Executor)(e)) + { + } +#endif // defined(GENERATING_DOCUMENTATION) + + /// Assignment operator. + ASIO_DECL any_io_executor& operator=( + const any_io_executor& e) ASIO_NOEXCEPT; + +#if defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + /// Move assignment operator. + ASIO_DECL any_io_executor& operator=( + any_io_executor&& e) ASIO_NOEXCEPT; +#endif // defined(ASIO_HAS_MOVE) || defined(GENERATING_DOCUMENTATION) + + /// Assignment operator that sets the polymorphic wrapper to the empty state. + ASIO_DECL any_io_executor& operator=(nullptr_t); + + /// Destructor. + ASIO_DECL ~any_io_executor(); + + /// Swap targets with another polymorphic wrapper. + ASIO_DECL void swap(any_io_executor& other) ASIO_NOEXCEPT; + + /// Obtain a polymorphic wrapper with the specified property. + /** + * Do not call this function directly. It is intended for use with the + * asio::require and asio::prefer customisation points. + * + * For example: + * @code any_io_executor ex = ...; + * auto ex2 = asio::require(ex, execution::blocking.possibly); @endcode + */ + template + any_io_executor require(const Property& p, + typename constraint< + traits::require_member::is_valid + >::type = 0) const + { + return static_cast(*this).require(p); + } + + /// Obtain a polymorphic wrapper with the specified property. + /** + * Do not call this function directly. It is intended for use with the + * asio::prefer customisation point. + * + * For example: + * @code any_io_executor ex = ...; + * auto ex2 = asio::prefer(ex, execution::blocking.possibly); @endcode + */ + template + any_io_executor prefer(const Property& p, + typename constraint< + traits::prefer_member::is_valid + >::type = 0) const + { + return static_cast(*this).prefer(p); + } +}; + +#if !defined(GENERATING_DOCUMENTATION) + +template <> +ASIO_DECL any_io_executor any_io_executor::require( + const execution::blocking_t::never_t&, int) const; + +template <> +ASIO_DECL any_io_executor any_io_executor::prefer( + const execution::blocking_t::possibly_t&, int) const; + +template <> +ASIO_DECL any_io_executor any_io_executor::prefer( + const execution::outstanding_work_t::tracked_t&, int) const; + +template <> +ASIO_DECL any_io_executor any_io_executor::prefer( + const execution::outstanding_work_t::untracked_t&, int) const; + +template <> +ASIO_DECL any_io_executor any_io_executor::prefer( + const execution::relationship_t::fork_t&, int) const; + +template <> +ASIO_DECL any_io_executor any_io_executor::prefer( + const execution::relationship_t::continuation_t&, int) const; + +namespace traits { + +#if !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +template <> +struct equality_comparable +{ + static const bool is_valid = true; + static const bool is_noexcept = true; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EQUALITY_COMPARABLE_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +template +struct execute_member +{ + static const bool is_valid = true; + static const bool is_noexcept = false; + typedef void result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_EXECUTE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +template +struct query_member : + query_member +{ +}; + +#endif // !defined(ASIO_HAS_DEDUCED_QUERY_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +template +struct require_member : + require_member +{ + typedef any_io_executor result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_REQUIRE_MEMBER_TRAIT) + +#if !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT) + +template +struct prefer_member : + prefer_member +{ + typedef any_io_executor result_type; +}; + +#endif // !defined(ASIO_HAS_DEDUCED_PREFER_MEMBER_TRAIT) + +} // namespace traits + +#endif // !defined(GENERATING_DOCUMENTATION) #endif // defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) @@ -68,4 +350,10 @@ typedef execution::any_executor< #include "asio/detail/pop_options.hpp" +#if defined(ASIO_HEADER_ONLY) \ + && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) +# include "asio/impl/any_io_executor.ipp" +#endif // defined(ASIO_HEADER_ONLY) + // && !defined(ASIO_USE_TS_EXECUTOR_AS_DEFAULT) + #endif // ASIO_ANY_IO_EXECUTOR_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/append.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/append.hpp new file mode 100644 index 000000000..9ac4a9504 --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/append.hpp @@ -0,0 +1,78 @@ +// +// append.hpp +// ~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_APPEND_HPP +#define ASIO_APPEND_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" + +#if (defined(ASIO_HAS_STD_TUPLE) \ + && defined(ASIO_HAS_VARIADIC_TEMPLATES)) \ + || defined(GENERATING_DOCUMENTATION) + +#include +#include "asio/detail/type_traits.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { + +/// Completion token type used to specify that the completion handler +/// arguments should be passed additional values after the results of the +/// operation. +template +class append_t +{ +public: + /// Constructor. + template + ASIO_CONSTEXPR explicit append_t( + ASIO_MOVE_ARG(T) completion_token, + ASIO_MOVE_ARG(V)... values) + : token_(ASIO_MOVE_CAST(T)(completion_token)), + values_(ASIO_MOVE_CAST(V)(values)...) + { + } + +//private: + CompletionToken token_; + std::tuple values_; +}; + +/// Completion token type used to specify that the completion handler +/// arguments should be passed additional values after the results of the +/// operation. +template +ASIO_NODISCARD inline ASIO_CONSTEXPR append_t< + typename decay::type, typename decay::type...> +append(ASIO_MOVE_ARG(CompletionToken) completion_token, + ASIO_MOVE_ARG(Values)... values) +{ + return append_t< + typename decay::type, typename decay::type...>( + ASIO_MOVE_CAST(CompletionToken)(completion_token), + ASIO_MOVE_CAST(Values)(values)...); +} + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#include "asio/impl/append.hpp" + +#endif // (defined(ASIO_HAS_STD_TUPLE) + // && defined(ASIO_HAS_VARIADIC_TEMPLATES)) + // || defined(GENERATING_DOCUMENTATION) + +#endif // ASIO_APPEND_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/as_tuple.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/as_tuple.hpp new file mode 100644 index 000000000..96ac47c82 --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/as_tuple.hpp @@ -0,0 +1,139 @@ +// +// as_tuple.hpp +// ~~~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_AS_TUPLE_HPP +#define ASIO_AS_TUPLE_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" + +#if (defined(ASIO_HAS_STD_TUPLE) \ + && defined(ASIO_HAS_VARIADIC_TEMPLATES)) \ + || defined(GENERATING_DOCUMENTATION) + +#include "asio/detail/type_traits.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { + +/// A @ref completion_token adapter used to specify that the completion handler +/// arguments should be combined into a single tuple argument. +/** + * The as_tuple_t class is used to indicate that any arguments to the + * completion handler should be combined and passed as a single tuple argument. + * The arguments are first moved into a @c std::tuple and that tuple is then + * passed to the completion handler. + */ +template +class as_tuple_t +{ +public: + /// Tag type used to prevent the "default" constructor from being used for + /// conversions. + struct default_constructor_tag {}; + + /// Default constructor. + /** + * This constructor is only valid if the underlying completion token is + * default constructible and move constructible. The underlying completion + * token is itself defaulted as an argument to allow it to capture a source + * location. + */ + ASIO_CONSTEXPR as_tuple_t( + default_constructor_tag = default_constructor_tag(), + CompletionToken token = CompletionToken()) + : token_(ASIO_MOVE_CAST(CompletionToken)(token)) + { + } + + /// Constructor. + template + ASIO_CONSTEXPR explicit as_tuple_t( + ASIO_MOVE_ARG(T) completion_token) + : token_(ASIO_MOVE_CAST(T)(completion_token)) + { + } + + /// Adapts an executor to add the @c as_tuple_t completion token as the + /// default. + template + struct executor_with_default : InnerExecutor + { + /// Specify @c as_tuple_t as the default completion token type. + typedef as_tuple_t default_completion_token_type; + + /// Construct the adapted executor from the inner executor type. + template + executor_with_default(const InnerExecutor1& ex, + typename constraint< + conditional< + !is_same::value, + is_convertible, + false_type + >::type::value + >::type = 0) ASIO_NOEXCEPT + : InnerExecutor(ex) + { + } + }; + + /// Type alias to adapt an I/O object to use @c as_tuple_t as its + /// default completion token type. +#if defined(ASIO_HAS_ALIAS_TEMPLATES) \ + || defined(GENERATING_DOCUMENTATION) + template + using as_default_on_t = typename T::template rebind_executor< + executor_with_default >::other; +#endif // defined(ASIO_HAS_ALIAS_TEMPLATES) + // || defined(GENERATING_DOCUMENTATION) + + /// Function helper to adapt an I/O object to use @c as_tuple_t as its + /// default completion token type. + template + static typename decay::type::template rebind_executor< + executor_with_default::type::executor_type> + >::other + as_default_on(ASIO_MOVE_ARG(T) object) + { + return typename decay::type::template rebind_executor< + executor_with_default::type::executor_type> + >::other(ASIO_MOVE_CAST(T)(object)); + } + +//private: + CompletionToken token_; +}; + +/// Adapt a @ref completion_token to specify that the completion handler +/// arguments should be combined into a single tuple argument. +template +ASIO_NODISCARD inline +ASIO_CONSTEXPR as_tuple_t::type> +as_tuple(ASIO_MOVE_ARG(CompletionToken) completion_token) +{ + return as_tuple_t::type>( + ASIO_MOVE_CAST(CompletionToken)(completion_token)); +} + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#include "asio/impl/as_tuple.hpp" + +#endif // (defined(ASIO_HAS_STD_TUPLE) + // && defined(ASIO_HAS_VARIADIC_TEMPLATES)) + // || defined(GENERATING_DOCUMENTATION) + +#endif // ASIO_AS_TUPLE_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_allocator.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_allocator.hpp index 14d76b623..8e864673c 100644 --- a/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_allocator.hpp +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_allocator.hpp @@ -2,7 +2,7 @@ // associated_allocator.hpp // ~~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -17,36 +17,81 @@ #include "asio/detail/config.hpp" #include +#include "asio/associator.hpp" +#include "asio/detail/functional.hpp" #include "asio/detail/type_traits.hpp" #include "asio/detail/push_options.hpp" namespace asio { + +template +struct associated_allocator; + namespace detail { -template +template +struct has_allocator_type : false_type +{ +}; + +template +struct has_allocator_type::type> + : true_type +{ +}; + +template struct associated_allocator_impl { - typedef E type; + typedef void asio_associated_allocator_is_unspecialised; + + typedef A type; + + static type get(const T&) ASIO_NOEXCEPT + { + return type(); + } - static type get(const T&, const E& e) ASIO_NOEXCEPT + static const type& get(const T&, const A& a) ASIO_NOEXCEPT { - return e; + return a; } }; -template -struct associated_allocator_impl +struct associated_allocator_impl::type> { typedef typename T::allocator_type type; - static type get(const T& t, const E&) ASIO_NOEXCEPT + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + const T& t) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX((t.get_allocator())) + { + return t.get_allocator(); + } + + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + const T& t, const A&) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX((t.get_allocator())) { return t.get_allocator(); } }; +template +struct associated_allocator_impl::value + >::type, + typename void_type< + typename associator::type + >::type> : associator +{ +}; + } // namespace detail /// Traits type used to obtain the allocator associated with an object. @@ -63,29 +108,32 @@ struct associated_allocator_impl > struct associated_allocator +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_allocator_impl +#endif // !defined(GENERATING_DOCUMENTATION) { +#if defined(GENERATING_DOCUMENTATION) /// If @c T has a nested type @c allocator_type, T::allocator_type. /// Otherwise @c Allocator. -#if defined(GENERATING_DOCUMENTATION) typedef see_below type; -#else // defined(GENERATING_DOCUMENTATION) - typedef typename detail::associated_allocator_impl::type type; -#endif // defined(GENERATING_DOCUMENTATION) + + /// If @c T has a nested type @c allocator_type, returns + /// t.get_allocator(). Otherwise returns @c type(). + static decltype(auto) get(const T& t) ASIO_NOEXCEPT; /// If @c T has a nested type @c allocator_type, returns /// t.get_allocator(). Otherwise returns @c a. - static type get(const T& t, - const Allocator& a = Allocator()) ASIO_NOEXCEPT - { - return detail::associated_allocator_impl::get(t, a); - } + static decltype(auto) get(const T& t, const Allocator& a) ASIO_NOEXCEPT; +#endif // defined(GENERATING_DOCUMENTATION) }; /// Helper function to obtain an object's associated allocator. @@ -93,7 +141,7 @@ struct associated_allocator * @returns associated_allocator::get(t) */ template -inline typename associated_allocator::type +ASIO_NODISCARD inline typename associated_allocator::type get_associated_allocator(const T& t) ASIO_NOEXCEPT { return associated_allocator::get(t); @@ -104,8 +152,11 @@ get_associated_allocator(const T& t) ASIO_NOEXCEPT * @returns associated_allocator::get(t, a) */ template -inline typename associated_allocator::type +ASIO_NODISCARD inline ASIO_AUTO_RETURN_TYPE_PREFIX2( + typename associated_allocator::type) get_associated_allocator(const T& t, const Allocator& a) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_allocator::get(t, a))) { return associated_allocator::get(t, a); } @@ -118,6 +169,63 @@ using associated_allocator_t #endif // defined(ASIO_HAS_ALIAS_TEMPLATES) +namespace detail { + +template +struct associated_allocator_forwarding_base +{ +}; + +template +struct associated_allocator_forwarding_base::asio_associated_allocator_is_unspecialised, + void + >::value + >::type> +{ + typedef void asio_associated_allocator_is_unspecialised; +}; + +} // namespace detail + +#if defined(ASIO_HAS_STD_REFERENCE_WRAPPER) \ + || defined(GENERATING_DOCUMENTATION) + +/// Specialisation of associated_allocator for @c std::reference_wrapper. +template +struct associated_allocator, Allocator> +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_allocator_forwarding_base +#endif // !defined(GENERATING_DOCUMENTATION) +{ + /// Forwards @c type to the associator specialisation for the unwrapped type + /// @c T. + typedef typename associated_allocator::type type; + + /// Forwards the request to get the allocator to the associator specialisation + /// for the unwrapped type @c T. + static type get(reference_wrapper t) ASIO_NOEXCEPT + { + return associated_allocator::get(t.get()); + } + + /// Forwards the request to get the allocator to the associator specialisation + /// for the unwrapped type @c T. + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + reference_wrapper t, const Allocator& a) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_allocator::get(t.get(), a))) + { + return associated_allocator::get(t.get(), a); + } +}; + +#endif // defined(ASIO_HAS_STD_REFERENCE_WRAPPER) + // || defined(GENERATING_DOCUMENTATION) + } // namespace asio #include "asio/detail/pop_options.hpp" diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_cancellation_slot.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_cancellation_slot.hpp new file mode 100644 index 000000000..65d82b646 --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_cancellation_slot.hpp @@ -0,0 +1,238 @@ +// +// associated_cancellation_slot.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_ASSOCIATED_CANCELLATION_SLOT_HPP +#define ASIO_ASSOCIATED_CANCELLATION_SLOT_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" +#include "asio/associator.hpp" +#include "asio/cancellation_signal.hpp" +#include "asio/detail/functional.hpp" +#include "asio/detail/type_traits.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { + +template +struct associated_cancellation_slot; + +namespace detail { + +template +struct has_cancellation_slot_type : false_type +{ +}; + +template +struct has_cancellation_slot_type::type> + : true_type +{ +}; + +template +struct associated_cancellation_slot_impl +{ + typedef void asio_associated_cancellation_slot_is_unspecialised; + + typedef S type; + + static type get(const T&) ASIO_NOEXCEPT + { + return type(); + } + + static const type& get(const T&, const S& s) ASIO_NOEXCEPT + { + return s; + } +}; + +template +struct associated_cancellation_slot_impl::type> +{ + typedef typename T::cancellation_slot_type type; + + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + const T& t) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX((t.get_cancellation_slot())) + { + return t.get_cancellation_slot(); + } + + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + const T& t, const S&) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX((t.get_cancellation_slot())) + { + return t.get_cancellation_slot(); + } +}; + +template +struct associated_cancellation_slot_impl::value + >::type, + typename void_type< + typename associator::type + >::type> : associator +{ +}; + +} // namespace detail + +/// Traits type used to obtain the cancellation_slot associated with an object. +/** + * A program may specialise this traits type if the @c T template parameter in + * the specialisation is a user-defined type. The template parameter @c + * CancellationSlot shall be a type meeting the CancellationSlot requirements. + * + * Specialisations shall meet the following requirements, where @c t is a const + * reference to an object of type @c T, and @c s is an object of type @c + * CancellationSlot. + * + * @li Provide a nested typedef @c type that identifies a type meeting the + * CancellationSlot requirements. + * + * @li Provide a noexcept static member function named @c get, callable as @c + * get(t) and with return type @c type or a (possibly const) reference to @c + * type. + * + * @li Provide a noexcept static member function named @c get, callable as @c + * get(t,s) and with return type @c type or a (possibly const) reference to @c + * type. + */ +template +struct associated_cancellation_slot +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_cancellation_slot_impl +#endif // !defined(GENERATING_DOCUMENTATION) +{ +#if defined(GENERATING_DOCUMENTATION) + /// If @c T has a nested type @c cancellation_slot_type, + /// T::cancellation_slot_type. Otherwise + /// @c CancellationSlot. + typedef see_below type; + + /// If @c T has a nested type @c cancellation_slot_type, returns + /// t.get_cancellation_slot(). Otherwise returns @c type(). + static decltype(auto) get(const T& t) ASIO_NOEXCEPT; + + /// If @c T has a nested type @c cancellation_slot_type, returns + /// t.get_cancellation_slot(). Otherwise returns @c s. + static decltype(auto) get(const T& t, + const CancellationSlot& s) ASIO_NOEXCEPT; +#endif // defined(GENERATING_DOCUMENTATION) +}; + +/// Helper function to obtain an object's associated cancellation_slot. +/** + * @returns associated_cancellation_slot::get(t) + */ +template +ASIO_NODISCARD inline typename associated_cancellation_slot::type +get_associated_cancellation_slot(const T& t) ASIO_NOEXCEPT +{ + return associated_cancellation_slot::get(t); +} + +/// Helper function to obtain an object's associated cancellation_slot. +/** + * @returns associated_cancellation_slot::get(t, st) + */ +template +ASIO_NODISCARD inline ASIO_AUTO_RETURN_TYPE_PREFIX2( + typename associated_cancellation_slot::type) +get_associated_cancellation_slot(const T& t, + const CancellationSlot& st) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_cancellation_slot::get(t, st))) +{ + return associated_cancellation_slot::get(t, st); +} + +#if defined(ASIO_HAS_ALIAS_TEMPLATES) + +template +using associated_cancellation_slot_t = + typename associated_cancellation_slot::type; + +#endif // defined(ASIO_HAS_ALIAS_TEMPLATES) + +namespace detail { + +template +struct associated_cancellation_slot_forwarding_base +{ +}; + +template +struct associated_cancellation_slot_forwarding_base::asio_associated_cancellation_slot_is_unspecialised, + void + >::value + >::type> +{ + typedef void asio_associated_cancellation_slot_is_unspecialised; +}; + +} // namespace detail + +#if defined(ASIO_HAS_STD_REFERENCE_WRAPPER) \ + || defined(GENERATING_DOCUMENTATION) + +/// Specialisation of associated_cancellation_slot for @c +/// std::reference_wrapper. +template +struct associated_cancellation_slot, CancellationSlot> +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_cancellation_slot_forwarding_base +#endif // !defined(GENERATING_DOCUMENTATION) +{ + /// Forwards @c type to the associator specialisation for the unwrapped type + /// @c T. + typedef typename associated_cancellation_slot::type type; + + /// Forwards the request to get the cancellation slot to the associator + /// specialisation for the unwrapped type @c T. + static type get(reference_wrapper t) ASIO_NOEXCEPT + { + return associated_cancellation_slot::get(t.get()); + } + + /// Forwards the request to get the cancellation slot to the associator + /// specialisation for the unwrapped type @c T. + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get(reference_wrapper t, + const CancellationSlot& s) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_cancellation_slot::get(t.get(), s))) + { + return associated_cancellation_slot::get(t.get(), s); + } +}; + +#endif // defined(ASIO_HAS_STD_REFERENCE_WRAPPER) + // || defined(GENERATING_DOCUMENTATION) + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#endif // ASIO_ASSOCIATED_CANCELLATION_SLOT_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_executor.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_executor.hpp index e1792466f..92279891d 100644 --- a/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_executor.hpp +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_executor.hpp @@ -2,7 +2,7 @@ // associated_executor.hpp // ~~~~~~~~~~~~~~~~~~~~~~~ // -// Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) @@ -16,6 +16,8 @@ #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include "asio/detail/config.hpp" +#include "asio/associator.hpp" +#include "asio/detail/functional.hpp" #include "asio/detail/type_traits.hpp" #include "asio/execution/executor.hpp" #include "asio/is_executor.hpp" @@ -24,16 +26,37 @@ #include "asio/detail/push_options.hpp" namespace asio { + +template +struct associated_executor; + namespace detail { -template +template +struct has_executor_type : false_type +{ +}; + +template +struct has_executor_type::type> + : true_type +{ +}; + +template struct associated_executor_impl { typedef void asio_associated_executor_is_unspecialised; typedef E type; - static type get(const T&, const E& e = E()) ASIO_NOEXCEPT + static type get(const T&) ASIO_NOEXCEPT + { + return type(); + } + + static const type& get(const T&, const E& e) ASIO_NOEXCEPT { return e; } @@ -45,12 +68,32 @@ struct associated_executor_impl +struct associated_executor_impl::value + >::type, + typename void_type< + typename associator::type + >::type> : associator +{ +}; + } // namespace detail /// Traits type used to obtain the executor associated with an object. @@ -67,10 +110,12 @@ struct associated_executor_impl struct associated_executor @@ -83,10 +128,13 @@ struct associated_executor /// Otherwise @c Executor. typedef see_below type; + /// If @c T has a nested type @c executor_type, returns + /// t.get_executor(). Otherwise returns @c type(). + static decltype(auto) get(const T& t) ASIO_NOEXCEPT; + /// If @c T has a nested type @c executor_type, returns /// t.get_executor(). Otherwise returns @c ex. - static type get(const T& t, - const Executor& ex = Executor()) ASIO_NOEXCEPT; + static decltype(auto) get(const T& t, const Executor& ex) ASIO_NOEXCEPT; #endif // defined(GENERATING_DOCUMENTATION) }; @@ -95,7 +143,7 @@ struct associated_executor * @returns associated_executor::get(t) */ template -inline typename associated_executor::type +ASIO_NODISCARD inline typename associated_executor::type get_associated_executor(const T& t) ASIO_NOEXCEPT { return associated_executor::get(t); @@ -106,11 +154,14 @@ get_associated_executor(const T& t) ASIO_NOEXCEPT * @returns associated_executor::get(t, ex) */ template -inline typename associated_executor::type +ASIO_NODISCARD inline ASIO_AUTO_RETURN_TYPE_PREFIX2( + typename associated_executor::type) get_associated_executor(const T& t, const Executor& ex, - typename enable_if< + typename constraint< is_executor::value || execution::is_executor::value - >::type* = 0) ASIO_NOEXCEPT + >::type = 0) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_executor::get(t, ex))) { return associated_executor::get(t, ex); } @@ -121,11 +172,11 @@ get_associated_executor(const T& t, const Executor& ex, * ExecutionContext::executor_type>::get(t, ctx.get_executor()) */ template -inline typename associated_executor::type +ASIO_NODISCARD inline typename associated_executor::type get_associated_executor(const T& t, ExecutionContext& ctx, - typename enable_if::value>::type* = 0) ASIO_NOEXCEPT + typename constraint::value>::type = 0) ASIO_NOEXCEPT { return associated_executor::get(t, ctx.get_executor()); @@ -159,6 +210,42 @@ struct associated_executor_forwarding_base +struct associated_executor, Executor> +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_executor_forwarding_base +#endif // !defined(GENERATING_DOCUMENTATION) +{ + /// Forwards @c type to the associator specialisation for the unwrapped type + /// @c T. + typedef typename associated_executor::type type; + + /// Forwards the request to get the executor to the associator specialisation + /// for the unwrapped type @c T. + static type get(reference_wrapper t) ASIO_NOEXCEPT + { + return associated_executor::get(t.get()); + } + + /// Forwards the request to get the executor to the associator specialisation + /// for the unwrapped type @c T. + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + reference_wrapper t, const Executor& ex) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_executor::get(t.get(), ex))) + { + return associated_executor::get(t.get(), ex); + } +}; + +#endif // defined(ASIO_HAS_STD_REFERENCE_WRAPPER) + // || defined(GENERATING_DOCUMENTATION) + } // namespace asio #include "asio/detail/pop_options.hpp" diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_immediate_executor.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_immediate_executor.hpp new file mode 100644 index 000000000..54bced17a --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/associated_immediate_executor.hpp @@ -0,0 +1,297 @@ +// +// associated_immediate_executor.hpp +// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_ASSOCIATED_IMMEDIATE_EXECUTOR_HPP +#define ASIO_ASSOCIATED_IMMEDIATE_EXECUTOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" +#include "asio/associator.hpp" +#include "asio/detail/functional.hpp" +#include "asio/detail/type_traits.hpp" +#include "asio/execution/blocking.hpp" +#include "asio/execution/executor.hpp" +#include "asio/execution_context.hpp" +#include "asio/is_executor.hpp" +#include "asio/require.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { + +template +struct associated_immediate_executor; + +namespace detail { + +template +struct has_immediate_executor_type : false_type +{ +}; + +template +struct has_immediate_executor_type::type> + : true_type +{ +}; + +template +struct default_immediate_executor +{ + typedef typename require_result::type type; + + static type get(const E& e) ASIO_NOEXCEPT + { + return asio::require(e, execution::blocking.never); + } +}; + +template +struct default_immediate_executor::value + >::type, + typename enable_if< + is_executor::value + >::type> +{ + class type : public E + { + public: + template + explicit type(const Executor1& e, + typename constraint< + conditional< + !is_same::value, + is_convertible, + false_type + >::type::value + >::type = 0) ASIO_NOEXCEPT + : E(e) + { + } + + type(const type& other) ASIO_NOEXCEPT + : E(static_cast(other)) + { + } + +#if defined(ASIO_HAS_MOVE) + type(type&& other) ASIO_NOEXCEPT + : E(ASIO_MOVE_CAST(E)(other)) + { + } +#endif // defined(ASIO_HAS_MOVE) + + template + void dispatch(ASIO_MOVE_ARG(Function) f, const Allocator& a) const + { + this->post(ASIO_MOVE_CAST(Function)(f), a); + } + + friend bool operator==(const type& a, const type& b) ASIO_NOEXCEPT + { + return static_cast(a) == static_cast(b); + } + + friend bool operator!=(const type& a, const type& b) ASIO_NOEXCEPT + { + return static_cast(a) != static_cast(b); + } + }; + + static type get(const E& e) ASIO_NOEXCEPT + { + return type(e); + } +}; + +template +struct associated_immediate_executor_impl +{ + typedef void asio_associated_immediate_executor_is_unspecialised; + + typedef typename default_immediate_executor::type type; + + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + const T&, const E& e) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX((default_immediate_executor::get(e))) + { + return default_immediate_executor::get(e); + } +}; + +template +struct associated_immediate_executor_impl::type> +{ + typedef typename T::immediate_executor_type type; + + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + const T& t, const E&) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX((t.get_immediate_executor())) + { + return t.get_immediate_executor(); + } +}; + +template +struct associated_immediate_executor_impl::value + >::type, + typename void_type< + typename associator::type + >::type> : associator +{ +}; + +} // namespace detail + +/// Traits type used to obtain the immediate executor associated with an object. +/** + * A program may specialise this traits type if the @c T template parameter in + * the specialisation is a user-defined type. The template parameter @c + * Executor shall be a type meeting the Executor requirements. + * + * Specialisations shall meet the following requirements, where @c t is a const + * reference to an object of type @c T, and @c e is an object of type @c + * Executor. + * + * @li Provide a nested typedef @c type that identifies a type meeting the + * Executor requirements. + * + * @li Provide a noexcept static member function named @c get, callable as @c + * get(t) and with return type @c type or a (possibly const) reference to @c + * type. + * + * @li Provide a noexcept static member function named @c get, callable as @c + * get(t,e) and with return type @c type or a (possibly const) reference to @c + * type. + */ +template +struct associated_immediate_executor +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_immediate_executor_impl +#endif // !defined(GENERATING_DOCUMENTATION) +{ +#if defined(GENERATING_DOCUMENTATION) + /// If @c T has a nested type @c immediate_executor_type, + // T::immediate_executor_type. Otherwise @c Executor. + typedef see_below type; + + /// If @c T has a nested type @c immediate_executor_type, returns + /// t.get_immediate_executor(). Otherwise returns + /// asio::require(ex, asio::execution::blocking.never). + static decltype(auto) get(const T& t, const Executor& ex) ASIO_NOEXCEPT; +#endif // defined(GENERATING_DOCUMENTATION) +}; + +/// Helper function to obtain an object's associated executor. +/** + * @returns associated_immediate_executor::get(t, ex) + */ +template +ASIO_NODISCARD inline ASIO_AUTO_RETURN_TYPE_PREFIX2( + typename associated_immediate_executor::type) +get_associated_immediate_executor(const T& t, const Executor& ex, + typename constraint< + is_executor::value || execution::is_executor::value + >::type = 0) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_immediate_executor::get(t, ex))) +{ + return associated_immediate_executor::get(t, ex); +} + +/// Helper function to obtain an object's associated executor. +/** + * @returns associated_immediate_executor::get(t, ctx.get_executor()) + */ +template +ASIO_NODISCARD inline typename associated_immediate_executor::type +get_associated_immediate_executor(const T& t, ExecutionContext& ctx, + typename constraint::value>::type = 0) ASIO_NOEXCEPT +{ + return associated_immediate_executor::get(t, ctx.get_executor()); +} + +#if defined(ASIO_HAS_ALIAS_TEMPLATES) + +template +using associated_immediate_executor_t = + typename associated_immediate_executor::type; + +#endif // defined(ASIO_HAS_ALIAS_TEMPLATES) + +namespace detail { + +template +struct associated_immediate_executor_forwarding_base +{ +}; + +template +struct associated_immediate_executor_forwarding_base::asio_associated_immediate_executor_is_unspecialised, + void + >::value + >::type> +{ + typedef void asio_associated_immediate_executor_is_unspecialised; +}; + +} // namespace detail + +#if defined(ASIO_HAS_STD_REFERENCE_WRAPPER) \ + || defined(GENERATING_DOCUMENTATION) + +/// Specialisation of associated_immediate_executor for +/// @c std::reference_wrapper. +template +struct associated_immediate_executor, Executor> +#if !defined(GENERATING_DOCUMENTATION) + : detail::associated_immediate_executor_forwarding_base +#endif // !defined(GENERATING_DOCUMENTATION) +{ + /// Forwards @c type to the associator specialisation for the unwrapped type + /// @c T. + typedef typename associated_immediate_executor::type type; + + /// Forwards the request to get the executor to the associator specialisation + /// for the unwrapped type @c T. + static ASIO_AUTO_RETURN_TYPE_PREFIX(type) get( + reference_wrapper t, const Executor& ex) ASIO_NOEXCEPT + ASIO_AUTO_RETURN_TYPE_SUFFIX(( + associated_immediate_executor::get(t.get(), ex))) + { + return associated_immediate_executor::get(t.get(), ex); + } +}; + +#endif // defined(ASIO_HAS_STD_REFERENCE_WRAPPER) + // || defined(GENERATING_DOCUMENTATION) + +} // namespace asio + +#include "asio/detail/pop_options.hpp" + +#endif // ASIO_ASSOCIATED_IMMEDIATE_EXECUTOR_HPP diff --git a/tidal-link/link/modules/asio-standalone/asio/include/asio/associator.hpp b/tidal-link/link/modules/asio-standalone/asio/include/asio/associator.hpp new file mode 100644 index 000000000..e954c4428 --- /dev/null +++ b/tidal-link/link/modules/asio-standalone/asio/include/asio/associator.hpp @@ -0,0 +1,35 @@ +// +// associator.hpp +// ~~~~~~~~~~~~~~ +// +// Copyright (c) 2003-2023 Christopher M. Kohlhoff (chris at kohlhoff dot com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// + +#ifndef ASIO_ASSOCIATOR_HPP +#define ASIO_ASSOCIATOR_HPP + +#if defined(_MSC_VER) && (_MSC_VER >= 1200) +# pragma once +#endif // defined(_MSC_VER) && (_MSC_VER >= 1200) + +#include "asio/detail/config.hpp" + +#include "asio/detail/push_options.hpp" + +namespace asio { + +/// Used to generically specialise associators for a type. +template