Merge "Update prebuilt Clang to r416183b1 (12.0.7)."
diff --git a/clang-r416183d/AndroidVersion.txt b/clang-r416183d/AndroidVersion.txt
deleted file mode 100644
index 5d070d2..0000000
--- a/clang-r416183d/AndroidVersion.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-12.0.7
-based on r416183d
diff --git a/clang-r416183d/MODULE_LICENSE_APACHE2 b/clang-r416183d/MODULE_LICENSE_APACHE2
deleted file mode 100644
index e69de29..0000000
--- a/clang-r416183d/MODULE_LICENSE_APACHE2
+++ /dev/null
diff --git a/clang-r416183d/MODULE_LICENSE_BSD_LIKE b/clang-r416183d/MODULE_LICENSE_BSD_LIKE
deleted file mode 100644
index e69de29..0000000
--- a/clang-r416183d/MODULE_LICENSE_BSD_LIKE
+++ /dev/null
diff --git a/clang-r416183d/MODULE_LICENSE_MIT b/clang-r416183d/MODULE_LICENSE_MIT
deleted file mode 100644
index e69de29..0000000
--- a/clang-r416183d/MODULE_LICENSE_MIT
+++ /dev/null
diff --git a/clang-r416183d/NOTICE b/clang-r416183d/NOTICE
deleted file mode 100644
index b051002..0000000
--- a/clang-r416183d/NOTICE
+++ /dev/null
@@ -1,2414 +0,0 @@
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2003-2019 University of Illinois at Urbana-Champaign.
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-
-The compiler_rt library is dual licensed under both the University of Illinois
-"BSD-Like" license and the MIT license. As a user of this code you may choose
-to use it under either license. As a contributor, you agree to allow your code
-to be used under both.
-
-Full text of the relevant licenses is included below.
-
-==============================================================================
-
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT
-
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-
-Copyright (c) 2009-2015 by the contributors listed in CREDITS.TXT
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-
-The libc++ library is dual licensed under both the University of Illinois
-"BSD-Like" license and the MIT license. As a user of this code you may choose
-to use it under either license. As a contributor, you agree to allow your code
-to be used under both.
-
-Full text of the relevant licenses is included below.
-
-==============================================================================
-
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT
-
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-
-Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-
-The libc++abi library is dual licensed under both the University of Illinois
-"BSD-Like" license and the MIT license. As a user of this code you may choose
-to use it under either license. As a contributor, you agree to allow your code
-to be used under both.
-
-Full text of the relevant licenses is included below.
-
-==============================================================================
-
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2009-2019 by the contributors listed in CREDITS.TXT
-
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-
-Copyright (c) 2009-2014 by the contributors listed in CREDITS.TXT
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-
-The software contained in this directory tree is dual licensed under both the
-University of Illinois "BSD-Like" license and the MIT license. As a user of
-this code you may choose to use it under either license. As a contributor,
-you agree to allow your code to be used under both. The full text of the
-relevant licenses is included below.
-
-In addition, a license agreement from the copyright/patent holders of the
-software contained in this directory tree is included below.
-
-==============================================================================
-
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 1997-2019 Intel Corporation
-
-All rights reserved.
-
-Developed by:
- OpenMP Runtime Team
- Intel Corporation
- http://www.openmprtl.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of Intel Corporation OpenMP Runtime Team nor the
- names of its contributors may be used to endorse or promote products
- derived from this Software without specific prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-
-Copyright (c) 1997-2019 Intel Corporation
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-==============================================================================
-
-Intel Corporation
-
-Software Grant License Agreement ("Agreement")
-
-Except for the license granted herein to you, Intel Corporation ("Intel") reserves
-all right, title, and interest in and to the Software (defined below).
-
-Definition
-
-"Software" means the code and documentation as well as any original work of
-authorship, including any modifications or additions to an existing work, that
-is intentionally submitted by Intel to llvm.org (http://llvm.org) ("LLVM") for
-inclusion in, or documentation of, any of the products owned or managed by LLVM
-(the "Work"). For the purposes of this definition, "submitted" means any form of
-electronic, verbal, or written communication sent to LLVM or its
-representatives, including but not limited to communication on electronic
-mailing lists, source code control systems, and issue tracking systems that are
-managed by, or on behalf of, LLVM for the purpose of discussing and improving
-the Work, but excluding communication that is conspicuously marked otherwise.
-
-1. Grant of Copyright License. Subject to the terms and conditions of this
- Agreement, Intel hereby grants to you and to recipients of the Software
- distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge,
- royalty-free, irrevocable copyright license to reproduce, prepare derivative
- works of, publicly display, publicly perform, sublicense, and distribute the
- Software and such derivative works.
-
-2. Grant of Patent License. Subject to the terms and conditions of this
- Agreement, Intel hereby grants you and to recipients of the Software
- distributed by LLVM a perpetual, worldwide, non-exclusive, no-charge,
- royalty-free, irrevocable (except as stated in this section) patent license
- to make, have made, use, offer to sell, sell, import, and otherwise transfer
- the Work, where such license applies only to those patent claims licensable
- by Intel that are necessarily infringed by Intel's Software alone or by
- combination of the Software with the Work to which such Software was
- submitted. If any entity institutes patent litigation against Intel or any
- other entity (including a cross-claim or counterclaim in a lawsuit) alleging
- that Intel's Software, or the Work to which Intel has contributed constitutes
- direct or contributory patent infringement, then any patent licenses granted
- to that entity under this Agreement for the Software or Work shall terminate
- as of the date such litigation is filed.
-
-Unless required by applicable law or agreed to in writing, the software is
-provided on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
-either express or implied, including, without limitation, any warranties or
-conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-PARTICULAR PURPOSE.
-
-==============================================================================
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign.
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2007-2019 University of Illinois at Urbana-Champaign.
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
-
-==============================================================================
-The LLVM Project is under the Apache License v2.0 with LLVM Exceptions:
-==============================================================================
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-
-
----- LLVM Exceptions to the Apache 2.0 License ----
-
-As an exception, if, as a result of your compiling your source code, portions
-of this Software are embedded into an Object form of such source code, you
-may redistribute such embedded portions in such Object form without complying
-with the conditions of Sections 4(a), 4(b) and 4(d) of the License.
-
-In addition, if you combine or link compiled forms of this Software with
-software that is licensed under the GPLv2 ("Combined Software") and if a
-court of competent jurisdiction determines that the patent provision (Section
-3), the indemnity provision (Section 9) or other Section of the License
-conflicts with the conditions of the GPLv2, you may retroactively and
-prospectively choose to deem waived or otherwise exclude such Section(s) of
-the License, but only in their entirety and only with respect to the Combined
-Software.
-
-==============================================================================
-Software from third parties included in the LLVM Project:
-==============================================================================
-The LLVM Project contains third party software which is under different license
-terms. All such code will be identified clearly using at least one of two
-mechanisms:
-1) It will be in a separate directory tree with its own `LICENSE.txt` or
- `LICENSE` file at the top containing the specific license and restrictions
- which apply to that software, or
-2) It will contain specific license and restriction terms at the top of every
- file.
-
-==============================================================================
-Legacy LLVM License (https://llvm.org/docs/DeveloperPolicy.html#legacy):
-==============================================================================
-University of Illinois/NCSA
-Open Source License
-
-Copyright (c) 2011-2019 by the contributors listed in CREDITS.TXT
-All rights reserved.
-
-Developed by:
-
- LLVM Team
-
- University of Illinois at Urbana-Champaign
-
- http://llvm.org
-
-Permission is hereby granted, free of charge, to any person obtaining a copy of
-this software and associated documentation files (the "Software"), to deal with
-the Software without restriction, including without limitation the rights to
-use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
-of the Software, and to permit persons to whom the Software is furnished to do
-so, subject to the following conditions:
-
- * Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimers.
-
- * Redistributions in binary form must reproduce the above copyright notice,
- this list of conditions and the following disclaimers in the
- documentation and/or other materials provided with the distribution.
-
- * Neither the names of the LLVM Team, University of Illinois at
- Urbana-Champaign, nor the names of its contributors may be used to
- endorse or promote products derived from this Software without specific
- prior written permission.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
-FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
-SOFTWARE.
diff --git a/clang-r416183d/bin/clang b/clang-r416183d/bin/clang
deleted file mode 120000
index 057f242..0000000
--- a/clang-r416183d/bin/clang
+++ /dev/null
@@ -1 +0,0 @@
-clang-12
\ No newline at end of file
diff --git a/clang-r416183d/bin/clang++ b/clang-r416183d/bin/clang++
deleted file mode 120000
index 060d289..0000000
--- a/clang-r416183d/bin/clang++
+++ /dev/null
@@ -1 +0,0 @@
-clang
\ No newline at end of file
diff --git a/clang-r416183d/bin/clang-12 b/clang-r416183d/bin/clang-12
deleted file mode 100755
index e2f69de..0000000
--- a/clang-r416183d/bin/clang-12
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/clang-check b/clang-r416183d/bin/clang-check
deleted file mode 100755
index f7c22a7..0000000
--- a/clang-r416183d/bin/clang-check
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/clang-cl b/clang-r416183d/bin/clang-cl
deleted file mode 120000
index 060d289..0000000
--- a/clang-r416183d/bin/clang-cl
+++ /dev/null
@@ -1 +0,0 @@
-clang
\ No newline at end of file
diff --git a/clang-r416183d/bin/clang-format b/clang-r416183d/bin/clang-format
deleted file mode 100755
index ad41052..0000000
--- a/clang-r416183d/bin/clang-format
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/clang-tidy b/clang-r416183d/bin/clang-tidy
deleted file mode 100755
index aa7e703..0000000
--- a/clang-r416183d/bin/clang-tidy
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/clangd b/clang-r416183d/bin/clangd
deleted file mode 100755
index c6a2b0f..0000000
--- a/clang-r416183d/bin/clangd
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/dsymutil b/clang-r416183d/bin/dsymutil
deleted file mode 100755
index ebaf8ab..0000000
--- a/clang-r416183d/bin/dsymutil
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/git-clang-format b/clang-r416183d/bin/git-clang-format
deleted file mode 100755
index ccd2f50..0000000
--- a/clang-r416183d/bin/git-clang-format
+++ /dev/null
@@ -1,586 +0,0 @@
-#!/usr/bin/env python
-#
-#===- git-clang-format - ClangFormat Git Integration ---------*- python -*--===#
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-#===------------------------------------------------------------------------===#
-
-r"""
-clang-format git integration
-============================
-
-This file provides a clang-format integration for git. Put it somewhere in your
-path and ensure that it is executable. Then, "git clang-format" will invoke
-clang-format on the changes in current files or a specific commit.
-
-For further details, run:
-git clang-format -h
-
-Requires Python 2.7 or Python 3
-"""
-
-from __future__ import absolute_import, division, print_function
-import argparse
-import collections
-import contextlib
-import errno
-import os
-import re
-import subprocess
-import sys
-
-usage = 'git clang-format [OPTIONS] [<commit>] [<commit>] [--] [<file>...]'
-
-desc = '''
-If zero or one commits are given, run clang-format on all lines that differ
-between the working directory and <commit>, which defaults to HEAD. Changes are
-only applied to the working directory.
-
-If two commits are given (requires --diff), run clang-format on all lines in the
-second <commit> that differ from the first <commit>.
-
-The following git-config settings set the default of the corresponding option:
- clangFormat.binary
- clangFormat.commit
- clangFormat.extensions
- clangFormat.style
-'''
-
-# Name of the temporary index file in which save the output of clang-format.
-# This file is created within the .git directory.
-temp_index_basename = 'clang-format-index'
-
-
-Range = collections.namedtuple('Range', 'start, count')
-
-
-def main():
- config = load_git_config()
-
- # In order to keep '--' yet allow options after positionals, we need to
- # check for '--' ourselves. (Setting nargs='*' throws away the '--', while
- # nargs=argparse.REMAINDER disallows options after positionals.)
- argv = sys.argv[1:]
- try:
- idx = argv.index('--')
- except ValueError:
- dash_dash = []
- else:
- dash_dash = argv[idx:]
- argv = argv[:idx]
-
- default_extensions = ','.join([
- # From clang/lib/Frontend/FrontendOptions.cpp, all lower case
- 'c', 'h', # C
- 'm', # ObjC
- 'mm', # ObjC++
- 'cc', 'cp', 'cpp', 'c++', 'cxx', 'hh', 'hpp', 'hxx', # C++
- 'cu', 'cuh', # CUDA
- # Other languages that clang-format supports
- 'proto', 'protodevel', # Protocol Buffers
- 'java', # Java
- 'js', # JavaScript
- 'ts', # TypeScript
- 'cs', # C Sharp
- ])
-
- p = argparse.ArgumentParser(
- usage=usage, formatter_class=argparse.RawDescriptionHelpFormatter,
- description=desc)
- p.add_argument('--binary',
- default=config.get('clangformat.binary', 'clang-format'),
- help='path to clang-format'),
- p.add_argument('--commit',
- default=config.get('clangformat.commit', 'HEAD'),
- help='default commit to use if none is specified'),
- p.add_argument('--diff', action='store_true',
- help='print a diff instead of applying the changes')
- p.add_argument('--extensions',
- default=config.get('clangformat.extensions',
- default_extensions),
- help=('comma-separated list of file extensions to format, '
- 'excluding the period and case-insensitive')),
- p.add_argument('-f', '--force', action='store_true',
- help='allow changes to unstaged files')
- p.add_argument('-p', '--patch', action='store_true',
- help='select hunks interactively')
- p.add_argument('-q', '--quiet', action='count', default=0,
- help='print less information')
- p.add_argument('--style',
- default=config.get('clangformat.style', None),
- help='passed to clang-format'),
- p.add_argument('-v', '--verbose', action='count', default=0,
- help='print extra information')
- # We gather all the remaining positional arguments into 'args' since we need
- # to use some heuristics to determine whether or not <commit> was present.
- # However, to print pretty messages, we make use of metavar and help.
- p.add_argument('args', nargs='*', metavar='<commit>',
- help='revision from which to compute the diff')
- p.add_argument('ignored', nargs='*', metavar='<file>...',
- help='if specified, only consider differences in these files')
- opts = p.parse_args(argv)
-
- opts.verbose -= opts.quiet
- del opts.quiet
-
- commits, files = interpret_args(opts.args, dash_dash, opts.commit)
- if len(commits) > 1:
- if not opts.diff:
- die('--diff is required when two commits are given')
- else:
- if len(commits) > 2:
- die('at most two commits allowed; %d given' % len(commits))
- changed_lines = compute_diff_and_extract_lines(commits, files)
- if opts.verbose >= 1:
- ignored_files = set(changed_lines)
- filter_by_extension(changed_lines, opts.extensions.lower().split(','))
- if opts.verbose >= 1:
- ignored_files.difference_update(changed_lines)
- if ignored_files:
- print('Ignoring changes in the following files (wrong extension):')
- for filename in ignored_files:
- print(' %s' % filename)
- if changed_lines:
- print('Running clang-format on the following files:')
- for filename in changed_lines:
- print(' %s' % filename)
- if not changed_lines:
- if opts.verbose >= 0:
- print('no modified files to format')
- return
- # The computed diff outputs absolute paths, so we must cd before accessing
- # those files.
- cd_to_toplevel()
- if len(commits) > 1:
- old_tree = commits[1]
- new_tree = run_clang_format_and_save_to_tree(changed_lines,
- revision=commits[1],
- binary=opts.binary,
- style=opts.style)
- else:
- old_tree = create_tree_from_workdir(changed_lines)
- new_tree = run_clang_format_and_save_to_tree(changed_lines,
- binary=opts.binary,
- style=opts.style)
- if opts.verbose >= 1:
- print('old tree: %s' % old_tree)
- print('new tree: %s' % new_tree)
- if old_tree == new_tree:
- if opts.verbose >= 0:
- print('clang-format did not modify any files')
- elif opts.diff:
- print_diff(old_tree, new_tree)
- else:
- changed_files = apply_changes(old_tree, new_tree, force=opts.force,
- patch_mode=opts.patch)
- if (opts.verbose >= 0 and not opts.patch) or opts.verbose >= 1:
- print('changed files:')
- for filename in changed_files:
- print(' %s' % filename)
-
-
-def load_git_config(non_string_options=None):
- """Return the git configuration as a dictionary.
-
- All options are assumed to be strings unless in `non_string_options`, in which
- is a dictionary mapping option name (in lower case) to either "--bool" or
- "--int"."""
- if non_string_options is None:
- non_string_options = {}
- out = {}
- for entry in run('git', 'config', '--list', '--null').split('\0'):
- if entry:
- if '\n' in entry:
- name, value = entry.split('\n', 1)
- else:
- # A setting with no '=' ('\n' with --null) is implicitly 'true'
- name = entry
- value = 'true'
- if name in non_string_options:
- value = run('git', 'config', non_string_options[name], name)
- out[name] = value
- return out
-
-
-def interpret_args(args, dash_dash, default_commit):
- """Interpret `args` as "[commits] [--] [files]" and return (commits, files).
-
- It is assumed that "--" and everything that follows has been removed from
- args and placed in `dash_dash`.
-
- If "--" is present (i.e., `dash_dash` is non-empty), the arguments to its
- left (if present) are taken as commits. Otherwise, the arguments are checked
- from left to right if they are commits or files. If commits are not given,
- a list with `default_commit` is used."""
- if dash_dash:
- if len(args) == 0:
- commits = [default_commit]
- else:
- commits = args
- for commit in commits:
- object_type = get_object_type(commit)
- if object_type not in ('commit', 'tag'):
- if object_type is None:
- die("'%s' is not a commit" % commit)
- else:
- die("'%s' is a %s, but a commit was expected" % (commit, object_type))
- files = dash_dash[1:]
- elif args:
- commits = []
- while args:
- if not disambiguate_revision(args[0]):
- break
- commits.append(args.pop(0))
- if not commits:
- commits = [default_commit]
- files = args
- else:
- commits = [default_commit]
- files = []
- return commits, files
-
-
-def disambiguate_revision(value):
- """Returns True if `value` is a revision, False if it is a file, or dies."""
- # If `value` is ambiguous (neither a commit nor a file), the following
- # command will die with an appropriate error message.
- run('git', 'rev-parse', value, verbose=False)
- object_type = get_object_type(value)
- if object_type is None:
- return False
- if object_type in ('commit', 'tag'):
- return True
- die('`%s` is a %s, but a commit or filename was expected' %
- (value, object_type))
-
-
-def get_object_type(value):
- """Returns a string description of an object's type, or None if it is not
- a valid git object."""
- cmd = ['git', 'cat-file', '-t', value]
- p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- stdout, stderr = p.communicate()
- if p.returncode != 0:
- return None
- return convert_string(stdout.strip())
-
-
-def compute_diff_and_extract_lines(commits, files):
- """Calls compute_diff() followed by extract_lines()."""
- diff_process = compute_diff(commits, files)
- changed_lines = extract_lines(diff_process.stdout)
- diff_process.stdout.close()
- diff_process.wait()
- if diff_process.returncode != 0:
- # Assume error was already printed to stderr.
- sys.exit(2)
- return changed_lines
-
-
-def compute_diff(commits, files):
- """Return a subprocess object producing the diff from `commits`.
-
- The return value's `stdin` file object will produce a patch with the
- differences between the working directory and the first commit if a single
- one was specified, or the difference between both specified commits, filtered
- on `files` (if non-empty). Zero context lines are used in the patch."""
- git_tool = 'diff-index'
- if len(commits) > 1:
- git_tool = 'diff-tree'
- cmd = ['git', git_tool, '-p', '-U0'] + commits + ['--']
- cmd.extend(files)
- p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
- p.stdin.close()
- return p
-
-
-def extract_lines(patch_file):
- """Extract the changed lines in `patch_file`.
-
- The return value is a dictionary mapping filename to a list of (start_line,
- line_count) pairs.
-
- The input must have been produced with ``-U0``, meaning unidiff format with
- zero lines of context. The return value is a dict mapping filename to a
- list of line `Range`s."""
- matches = {}
- for line in patch_file:
- line = convert_string(line)
- match = re.search(r'^\+\+\+\ [^/]+/(.*)', line)
- if match:
- filename = match.group(1).rstrip('\r\n')
- match = re.search(r'^@@ -[0-9,]+ \+(\d+)(,(\d+))?', line)
- if match:
- start_line = int(match.group(1))
- line_count = 1
- if match.group(3):
- line_count = int(match.group(3))
- if line_count > 0:
- matches.setdefault(filename, []).append(Range(start_line, line_count))
- return matches
-
-
-def filter_by_extension(dictionary, allowed_extensions):
- """Delete every key in `dictionary` that doesn't have an allowed extension.
-
- `allowed_extensions` must be a collection of lowercase file extensions,
- excluding the period."""
- allowed_extensions = frozenset(allowed_extensions)
- for filename in list(dictionary.keys()):
- base_ext = filename.rsplit('.', 1)
- if len(base_ext) == 1 and '' in allowed_extensions:
- continue
- if len(base_ext) == 1 or base_ext[1].lower() not in allowed_extensions:
- del dictionary[filename]
-
-
-def cd_to_toplevel():
- """Change to the top level of the git repository."""
- toplevel = run('git', 'rev-parse', '--show-toplevel')
- os.chdir(toplevel)
-
-
-def create_tree_from_workdir(filenames):
- """Create a new git tree with the given files from the working directory.
-
- Returns the object ID (SHA-1) of the created tree."""
- return create_tree(filenames, '--stdin')
-
-
-def run_clang_format_and_save_to_tree(changed_lines, revision=None,
- binary='clang-format', style=None):
- """Run clang-format on each file and save the result to a git tree.
-
- Returns the object ID (SHA-1) of the created tree."""
- def iteritems(container):
- try:
- return container.iteritems() # Python 2
- except AttributeError:
- return container.items() # Python 3
- def index_info_generator():
- for filename, line_ranges in iteritems(changed_lines):
- if revision:
- git_metadata_cmd = ['git', 'ls-tree',
- '%s:%s' % (revision, os.path.dirname(filename)),
- os.path.basename(filename)]
- git_metadata = subprocess.Popen(git_metadata_cmd, stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
- stdout = git_metadata.communicate()[0]
- mode = oct(int(stdout.split()[0], 8))
- else:
- mode = oct(os.stat(filename).st_mode)
- # Adjust python3 octal format so that it matches what git expects
- if mode.startswith('0o'):
- mode = '0' + mode[2:]
- blob_id = clang_format_to_blob(filename, line_ranges,
- revision=revision,
- binary=binary,
- style=style)
- yield '%s %s\t%s' % (mode, blob_id, filename)
- return create_tree(index_info_generator(), '--index-info')
-
-
-def create_tree(input_lines, mode):
- """Create a tree object from the given input.
-
- If mode is '--stdin', it must be a list of filenames. If mode is
- '--index-info' is must be a list of values suitable for "git update-index
- --index-info", such as "<mode> <SP> <sha1> <TAB> <filename>". Any other mode
- is invalid."""
- assert mode in ('--stdin', '--index-info')
- cmd = ['git', 'update-index', '--add', '-z', mode]
- with temporary_index_file():
- p = subprocess.Popen(cmd, stdin=subprocess.PIPE)
- for line in input_lines:
- p.stdin.write(to_bytes('%s\0' % line))
- p.stdin.close()
- if p.wait() != 0:
- die('`%s` failed' % ' '.join(cmd))
- tree_id = run('git', 'write-tree')
- return tree_id
-
-
-def clang_format_to_blob(filename, line_ranges, revision=None,
- binary='clang-format', style=None):
- """Run clang-format on the given file and save the result to a git blob.
-
- Runs on the file in `revision` if not None, or on the file in the working
- directory if `revision` is None.
-
- Returns the object ID (SHA-1) of the created blob."""
- clang_format_cmd = [binary]
- if style:
- clang_format_cmd.extend(['-style='+style])
- clang_format_cmd.extend([
- '-lines=%s:%s' % (start_line, start_line+line_count-1)
- for start_line, line_count in line_ranges])
- if revision:
- clang_format_cmd.extend(['-assume-filename='+filename])
- git_show_cmd = ['git', 'cat-file', 'blob', '%s:%s' % (revision, filename)]
- git_show = subprocess.Popen(git_show_cmd, stdin=subprocess.PIPE,
- stdout=subprocess.PIPE)
- git_show.stdin.close()
- clang_format_stdin = git_show.stdout
- else:
- clang_format_cmd.extend([filename])
- git_show = None
- clang_format_stdin = subprocess.PIPE
- try:
- clang_format = subprocess.Popen(clang_format_cmd, stdin=clang_format_stdin,
- stdout=subprocess.PIPE)
- if clang_format_stdin == subprocess.PIPE:
- clang_format_stdin = clang_format.stdin
- except OSError as e:
- if e.errno == errno.ENOENT:
- die('cannot find executable "%s"' % binary)
- else:
- raise
- clang_format_stdin.close()
- hash_object_cmd = ['git', 'hash-object', '-w', '--path='+filename, '--stdin']
- hash_object = subprocess.Popen(hash_object_cmd, stdin=clang_format.stdout,
- stdout=subprocess.PIPE)
- clang_format.stdout.close()
- stdout = hash_object.communicate()[0]
- if hash_object.returncode != 0:
- die('`%s` failed' % ' '.join(hash_object_cmd))
- if clang_format.wait() != 0:
- die('`%s` failed' % ' '.join(clang_format_cmd))
- if git_show and git_show.wait() != 0:
- die('`%s` failed' % ' '.join(git_show_cmd))
- return convert_string(stdout).rstrip('\r\n')
-
-
-@contextlib.contextmanager
-def temporary_index_file(tree=None):
- """Context manager for setting GIT_INDEX_FILE to a temporary file and deleting
- the file afterward."""
- index_path = create_temporary_index(tree)
- old_index_path = os.environ.get('GIT_INDEX_FILE')
- os.environ['GIT_INDEX_FILE'] = index_path
- try:
- yield
- finally:
- if old_index_path is None:
- del os.environ['GIT_INDEX_FILE']
- else:
- os.environ['GIT_INDEX_FILE'] = old_index_path
- os.remove(index_path)
-
-
-def create_temporary_index(tree=None):
- """Create a temporary index file and return the created file's path.
-
- If `tree` is not None, use that as the tree to read in. Otherwise, an
- empty index is created."""
- gitdir = run('git', 'rev-parse', '--git-dir')
- path = os.path.join(gitdir, temp_index_basename)
- if tree is None:
- tree = '--empty'
- run('git', 'read-tree', '--index-output='+path, tree)
- return path
-
-
-def print_diff(old_tree, new_tree):
- """Print the diff between the two trees to stdout."""
- # We use the porcelain 'diff' and not plumbing 'diff-tree' because the output
- # is expected to be viewed by the user, and only the former does nice things
- # like color and pagination.
- #
- # We also only print modified files since `new_tree` only contains the files
- # that were modified, so unmodified files would show as deleted without the
- # filter.
- subprocess.check_call(['git', 'diff', '--diff-filter=M', old_tree, new_tree,
- '--'])
-
-
-def apply_changes(old_tree, new_tree, force=False, patch_mode=False):
- """Apply the changes in `new_tree` to the working directory.
-
- Bails if there are local changes in those files and not `force`. If
- `patch_mode`, runs `git checkout --patch` to select hunks interactively."""
- changed_files = run('git', 'diff-tree', '--diff-filter=M', '-r', '-z',
- '--name-only', old_tree,
- new_tree).rstrip('\0').split('\0')
- if not force:
- unstaged_files = run('git', 'diff-files', '--name-status', *changed_files)
- if unstaged_files:
- print('The following files would be modified but '
- 'have unstaged changes:', file=sys.stderr)
- print(unstaged_files, file=sys.stderr)
- print('Please commit, stage, or stash them first.', file=sys.stderr)
- sys.exit(2)
- if patch_mode:
- # In patch mode, we could just as well create an index from the new tree
- # and checkout from that, but then the user will be presented with a
- # message saying "Discard ... from worktree". Instead, we use the old
- # tree as the index and checkout from new_tree, which gives the slightly
- # better message, "Apply ... to index and worktree". This is not quite
- # right, since it won't be applied to the user's index, but oh well.
- with temporary_index_file(old_tree):
- subprocess.check_call(['git', 'checkout', '--patch', new_tree])
- index_tree = old_tree
- else:
- with temporary_index_file(new_tree):
- run('git', 'checkout-index', '-a', '-f')
- return changed_files
-
-
-def run(*args, **kwargs):
- stdin = kwargs.pop('stdin', '')
- verbose = kwargs.pop('verbose', True)
- strip = kwargs.pop('strip', True)
- for name in kwargs:
- raise TypeError("run() got an unexpected keyword argument '%s'" % name)
- p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
- stdin=subprocess.PIPE)
- stdout, stderr = p.communicate(input=stdin)
-
- stdout = convert_string(stdout)
- stderr = convert_string(stderr)
-
- if p.returncode == 0:
- if stderr:
- if verbose:
- print('`%s` printed to stderr:' % ' '.join(args), file=sys.stderr)
- print(stderr.rstrip(), file=sys.stderr)
- if strip:
- stdout = stdout.rstrip('\r\n')
- return stdout
- if verbose:
- print('`%s` returned %s' % (' '.join(args), p.returncode), file=sys.stderr)
- if stderr:
- print(stderr.rstrip(), file=sys.stderr)
- sys.exit(2)
-
-
-def die(message):
- print('error:', message, file=sys.stderr)
- sys.exit(2)
-
-
-def to_bytes(str_input):
- # Encode to UTF-8 to get binary data.
- if isinstance(str_input, bytes):
- return str_input
- return str_input.encode('utf-8')
-
-
-def to_string(bytes_input):
- if isinstance(bytes_input, str):
- return bytes_input
- return bytes_input.encode('utf-8')
-
-
-def convert_string(bytes_input):
- try:
- return to_string(bytes_input.decode('utf-8'))
- except AttributeError: # 'str' object has no attribute 'decode'.
- return str(bytes_input)
- except UnicodeError:
- return str(bytes_input)
-
-if __name__ == '__main__':
- main()
diff --git a/clang-r416183d/bin/ld.lld b/clang-r416183d/bin/ld.lld
deleted file mode 120000
index 02416ac..0000000
--- a/clang-r416183d/bin/ld.lld
+++ /dev/null
@@ -1 +0,0 @@
-lld
\ No newline at end of file
diff --git a/clang-r416183d/bin/ld64.lld b/clang-r416183d/bin/ld64.lld
deleted file mode 120000
index 02416ac..0000000
--- a/clang-r416183d/bin/ld64.lld
+++ /dev/null
@@ -1 +0,0 @@
-lld
\ No newline at end of file
diff --git a/clang-r416183d/bin/lld b/clang-r416183d/bin/lld
deleted file mode 100755
index 5d0db37..0000000
--- a/clang-r416183d/bin/lld
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/lld-link b/clang-r416183d/bin/lld-link
deleted file mode 120000
index 02416ac..0000000
--- a/clang-r416183d/bin/lld-link
+++ /dev/null
@@ -1 +0,0 @@
-lld
\ No newline at end of file
diff --git a/clang-r416183d/bin/lldb b/clang-r416183d/bin/lldb
deleted file mode 100755
index b367942..0000000
--- a/clang-r416183d/bin/lldb
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/lldb-argdumper b/clang-r416183d/bin/lldb-argdumper
deleted file mode 100755
index 0e8dae8..0000000
--- a/clang-r416183d/bin/lldb-argdumper
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/lldb.sh b/clang-r416183d/bin/lldb.sh
deleted file mode 100755
index 47ea64d..0000000
--- a/clang-r416183d/bin/lldb.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-CURDIR=$(cd $(dirname $0) && pwd)
-export PYTHONHOME="$CURDIR/../python3"
-export DYLD_LIBRARY_PATH="$CURDIR/../python3/lib:$DYLD_LIBRARY_PATH"
-"$CURDIR/lldb" "$@"
diff --git a/clang-r416183d/bin/llvm-addr2line b/clang-r416183d/bin/llvm-addr2line
deleted file mode 120000
index 51f8041..0000000
--- a/clang-r416183d/bin/llvm-addr2line
+++ /dev/null
@@ -1 +0,0 @@
-llvm-symbolizer
\ No newline at end of file
diff --git a/clang-r416183d/bin/llvm-ar b/clang-r416183d/bin/llvm-ar
deleted file mode 100755
index caf6d7d..0000000
--- a/clang-r416183d/bin/llvm-ar
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-as b/clang-r416183d/bin/llvm-as
deleted file mode 100755
index d40f4dc..0000000
--- a/clang-r416183d/bin/llvm-as
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-cfi-verify b/clang-r416183d/bin/llvm-cfi-verify
deleted file mode 100755
index 348f6eb..0000000
--- a/clang-r416183d/bin/llvm-cfi-verify
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-config b/clang-r416183d/bin/llvm-config
deleted file mode 100755
index 42ff0af..0000000
--- a/clang-r416183d/bin/llvm-config
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-cov b/clang-r416183d/bin/llvm-cov
deleted file mode 100755
index aedeab3..0000000
--- a/clang-r416183d/bin/llvm-cov
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-cxxfilt b/clang-r416183d/bin/llvm-cxxfilt
deleted file mode 100755
index 6c8266d..0000000
--- a/clang-r416183d/bin/llvm-cxxfilt
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-dis b/clang-r416183d/bin/llvm-dis
deleted file mode 100755
index 59d55ee..0000000
--- a/clang-r416183d/bin/llvm-dis
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-dwarfdump b/clang-r416183d/bin/llvm-dwarfdump
deleted file mode 100755
index 1e86768..0000000
--- a/clang-r416183d/bin/llvm-dwarfdump
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-dwp b/clang-r416183d/bin/llvm-dwp
deleted file mode 100755
index 52e882d..0000000
--- a/clang-r416183d/bin/llvm-dwp
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-lib b/clang-r416183d/bin/llvm-lib
deleted file mode 120000
index 3b94d1a..0000000
--- a/clang-r416183d/bin/llvm-lib
+++ /dev/null
@@ -1 +0,0 @@
-llvm-ar
\ No newline at end of file
diff --git a/clang-r416183d/bin/llvm-link b/clang-r416183d/bin/llvm-link
deleted file mode 100755
index 14d9015..0000000
--- a/clang-r416183d/bin/llvm-link
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-lipo b/clang-r416183d/bin/llvm-lipo
deleted file mode 100755
index a0b44e3..0000000
--- a/clang-r416183d/bin/llvm-lipo
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-modextract b/clang-r416183d/bin/llvm-modextract
deleted file mode 100755
index c98a596..0000000
--- a/clang-r416183d/bin/llvm-modextract
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-nm b/clang-r416183d/bin/llvm-nm
deleted file mode 100755
index 0ba719e..0000000
--- a/clang-r416183d/bin/llvm-nm
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-objcopy b/clang-r416183d/bin/llvm-objcopy
deleted file mode 100755
index 8594027..0000000
--- a/clang-r416183d/bin/llvm-objcopy
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-objdump b/clang-r416183d/bin/llvm-objdump
deleted file mode 100755
index 46602f9..0000000
--- a/clang-r416183d/bin/llvm-objdump
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-profdata b/clang-r416183d/bin/llvm-profdata
deleted file mode 100755
index 57fa0d9..0000000
--- a/clang-r416183d/bin/llvm-profdata
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-ranlib b/clang-r416183d/bin/llvm-ranlib
deleted file mode 120000
index 3b94d1a..0000000
--- a/clang-r416183d/bin/llvm-ranlib
+++ /dev/null
@@ -1 +0,0 @@
-llvm-ar
\ No newline at end of file
diff --git a/clang-r416183d/bin/llvm-rc b/clang-r416183d/bin/llvm-rc
deleted file mode 100755
index f9378f5..0000000
--- a/clang-r416183d/bin/llvm-rc
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-readelf b/clang-r416183d/bin/llvm-readelf
deleted file mode 120000
index a39a921..0000000
--- a/clang-r416183d/bin/llvm-readelf
+++ /dev/null
@@ -1 +0,0 @@
-llvm-readobj
\ No newline at end of file
diff --git a/clang-r416183d/bin/llvm-readobj b/clang-r416183d/bin/llvm-readobj
deleted file mode 100755
index 46e20c7..0000000
--- a/clang-r416183d/bin/llvm-readobj
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-size b/clang-r416183d/bin/llvm-size
deleted file mode 100755
index 43d333a..0000000
--- a/clang-r416183d/bin/llvm-size
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-strings b/clang-r416183d/bin/llvm-strings
deleted file mode 100755
index b62fd41..0000000
--- a/clang-r416183d/bin/llvm-strings
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/llvm-strip b/clang-r416183d/bin/llvm-strip
deleted file mode 120000
index caea5a7..0000000
--- a/clang-r416183d/bin/llvm-strip
+++ /dev/null
@@ -1 +0,0 @@
-llvm-objcopy
\ No newline at end of file
diff --git a/clang-r416183d/bin/llvm-symbolizer b/clang-r416183d/bin/llvm-symbolizer
deleted file mode 100755
index 14b7bab..0000000
--- a/clang-r416183d/bin/llvm-symbolizer
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/sancov b/clang-r416183d/bin/sancov
deleted file mode 100755
index 943191c..0000000
--- a/clang-r416183d/bin/sancov
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/sanstats b/clang-r416183d/bin/sanstats
deleted file mode 100755
index 01cfc28..0000000
--- a/clang-r416183d/bin/sanstats
+++ /dev/null
Binary files differ
diff --git a/clang-r416183d/bin/scan-build b/clang-r416183d/bin/scan-build
deleted file mode 100755
index 645f550..0000000
--- a/clang-r416183d/bin/scan-build
+++ /dev/null
@@ -1,2010 +0,0 @@
-#!/usr/bin/env perl
-#
-# Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-# See https://llvm.org/LICENSE.txt for license information.
-# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-#
-##===----------------------------------------------------------------------===##
-#
-# A script designed to wrap a build so that all calls to gcc are intercepted
-# and piped to the static analyzer.
-#
-##===----------------------------------------------------------------------===##
-
-use strict;
-use warnings;
-use FindBin qw($RealBin);
-use Digest::MD5;
-use File::Basename;
-use File::Find;
-use File::Copy qw(copy);
-use File::Path qw( rmtree mkpath );
-use Term::ANSIColor;
-use Term::ANSIColor qw(:constants);
-use Cwd qw/ getcwd abs_path /;
-use Sys::Hostname;
-use Hash::Util qw(lock_keys);
-
-my $Prog = "scan-build";
-my $BuildName;
-my $BuildDate;
-
-my $TERM = $ENV{'TERM'};
-my $UseColor = (defined $TERM and $TERM =~ 'xterm-.*color' and -t STDOUT
- and defined $ENV{'SCAN_BUILD_COLOR'});
-
-# Portability: getpwuid is not implemented for Win32 (see Perl language
-# reference, perlport), use getlogin instead.
-my $UserName = HtmlEscape(getlogin() || getpwuid($<) || 'unknown');
-my $HostName = HtmlEscape(hostname() || 'unknown');
-my $CurrentDir = HtmlEscape(getcwd());
-
-my $CmdArgs;
-
-my $Date = localtime();
-
-# Command-line/config arguments.
-my %Options = (
- Verbose => 0, # Verbose output from this script.
- AnalyzeHeaders => 0,
- OutputDir => undef, # Parent directory to store HTML files.
- HtmlTitle => basename($CurrentDir)." - scan-build results",
- IgnoreErrors => 0, # Ignore build errors.
- KeepCC => 0, # Do not override CC and CXX make variables
- ViewResults => 0, # View results when the build terminates.
- ExitStatusFoundBugs => 0, # Exit status reflects whether bugs were found
- ShowDescription => 0, # Display the description of the defect in the list
- KeepEmpty => 0, # Don't remove output directory even with 0 results.
- EnableCheckers => {},
- DisableCheckers => {},
- SilenceCheckers => {},
- Excludes => [],
- UseCC => undef, # C compiler to use for compilation.
- UseCXX => undef, # C++ compiler to use for compilation.
- AnalyzerTarget => undef,
- StoreModel => undef,
- ConstraintsModel => undef,
- InternalStats => undef,
- OutputFormat => "html",
- ConfigOptions => [], # Options to pass through to the analyzer's -analyzer-config flag.
- ReportFailures => undef,
- AnalyzerStats => 0,
- MaxLoop => 0,
- PluginsToLoad => [],
- AnalyzerDiscoveryMethod => undef,
- OverrideCompiler => 0, # The flag corresponding to the --override-compiler command line option.
- ForceAnalyzeDebugCode => 0,
- GenerateIndex => 0 # Skip the analysis, only generate index.html.
-);
-lock_keys(%Options);
-
-##----------------------------------------------------------------------------##
-# Diagnostics
-##----------------------------------------------------------------------------##
-
-sub Diag {
- if ($UseColor) {
- print BOLD, MAGENTA "$Prog: @_";
- print RESET;
- }
- else {
- print "$Prog: @_";
- }
-}
-
-sub ErrorDiag {
- if ($UseColor) {
- print STDERR BOLD, RED "$Prog: ";
- print STDERR RESET, RED @_;
- print STDERR RESET;
- } else {
- print STDERR "$Prog: @_";
- }
-}
-
-sub DiagCrashes {
- my $Dir = shift;
- Diag ("The analyzer encountered problems on some source files.\n");
- Diag ("Preprocessed versions of these sources were deposited in '$Dir/failures'.\n");
- Diag ("Please consider submitting a bug report using these files:\n");
- Diag (" http://clang-analyzer.llvm.org/filing_bugs.html\n")
-}
-
-sub DieDiag {
- if ($UseColor) {
- print STDERR BOLD, RED "$Prog: ";
- print STDERR RESET, RED @_;
- print STDERR RESET;
- }
- else {
- print STDERR "$Prog: ", @_;
- }
- exit 1;
-}
-
-##----------------------------------------------------------------------------##
-# Print default checker names
-##----------------------------------------------------------------------------##
-
-if (grep /^--help-checkers$/, @ARGV) {
- my @options = qx($0 -h);
- foreach (@options) {
- next unless /^ \+/;
- s/^\s*//;
- my ($sign, $name, @text) = split ' ', $_;
- print $name, $/ if $sign eq '+';
- }
- exit 0;
-}
-
-##----------------------------------------------------------------------------##
-# Declaration of Clang options. Populated later.
-##----------------------------------------------------------------------------##
-
-my $Clang;
-my $ClangSB;
-my $ClangCXX;
-my $ClangVersion;
-
-##----------------------------------------------------------------------------##
-# GetHTMLRunDir - Construct an HTML directory name for the current sub-run.
-##----------------------------------------------------------------------------##
-
-sub GetHTMLRunDir {
- die "Not enough arguments." if (@_ == 0);
- my $Dir = shift @_;
- my $TmpMode = 0;
- if (!defined $Dir) {
- $Dir = $ENV{'TMPDIR'} || $ENV{'TEMP'} || $ENV{'TMP'} || "/tmp";
- $TmpMode = 1;
- }
-
- # Chop off any trailing '/' characters.
- while ($Dir =~ /\/$/) { chop $Dir; }
-
- # Get current date and time.
- my @CurrentTime = localtime();
- my $year = $CurrentTime[5] + 1900;
- my $day = $CurrentTime[3];
- my $month = $CurrentTime[4] + 1;
- my $hour = $CurrentTime[2];
- my $min = $CurrentTime[1];
- my $sec = $CurrentTime[0];
-
- my $TimeString = sprintf("%02d%02d%02d", $hour, $min, $sec);
- my $DateString = sprintf("%d-%02d-%02d-%s-$$",
- $year, $month, $day, $TimeString);
-
- # Determine the run number.
- my $RunNumber;
-
- if (-d $Dir) {
- if (! -r $Dir) {
- DieDiag("directory '$Dir' exists but is not readable.\n");
- }
- # Iterate over all files in the specified directory.
- my $max = 0;
- opendir(DIR, $Dir);
- my @FILES = grep { -d "$Dir/$_" } readdir(DIR);
- closedir(DIR);
-
- foreach my $f (@FILES) {
- # Strip the prefix '$Prog-' if we are dumping files to /tmp.
- if ($TmpMode) {
- next if (!($f =~ /^$Prog-(.+)/));
- $f = $1;
- }
-
- my @x = split/-/, $f;
- next if (scalar(@x) != 4);
- next if ($x[0] != $year);
- next if ($x[1] != $month);
- next if ($x[2] != $day);
- next if ($x[3] != $TimeString);
- next if ($x[4] != $$);
-
- if ($x[5] > $max) {
- $max = $x[5];
- }
- }
-
- $RunNumber = $max + 1;
- }
- else {
-
- if (-x $Dir) {
- DieDiag("'$Dir' exists but is not a directory.\n");
- }
-
- if ($TmpMode) {
- DieDiag("The directory '/tmp' does not exist or cannot be accessed.\n");
- }
-
- # $Dir does not exist. It will be automatically created by the
- # clang driver. Set the run number to 1.
-
- $RunNumber = 1;
- }
-
- die "RunNumber must be defined!" if (!defined $RunNumber);
-
- # Append the run number.
- my $NewDir;
- if ($TmpMode) {
- $NewDir = "$Dir/$Prog-$DateString-$RunNumber";
- }
- else {
- $NewDir = "$Dir/$DateString-$RunNumber";
- }
-
- # Make sure that the directory does not exist in order to avoid hijack.
- if (-e $NewDir) {
- DieDiag("The directory '$NewDir' already exists.\n");
- }
-
- mkpath($NewDir);
- return $NewDir;
-}
-
-sub SetHtmlEnv {
-
- die "Wrong number of arguments." if (scalar(@_) != 2);
-
- my $Args = shift;
- my $Dir = shift;
-
- die "No build command." if (scalar(@$Args) == 0);
-
- my $Cmd = $$Args[0];
-
- if ($Cmd =~ /configure/ || $Cmd =~ /autogen/) {
- return;
- }
-
- if ($Options{Verbose}) {
- Diag("Emitting reports for this run to '$Dir'.\n");
- }
-
- $ENV{'CCC_ANALYZER_HTML'} = $Dir;
-}
-
-##----------------------------------------------------------------------------##
-# ComputeDigest - Compute a digest of the specified file.
-##----------------------------------------------------------------------------##
-
-sub ComputeDigest {
- my $FName = shift;
- DieDiag("Cannot read $FName to compute Digest.\n") if (! -r $FName);
-
- # Use Digest::MD5. We don't have to be cryptographically secure. We're
- # just looking for duplicate files that come from a non-malicious source.
- # We use Digest::MD5 because it is a standard Perl module that should
- # come bundled on most systems.
- open(FILE, $FName) or DieDiag("Cannot open $FName when computing Digest.\n");
- binmode FILE;
- my $Result = Digest::MD5->new->addfile(*FILE)->hexdigest;
- close(FILE);
-
- # Return the digest.
- return $Result;
-}
-
-##----------------------------------------------------------------------------##
-# UpdatePrefix - Compute the common prefix of files.
-##----------------------------------------------------------------------------##
-
-my $Prefix;
-
-sub UpdatePrefix {
- my $x = shift;
- my $y = basename($x);
- $x =~ s/\Q$y\E$//;
-
- if (!defined $Prefix) {
- $Prefix = $x;
- return;
- }
-
- chop $Prefix while (!($x =~ /^\Q$Prefix/));
-}
-
-sub GetPrefix {
- return $Prefix;
-}
-
-##----------------------------------------------------------------------------##
-# UpdateInFilePath - Update the path in the report file.
-##----------------------------------------------------------------------------##
-
-sub UpdateInFilePath {
- my $fname = shift;
- my $regex = shift;
- my $newtext = shift;
-
- open (RIN, $fname) or die "cannot open $fname";
- open (ROUT, ">", "$fname.tmp") or die "cannot open $fname.tmp";
-
- while (<RIN>) {
- s/$regex/$newtext/;
- print ROUT $_;
- }
-
- close (ROUT);
- close (RIN);
- rename("$fname.tmp", $fname)
-}
-
-##----------------------------------------------------------------------------##
-# AddStatLine - Decode and insert a statistics line into the database.
-##----------------------------------------------------------------------------##
-
-sub AddStatLine {
- my $Line = shift;
- my $Stats = shift;
- my $File = shift;
-
- print $Line . "\n";
-
- my $Regex = qr/(.*?)\ ->\ Total\ CFGBlocks:\ (\d+)\ \|\ Unreachable
- \ CFGBlocks:\ (\d+)\ \|\ Exhausted\ Block:\ (yes|no)\ \|\ Empty\ WorkList:
- \ (yes|no)/x;
-
- if ($Line !~ $Regex) {
- return;
- }
-
- # Create a hash of the interesting fields
- my $Row = {
- Filename => $File,
- Function => $1,
- Total => $2,
- Unreachable => $3,
- Aborted => $4,
- Empty => $5
- };
-
- # Add them to the stats array
- push @$Stats, $Row;
-}
-
-##----------------------------------------------------------------------------##
-# ScanFile - Scan a report file for various identifying attributes.
-##----------------------------------------------------------------------------##
-
-# Sometimes a source file is scanned more than once, and thus produces
-# multiple error reports. We use a cache to solve this problem.
-
-my %AlreadyScanned;
-
-sub ScanFile {
-
- my $Index = shift;
- my $Dir = shift;
- my $FName = shift;
- my $Stats = shift;
-
- # Compute a digest for the report file. Determine if we have already
- # scanned a file that looks just like it.
-
- my $digest = ComputeDigest("$Dir/$FName");
-
- if (defined $AlreadyScanned{$digest}) {
- # Redundant file. Remove it.
- unlink("$Dir/$FName");
- return;
- }
-
- $AlreadyScanned{$digest} = 1;
-
- # At this point the report file is not world readable. Make it happen.
- chmod(0644, "$Dir/$FName");
-
- # Scan the report file for tags.
- open(IN, "$Dir/$FName") or DieDiag("Cannot open '$Dir/$FName'\n");
-
- my $BugType = "";
- my $BugFile = "";
- my $BugFunction = "";
- my $BugCategory = "";
- my $BugDescription = "";
- my $BugPathLength = 1;
- my $BugLine = 0;
-
- while (<IN>) {
- last if (/<!-- BUGMETAEND -->/);
-
- if (/<!-- BUGTYPE (.*) -->$/) {
- $BugType = $1;
- }
- elsif (/<!-- BUGFILE (.*) -->$/) {
- $BugFile = abs_path($1);
- if (!defined $BugFile) {
- # The file no longer exists: use the original path.
- $BugFile = $1;
- }
-
- # Get just the path
- my $p = dirname($BugFile);
- # Check if the path is found in the list of exclude
- if (grep { $p =~ m/$_/ } @{$Options{Excludes}}) {
- if ($Options{Verbose}) {
- Diag("File '$BugFile' deleted: part of an ignored directory.\n");
- }
-
- # File in an ignored directory. Remove it
- unlink("$Dir/$FName");
- return;
- }
-
- UpdatePrefix($BugFile);
- }
- elsif (/<!-- BUGPATHLENGTH (.*) -->$/) {
- $BugPathLength = $1;
- }
- elsif (/<!-- BUGLINE (.*) -->$/) {
- $BugLine = $1;
- }
- elsif (/<!-- BUGCATEGORY (.*) -->$/) {
- $BugCategory = $1;
- }
- elsif (/<!-- BUGDESC (.*) -->$/) {
- $BugDescription = $1;
- }
- elsif (/<!-- FUNCTIONNAME (.*) -->$/) {
- $BugFunction = $1;
- }
-
- }
-
-
- close(IN);
-
- if (!defined $BugCategory) {
- $BugCategory = "Other";
- }
-
- # Don't add internal statistics to the bug reports
- if ($BugCategory =~ /statistics/i) {
- AddStatLine($BugDescription, $Stats, $BugFile);
- return;
- }
-
- push @$Index,[ $FName, $BugCategory, $BugType, $BugFile, $BugFunction, $BugLine,
- $BugPathLength ];
-
- if ($Options{ShowDescription}) {
- push @{ $Index->[-1] }, $BugDescription
- }
-}
-
-##----------------------------------------------------------------------------##
-# CopyFiles - Copy resource files to target directory.
-##----------------------------------------------------------------------------##
-
-sub CopyFiles {
-
- my $Dir = shift;
-
- my $JS = Cwd::realpath("$RealBin/../share/scan-build/sorttable.js");
-
- DieDiag("Cannot find 'sorttable.js'.\n")
- if (! -r $JS);
-
- copy($JS, "$Dir");
-
- DieDiag("Could not copy 'sorttable.js' to '$Dir'.\n")
- if (! -r "$Dir/sorttable.js");
-
- my $CSS = Cwd::realpath("$RealBin/../share/scan-build/scanview.css");
-
- DieDiag("Cannot find 'scanview.css'.\n")
- if (! -r $CSS);
-
- copy($CSS, "$Dir");
-
- DieDiag("Could not copy 'scanview.css' to '$Dir'.\n")
- if (! -r $CSS);
-}
-
-##----------------------------------------------------------------------------##
-# CalcStats - Calculates visitation statistics and returns the string.
-##----------------------------------------------------------------------------##
-
-sub CalcStats {
- my $Stats = shift;
-
- my $TotalBlocks = 0;
- my $UnreachedBlocks = 0;
- my $TotalFunctions = scalar(@$Stats);
- my $BlockAborted = 0;
- my $WorkListAborted = 0;
- my $Aborted = 0;
-
- # Calculate the unique files
- my $FilesHash = {};
-
- foreach my $Row (@$Stats) {
- $FilesHash->{$Row->{Filename}} = 1;
- $TotalBlocks += $Row->{Total};
- $UnreachedBlocks += $Row->{Unreachable};
- $BlockAborted++ if $Row->{Aborted} eq 'yes';
- $WorkListAborted++ if $Row->{Empty} eq 'no';
- $Aborted++ if $Row->{Aborted} eq 'yes' || $Row->{Empty} eq 'no';
- }
-
- my $TotalFiles = scalar(keys(%$FilesHash));
-
- # Calculations
- my $PercentAborted = sprintf("%.2f", $Aborted / $TotalFunctions * 100);
- my $PercentBlockAborted = sprintf("%.2f", $BlockAborted / $TotalFunctions
- * 100);
- my $PercentWorkListAborted = sprintf("%.2f", $WorkListAborted /
- $TotalFunctions * 100);
- my $PercentBlocksUnreached = sprintf("%.2f", $UnreachedBlocks / $TotalBlocks
- * 100);
-
- my $StatsString = "Analyzed $TotalBlocks blocks in $TotalFunctions functions"
- . " in $TotalFiles files\n"
- . "$Aborted functions aborted early ($PercentAborted%)\n"
- . "$BlockAborted had aborted blocks ($PercentBlockAborted%)\n"
- . "$WorkListAborted had unfinished worklists ($PercentWorkListAborted%)\n"
- . "$UnreachedBlocks blocks were never reached ($PercentBlocksUnreached%)\n";
-
- return $StatsString;
-}
-
-##----------------------------------------------------------------------------##
-# Postprocess - Postprocess the results of an analysis scan.
-##----------------------------------------------------------------------------##
-
-my @filesFound;
-my $baseDir;
-sub FileWanted {
- my $baseDirRegEx = quotemeta $baseDir;
- my $file = $File::Find::name;
-
- # The name of the file is generated by clang binary (HTMLDiagnostics.cpp)
- if ($file =~ /report-.*\.html$/) {
- my $relative_file = $file;
- $relative_file =~ s/$baseDirRegEx//g;
- push @filesFound, $relative_file;
- }
-}
-
-sub Postprocess {
-
- my $Dir = shift;
- my $BaseDir = shift;
- my $AnalyzerStats = shift;
- my $KeepEmpty = shift;
-
- die "No directory specified." if (!defined $Dir);
-
- if (! -d $Dir) {
- Diag("No bugs found.\n");
- return 0;
- }
-
- $baseDir = $Dir . "/";
- find({ wanted => \&FileWanted, follow => 0}, $Dir);
-
- if (scalar(@filesFound) == 0 and ! -e "$Dir/failures") {
- if (! $KeepEmpty) {
- Diag("Removing directory '$Dir' because it contains no reports.\n");
- rmtree($Dir) or die "Cannot rmtree '$Dir' : $!";
- }
- Diag("No bugs found.\n");
- return 0;
- }
-
- # Scan each report file, in alphabetical order, and build an index.
- my @Index;
- my @Stats;
-
- @filesFound = sort @filesFound;
- foreach my $file (@filesFound) { ScanFile(\@Index, $Dir, $file, \@Stats); }
-
- # Scan the failures directory and use the information in the .info files
- # to update the common prefix directory.
- my @failures;
- my @attributes_ignored;
- if (-d "$Dir/failures") {
- opendir(DIR, "$Dir/failures");
- @failures = grep { /[.]info.txt$/ && !/attribute_ignored/; } readdir(DIR);
- closedir(DIR);
- opendir(DIR, "$Dir/failures");
- @attributes_ignored = grep { /^attribute_ignored/; } readdir(DIR);
- closedir(DIR);
- foreach my $file (@failures) {
- open IN, "$Dir/failures/$file" or DieDiag("cannot open $file\n");
- my $Path = <IN>;
- if (defined $Path) { UpdatePrefix($Path); }
- close IN;
- }
- }
-
- # Generate an index.html file.
- my $FName = "$Dir/index.html";
- open(OUT, ">", $FName) or DieDiag("Cannot create file '$FName'\n");
-
- # Print out the header.
-
-print OUT <<ENDTEXT;
-<html>
-<head>
-<title>${Options{HtmlTitle}}</title>
-<link type="text/css" rel="stylesheet" href="scanview.css"/>
-<script src="sorttable.js"></script>
-<script language='javascript' type="text/javascript">
-function SetDisplay(RowClass, DisplayVal)
-{
- var Rows = document.getElementsByTagName("tr");
- for ( var i = 0 ; i < Rows.length; ++i ) {
- if (Rows[i].className == RowClass) {
- Rows[i].style.display = DisplayVal;
- }
- }
-}
-
-function CopyCheckedStateToCheckButtons(SummaryCheckButton) {
- var Inputs = document.getElementsByTagName("input");
- for ( var i = 0 ; i < Inputs.length; ++i ) {
- if (Inputs[i].type == "checkbox") {
- if(Inputs[i] != SummaryCheckButton) {
- Inputs[i].checked = SummaryCheckButton.checked;
- Inputs[i].onclick();
- }
- }
- }
-}
-
-function returnObjById( id ) {
- if (document.getElementById)
- var returnVar = document.getElementById(id);
- else if (document.all)
- var returnVar = document.all[id];
- else if (document.layers)
- var returnVar = document.layers[id];
- return returnVar;
-}
-
-var NumUnchecked = 0;
-
-function ToggleDisplay(CheckButton, ClassName) {
- if (CheckButton.checked) {
- SetDisplay(ClassName, "");
- if (--NumUnchecked == 0) {
- returnObjById("AllBugsCheck").checked = true;
- }
- }
- else {
- SetDisplay(ClassName, "none");
- NumUnchecked++;
- returnObjById("AllBugsCheck").checked = false;
- }
-}
-</script>
-<!-- SUMMARYENDHEAD -->
-</head>
-<body>
-<h1>${Options{HtmlTitle}}</h1>
-
-<table>
-<tr><th>User:</th><td>${UserName}\@${HostName}</td></tr>
-<tr><th>Working Directory:</th><td>${CurrentDir}</td></tr>
-<tr><th>Command Line:</th><td>${CmdArgs}</td></tr>
-<tr><th>Clang Version:</th><td>${ClangVersion}</td></tr>
-<tr><th>Date:</th><td>${Date}</td></tr>
-ENDTEXT
-
-print OUT "<tr><th>Version:</th><td>${BuildName} (${BuildDate})</td></tr>\n"
- if (defined($BuildName) && defined($BuildDate));
-
-print OUT <<ENDTEXT;
-</table>
-ENDTEXT
-
- if (scalar(@filesFound)) {
- # Print out the summary table.
- my %Totals;
-
- for my $row ( @Index ) {
- my $bug_type = ($row->[2]);
- my $bug_category = ($row->[1]);
- my $key = "$bug_category:$bug_type";
-
- if (!defined $Totals{$key}) { $Totals{$key} = [1,$bug_category,$bug_type]; }
- else { $Totals{$key}->[0]++; }
- }
-
- print OUT "<h2>Bug Summary</h2>";
-
- if (defined $BuildName) {
- print OUT "\n<p>Results in this analysis run are based on analyzer build <b>$BuildName</b>.</p>\n"
- }
-
- my $TotalBugs = scalar(@Index);
-print OUT <<ENDTEXT;
-<table>
-<thead><tr><td>Bug Type</td><td>Quantity</td><td class="sorttable_nosort">Display?</td></tr></thead>
-<tr style="font-weight:bold"><td class="SUMM_DESC">All Bugs</td><td class="Q">$TotalBugs</td><td><center><input type="checkbox" id="AllBugsCheck" onClick="CopyCheckedStateToCheckButtons(this);" checked/></center></td></tr>
-ENDTEXT
-
- my $last_category;
-
- for my $key (
- sort {
- my $x = $Totals{$a};
- my $y = $Totals{$b};
- my $res = $x->[1] cmp $y->[1];
- $res = $x->[2] cmp $y->[2] if ($res == 0);
- $res
- } keys %Totals )
- {
- my $val = $Totals{$key};
- my $category = $val->[1];
- if (!defined $last_category or $last_category ne $category) {
- $last_category = $category;
- print OUT "<tr><th>$category</th><th colspan=2></th></tr>\n";
- }
- my $x = lc $key;
- $x =~ s/[ ,'":\/()]+/_/g;
- print OUT "<tr><td class=\"SUMM_DESC\">";
- print OUT $val->[2];
- print OUT "</td><td class=\"Q\">";
- print OUT $val->[0];
- print OUT "</td><td><center><input type=\"checkbox\" onClick=\"ToggleDisplay(this,'bt_$x');\" checked/></center></td></tr>\n";
- }
-
- # Print out the table of errors.
-
-print OUT <<ENDTEXT;
-</table>
-<h2>Reports</h2>
-
-<table class="sortable" style="table-layout:automatic">
-<thead><tr>
- <td>Bug Group</td>
- <td class="sorttable_sorted">Bug Type<span id="sorttable_sortfwdind"> ▾</span></td>
- <td>File</td>
- <td>Function/Method</td>
- <td class="Q">Line</td>
- <td class="Q">Path Length</td>
-ENDTEXT
-
-if ($Options{ShowDescription}) {
-print OUT <<ENDTEXT;
- <td class="Q">Description</td>
-ENDTEXT
-}
-
-print OUT <<ENDTEXT;
- <td class="sorttable_nosort"></td>
- <!-- REPORTBUGCOL -->
-</tr></thead>
-<tbody>
-ENDTEXT
-
- my $prefix = GetPrefix();
- my $regex;
- my $InFileRegex;
- my $InFilePrefix = "File:</td><td>";
-
- if (defined $prefix) {
- $regex = qr/^\Q$prefix\E/is;
- $InFileRegex = qr/\Q$InFilePrefix$prefix\E/is;
- }
-
- for my $row ( sort { $a->[2] cmp $b->[2] } @Index ) {
- my $x = "$row->[1]:$row->[2]";
- $x = lc $x;
- $x =~ s/[ ,'":\/()]+/_/g;
-
- my $ReportFile = $row->[0];
-
- print OUT "<tr class=\"bt_$x\">";
- print OUT "<td class=\"DESC\">";
- print OUT $row->[1]; # $BugCategory
- print OUT "</td>";
- print OUT "<td class=\"DESC\">";
- print OUT $row->[2]; # $BugType
- print OUT "</td>";
-
- # Update the file prefix.
- my $fname = $row->[3];
-
- if (defined $regex) {
- $fname =~ s/$regex//;
- UpdateInFilePath("$Dir/$ReportFile", $InFileRegex, $InFilePrefix)
- }
-
- print OUT "<td>";
- my @fname = split /\//,$fname;
- if ($#fname > 0) {
- while ($#fname >= 0) {
- my $x = shift @fname;
- print OUT $x;
- if ($#fname >= 0) {
- print OUT "/";
- }
- }
- }
- else {
- print OUT $fname;
- }
- print OUT "</td>";
-
- print OUT "<td class=\"DESC\">";
- print OUT $row->[4]; # Function
- print OUT "</td>";
-
- # Print out the quantities.
- for my $j ( 5 .. 6 ) { # Line & Path length
- print OUT "<td class=\"Q\">$row->[$j]</td>";
- }
-
- # Print the rest of the columns.
- for (my $j = 7; $j <= $#{$row}; ++$j) {
- print OUT "<td>$row->[$j]</td>"
- }
-
- # Emit the "View" link.
- print OUT "<td><a href=\"$ReportFile#EndPath\">View Report</a></td>";
-
- # Emit REPORTBUG markers.
- print OUT "\n<!-- REPORTBUG id=\"$ReportFile\" -->\n";
-
- # End the row.
- print OUT "</tr>\n";
- }
-
- print OUT "</tbody>\n</table>\n\n";
- }
-
- if (scalar (@failures) || scalar(@attributes_ignored)) {
- print OUT "<h2>Analyzer Failures</h2>\n";
-
- if (scalar @attributes_ignored) {
- print OUT "The analyzer's parser ignored the following attributes:<p>\n";
- print OUT "<table>\n";
- print OUT "<thead><tr><td>Attribute</td><td>Source File</td><td>Preprocessed File</td><td>STDERR Output</td></tr></thead>\n";
- foreach my $file (sort @attributes_ignored) {
- die "cannot demangle attribute name\n" if (! ($file =~ /^attribute_ignored_(.+).txt/));
- my $attribute = $1;
- # Open the attribute file to get the first file that failed.
- next if (!open (ATTR, "$Dir/failures/$file"));
- my $ppfile = <ATTR>;
- chomp $ppfile;
- close ATTR;
- next if (! -e "$Dir/failures/$ppfile");
- # Open the info file and get the name of the source file.
- open (INFO, "$Dir/failures/$ppfile.info.txt") or
- die "Cannot open $Dir/failures/$ppfile.info.txt\n";
- my $srcfile = <INFO>;
- chomp $srcfile;
- close (INFO);
- # Print the information in the table.
- my $prefix = GetPrefix();
- if (defined $prefix) { $srcfile =~ s/^\Q$prefix//; }
- print OUT "<tr><td>$attribute</td><td>$srcfile</td><td><a href=\"failures/$ppfile\">$ppfile</a></td><td><a href=\"failures/$ppfile.stderr.txt\">$ppfile.stderr.txt</a></td></tr>\n";
- my $ppfile_clang = $ppfile;
- $ppfile_clang =~ s/[.](.+)$/.clang.$1/;
- print OUT " <!-- REPORTPROBLEM src=\"$srcfile\" file=\"failures/$ppfile\" clangfile=\"failures/$ppfile_clang\" stderr=\"failures/$ppfile.stderr.txt\" info=\"failures/$ppfile.info.txt\" -->\n";
- }
- print OUT "</table>\n";
- }
-
- if (scalar @failures) {
- print OUT "<p>The analyzer had problems processing the following files:</p>\n";
- print OUT "<table>\n";
- print OUT "<thead><tr><td>Problem</td><td>Source File</td><td>Preprocessed File</td><td>STDERR Output</td></tr></thead>\n";
- foreach my $file (sort @failures) {
- $file =~ /(.+).info.txt$/;
- # Get the preprocessed file.
- my $ppfile = $1;
- # Open the info file and get the name of the source file.
- open (INFO, "$Dir/failures/$file") or
- die "Cannot open $Dir/failures/$file\n";
- my $srcfile = <INFO>;
- chomp $srcfile;
- my $problem = <INFO>;
- chomp $problem;
- close (INFO);
- # Print the information in the table.
- my $prefix = GetPrefix();
- if (defined $prefix) { $srcfile =~ s/^\Q$prefix//; }
- print OUT "<tr><td>$problem</td><td>$srcfile</td><td><a href=\"failures/$ppfile\">$ppfile</a></td><td><a href=\"failures/$ppfile.stderr.txt\">$ppfile.stderr.txt</a></td></tr>\n";
- my $ppfile_clang = $ppfile;
- $ppfile_clang =~ s/[.](.+)$/.clang.$1/;
- print OUT " <!-- REPORTPROBLEM src=\"$srcfile\" file=\"failures/$ppfile\" clangfile=\"failures/$ppfile_clang\" stderr=\"failures/$ppfile.stderr.txt\" info=\"failures/$ppfile.info.txt\" -->\n";
- }
- print OUT "</table>\n";
- }
- print OUT "<p>Please consider submitting preprocessed files as <a href=\"http://clang-analyzer.llvm.org/filing_bugs.html\">bug reports</a>. <!-- REPORTCRASHES --> </p>\n";
- }
-
- print OUT "</body></html>\n";
- close(OUT);
- CopyFiles($Dir);
-
- # Make sure $Dir and $BaseDir are world readable/executable.
- chmod(0755, $Dir);
- if (defined $BaseDir) { chmod(0755, $BaseDir); }
-
- # Print statistics
- print CalcStats(\@Stats) if $AnalyzerStats;
-
- my $Num = scalar(@Index);
- if ($Num == 1) {
- Diag("$Num bug found.\n");
- } else {
- Diag("$Num bugs found.\n");
- }
- if ($Num > 0 && -r "$Dir/index.html") {
- Diag("Run 'scan-view $Dir' to examine bug reports.\n");
- }
-
- DiagCrashes($Dir) if (scalar @failures || scalar @attributes_ignored);
-
- return $Num;
-}
-
-sub Finalize {
- my $BaseDir = shift;
- my $ExitStatus = shift;
-
- Diag "Analysis run complete.\n";
- if (defined $Options{OutputFormat}) {
- if ($Options{OutputFormat} =~ /plist/ ||
- $Options{OutputFormat} =~ /sarif/) {
- Diag "Analysis results (" .
- ($Options{OutputFormat} =~ /plist/ ? "plist" : "sarif") .
- " files) deposited in '$Options{OutputDir}'\n";
- }
- if ($Options{OutputFormat} =~ /html/) {
- # Postprocess the HTML directory.
- my $NumBugs = Postprocess($Options{OutputDir}, $BaseDir,
- $Options{AnalyzerStats}, $Options{KeepEmpty});
-
- if ($Options{ViewResults} and -r "$Options{OutputDir}/index.html") {
- Diag "Viewing analysis results in '$Options{OutputDir}' using scan-view.\n";
- my $ScanView = Cwd::realpath("$RealBin/scan-view");
- if (! -x $ScanView) { $ScanView = "scan-view"; }
- if (! -x $ScanView) { $ScanView = Cwd::realpath("$RealBin/../../scan-view/bin/scan-view"); }
- if (! -x $ScanView) { $ScanView = `which scan-view`; chomp $ScanView; }
- exec $ScanView, "$Options{OutputDir}";
- }
-
- if ($Options{ExitStatusFoundBugs}) {
- exit 1 if ($NumBugs > 0);
- exit $ExitStatus;
- }
- }
- }
-
- exit $ExitStatus;
-}
-
-##----------------------------------------------------------------------------##
-# RunBuildCommand - Run the build command.
-##----------------------------------------------------------------------------##
-
-sub AddIfNotPresent {
- my $Args = shift;
- my $Arg = shift;
- my $found = 0;
-
- foreach my $k (@$Args) {
- if ($k eq $Arg) {
- $found = 1;
- last;
- }
- }
-
- if ($found == 0) {
- push @$Args, $Arg;
- }
-}
-
-sub SetEnv {
- my $EnvVars = shift @_;
- foreach my $var ('CC', 'CXX', 'CLANG', 'CLANG_CXX',
- 'CCC_ANALYZER_ANALYSIS', 'CCC_ANALYZER_PLUGINS',
- 'CCC_ANALYZER_CONFIG') {
- die "$var is undefined\n" if (!defined $var);
- $ENV{$var} = $EnvVars->{$var};
- }
- foreach my $var ('CCC_ANALYZER_STORE_MODEL',
- 'CCC_ANALYZER_CONSTRAINTS_MODEL',
- 'CCC_ANALYZER_INTERNAL_STATS',
- 'CCC_ANALYZER_OUTPUT_FORMAT',
- 'CCC_CC',
- 'CCC_CXX',
- 'CCC_REPORT_FAILURES',
- 'CLANG_ANALYZER_TARGET',
- 'CCC_ANALYZER_FORCE_ANALYZE_DEBUG_CODE') {
- my $x = $EnvVars->{$var};
- if (defined $x) { $ENV{$var} = $x }
- }
- my $Verbose = $EnvVars->{'VERBOSE'};
- if ($Verbose >= 2) {
- $ENV{'CCC_ANALYZER_VERBOSE'} = 1;
- }
- if ($Verbose >= 3) {
- $ENV{'CCC_ANALYZER_LOG'} = 1;
- }
-}
-
-sub RunXcodebuild {
- my $Args = shift;
- my $IgnoreErrors = shift;
- my $CCAnalyzer = shift;
- my $CXXAnalyzer = shift;
- my $EnvVars = shift;
-
- if ($IgnoreErrors) {
- AddIfNotPresent($Args,"-PBXBuildsContinueAfterErrors=YES");
- }
-
- # Detect the version of Xcode. If Xcode 4.6 or higher, use new
- # in situ support for analyzer interposition without needed to override
- # the compiler.
- open(DETECT_XCODE, "-|", $Args->[0], "-version") or
- die "error: cannot detect version of xcodebuild\n";
-
- my $oldBehavior = 1;
-
- while(<DETECT_XCODE>) {
- if (/^Xcode (.+)$/) {
- my $ver = $1;
- if ($ver =~ /^([0-9]+[.][0-9]+)[^0-9]?/) {
- if ($1 >= 4.6) {
- $oldBehavior = 0;
- last;
- }
- }
- }
- }
- close(DETECT_XCODE);
-
- # If --override-compiler is explicitly requested, resort to the old
- # behavior regardless of Xcode version.
- if ($Options{OverrideCompiler}) {
- $oldBehavior = 1;
- }
-
- if ($oldBehavior == 0) {
- my $OutputDir = $EnvVars->{"OUTPUT_DIR"};
- my $CLANG = $EnvVars->{"CLANG"};
- my $OtherFlags = $EnvVars->{"CCC_ANALYZER_ANALYSIS"};
- push @$Args,
- "RUN_CLANG_STATIC_ANALYZER=YES",
- "CLANG_ANALYZER_OUTPUT=plist-html",
- "CLANG_ANALYZER_EXEC=$CLANG",
- "CLANG_ANALYZER_OUTPUT_DIR=$OutputDir",
- "CLANG_ANALYZER_OTHER_FLAGS=$OtherFlags";
-
- return (system(@$Args) >> 8);
- }
-
- # Default to old behavior where we insert a bogus compiler.
- SetEnv($EnvVars);
-
- # Check if using iPhone SDK 3.0 (simulator). If so the compiler being
- # used should be gcc-4.2.
- if (!defined $ENV{"CCC_CC"}) {
- for (my $i = 0 ; $i < scalar(@$Args); ++$i) {
- if ($Args->[$i] eq "-sdk" && $i + 1 < scalar(@$Args)) {
- if (@$Args[$i+1] =~ /^iphonesimulator3/) {
- $ENV{"CCC_CC"} = "gcc-4.2";
- $ENV{"CCC_CXX"} = "g++-4.2";
- }
- }
- }
- }
-
- # Disable PCH files until clang supports them.
- AddIfNotPresent($Args,"GCC_PRECOMPILE_PREFIX_HEADER=NO");
-
- # When 'CC' is set, xcodebuild uses it to do all linking, even if we are
- # linking C++ object files. Set 'LDPLUSPLUS' so that xcodebuild uses 'g++'
- # (via c++-analyzer) when linking such files.
- $ENV{"LDPLUSPLUS"} = $CXXAnalyzer;
-
- return (system(@$Args) >> 8);
-}
-
-sub RunBuildCommand {
- my $Args = shift;
- my $IgnoreErrors = shift;
- my $KeepCC = shift;
- my $Cmd = $Args->[0];
- my $CCAnalyzer = shift;
- my $CXXAnalyzer = shift;
- my $EnvVars = shift;
-
- if ($Cmd =~ /\bxcodebuild$/) {
- return RunXcodebuild($Args, $IgnoreErrors, $CCAnalyzer, $CXXAnalyzer, $EnvVars);
- }
-
- # Setup the environment.
- SetEnv($EnvVars);
-
- if ($Cmd =~ /(.*\/?gcc[^\/]*$)/ or
- $Cmd =~ /(.*\/?cc[^\/]*$)/ or
- $Cmd =~ /(.*\/?llvm-gcc[^\/]*$)/ or
- $Cmd =~ /(.*\/?clang[^\/]*$)/ or
- $Cmd =~ /(.*\/?ccc-analyzer[^\/]*$)/) {
-
- if (!($Cmd =~ /ccc-analyzer/) and !defined $ENV{"CCC_CC"}) {
- $ENV{"CCC_CC"} = $1;
- }
-
- shift @$Args;
- unshift @$Args, $CCAnalyzer;
- }
- elsif ($Cmd =~ /(.*\/?g\+\+[^\/]*$)/ or
- $Cmd =~ /(.*\/?c\+\+[^\/]*$)/ or
- $Cmd =~ /(.*\/?llvm-g\+\+[^\/]*$)/ or
- $Cmd =~ /(.*\/?clang\+\+$)/ or
- $Cmd =~ /(.*\/?c\+\+-analyzer[^\/]*$)/) {
- if (!($Cmd =~ /c\+\+-analyzer/) and !defined $ENV{"CCC_CXX"}) {
- $ENV{"CCC_CXX"} = $1;
- }
- shift @$Args;
- unshift @$Args, $CXXAnalyzer;
- }
- elsif ($Cmd eq "make" or $Cmd eq "gmake" or $Cmd eq "mingw32-make") {
- if (!$KeepCC) {
- AddIfNotPresent($Args, "CC=$CCAnalyzer");
- AddIfNotPresent($Args, "CXX=$CXXAnalyzer");
- }
- if ($IgnoreErrors) {
- AddIfNotPresent($Args,"-k");
- AddIfNotPresent($Args,"-i");
- }
- }
-
- return (system(@$Args) >> 8);
-}
-
-##----------------------------------------------------------------------------##
-# DisplayHelp - Utility function to display all help options.
-##----------------------------------------------------------------------------##
-
-sub DisplayHelp {
-
- my $ArgClangNotFoundErrMsg = shift;
-print <<ENDTEXT;
-USAGE: $Prog [options] <build command> [build options]
-
-ENDTEXT
-
- if (defined $BuildName) {
- print "ANALYZER BUILD: $BuildName ($BuildDate)\n\n";
- }
-
-print <<ENDTEXT;
-OPTIONS:
-
- -analyze-headers
-
- Also analyze functions in #included files. By default, such functions
- are skipped unless they are called by functions within the main source file.
-
- --force-analyze-debug-code
-
- Tells analyzer to enable assertions in code even if they were disabled
- during compilation to enable more precise results.
-
- -o <output location>
-
- Specifies the output directory for analyzer reports. Subdirectories will be
- created as needed to represent separate "runs" of the analyzer. If this
- option is not specified, a directory is created in /tmp (TMPDIR on Mac OS X)
- to store the reports.
-
- -h
- --help
-
- Display this message.
-
- -k
- --keep-going
-
- Add a "keep on going" option to the specified build command. This option
- currently supports make and xcodebuild. This is a convenience option; one
- can specify this behavior directly using build options.
-
- --keep-cc
-
- Do not override CC and CXX make variables. Useful when running make in
- autoconf-based (and similar) projects where configure can add extra flags
- to those variables.
-
- --html-title [title]
- --html-title=[title]
-
- Specify the title used on generated HTML pages. If not specified, a default
- title will be used.
-
- --show-description
-
- Display the description of defects in the list
-
- -sarif
-
- By default the output of scan-build is a set of HTML files. This option
- outputs the results in SARIF format.
-
- -plist
-
- By default the output of scan-build is a set of HTML files. This option
- outputs the results as a set of .plist files.
-
- -plist-html
-
- By default the output of scan-build is a set of HTML files. This option
- outputs the results as a set of HTML and .plist files.
-
- --status-bugs
-
- By default, the exit status of scan-build is the same as the executed build
- command. Specifying this option causes the exit status of scan-build to be 1
- if it found potential bugs and the exit status of the build itself otherwise.
-
- --exclude <path>
-
- Do not run static analyzer against files found in this
- directory (You can specify this option multiple times).
- Could be useful when project contains 3rd party libraries.
-
- --use-cc [compiler path]
- --use-cc=[compiler path]
-
- scan-build analyzes a project by interposing a "fake compiler", which
- executes a real compiler for compilation and the static analyzer for analysis.
- Because of the current implementation of interposition, scan-build does not
- know what compiler your project normally uses. Instead, it simply overrides
- the CC environment variable, and guesses your default compiler.
-
- In the future, this interposition mechanism to be improved, but if you need
- scan-build to use a specific compiler for *compilation* then you can use
- this option to specify a path to that compiler.
-
- If the given compiler is a cross compiler, you may also need to provide
- --analyzer-target option to properly analyze the source code because static
- analyzer runs as if the code is compiled for the host machine by default.
-
- --use-c++ [compiler path]
- --use-c++=[compiler path]
-
- This is the same as "--use-cc" but for C++ code.
-
- --analyzer-target [target triple name for analysis]
- --analyzer-target=[target triple name for analysis]
-
- This provides target triple information to clang static analyzer.
- It only changes the target for analysis but doesn't change the target of a
- real compiler given by --use-cc and --use-c++ options.
-
- -v
-
- Enable verbose output from scan-build. A second and third '-v' increases
- verbosity.
-
- -V
- --view
-
- View analysis results in a web browser when the build completes.
-
- --generate-index-only <output location>
-
- Do not perform the analysis, but only regenerate the index.html file
- from existing report.html files. Useful for making a custom Static Analyzer
- integration into a build system that isn't otherwise supported by scan-build.
-
-ADVANCED OPTIONS:
-
- -no-failure-reports
-
- Do not create a 'failures' subdirectory that includes analyzer crash reports
- and preprocessed source files.
-
- -stats
-
- Generates visitation statistics for the project being analyzed.
-
- -maxloop <loop count>
-
- Specify the number of times a block can be visited before giving up.
- Default is 4. Increase for more comprehensive coverage at a cost of speed.
-
- -internal-stats
-
- Generate internal analyzer statistics.
-
- --use-analyzer [Xcode|path to clang]
- --use-analyzer=[Xcode|path to clang]
-
- scan-build uses the 'clang' executable relative to itself for static
- analysis. One can override this behavior with this option by using the
- 'clang' packaged with Xcode (on OS X) or from the PATH.
-
- --keep-empty
-
- Don't remove the build results directory even if no issues were reported.
-
- --override-compiler
- Always resort to the ccc-analyzer even when better interposition methods
- are available.
-
- -analyzer-config <options>
-
- Provide options to pass through to the analyzer's -analyzer-config flag.
- Several options are separated with comma: 'key1=val1,key2=val2'
-
- Available options:
- * stable-report-filename=true or false (default)
- Switch the page naming to:
- report-<filename>-<function/method name>-<id>.html
- instead of report-XXXXXX.html
-
-CONTROLLING CHECKERS:
-
- A default group of checkers are always run unless explicitly disabled.
- Checkers may be enabled/disabled using the following options:
-
- -enable-checker [checker name]
- -disable-checker [checker name]
-
-LOADING CHECKERS:
-
- Loading external checkers using the clang plugin interface:
-
- -load-plugin [plugin library]
-ENDTEXT
-
- if (defined $Clang && -x $Clang) {
- # Query clang for list of checkers that are enabled.
-
- # create a list to load the plugins via the 'Xclang' command line
- # argument
- my @PluginLoadCommandline_xclang;
- foreach my $param ( @{$Options{PluginsToLoad}} ) {
- push ( @PluginLoadCommandline_xclang, "-Xclang" );
- push ( @PluginLoadCommandline_xclang, "-load" );
- push ( @PluginLoadCommandline_xclang, "-Xclang" );
- push ( @PluginLoadCommandline_xclang, $param );
- }
-
- my %EnabledCheckers;
- foreach my $lang ("c", "objective-c", "objective-c++", "c++") {
- my $ExecLine = join(' ', qq/"$Clang"/, @PluginLoadCommandline_xclang, "--analyze", "-x", $lang, "-", "-###", "2>&1", "|");
- open(PS, $ExecLine);
- while (<PS>) {
- foreach my $val (split /\s+/) {
- $val =~ s/\"//g;
- if ($val =~ /-analyzer-checker\=([^\s]+)/) {
- $EnabledCheckers{$1} = 1;
- }
- }
- }
- }
-
- # Query clang for complete list of checkers.
- my @PluginLoadCommandline;
- foreach my $param ( @{$Options{PluginsToLoad}} ) {
- push ( @PluginLoadCommandline, "-load" );
- push ( @PluginLoadCommandline, $param );
- }
-
- my $ExecLine = join(' ', qq/"$Clang"/, "-cc1", @PluginLoadCommandline, "-analyzer-checker-help", "2>&1", "|");
- open(PS, $ExecLine);
- my $foundCheckers = 0;
- while (<PS>) {
- if (/CHECKERS:/) {
- $foundCheckers = 1;
- last;
- }
- }
- if (!$foundCheckers) {
- print " *** Could not query Clang for the list of available checkers.";
- }
- else {
- print("\nAVAILABLE CHECKERS:\n\n");
- my $skip = 0;
- while(<PS>) {
- if (/experimental/) {
- $skip = 1;
- next;
- }
- if ($skip) {
- next if (!/^\s\s[^\s]/);
- $skip = 0;
- }
- s/^\s\s//;
- if (/^([^\s]+)/) {
- # Is the checker enabled?
- my $checker = $1;
- my $enabled = 0;
- my $aggregate = "";
- foreach my $domain (split /\./, $checker) {
- $aggregate .= $domain;
- if ($EnabledCheckers{$aggregate}) {
- $enabled =1;
- last;
- }
- # append a dot, if an additional domain is added in the next iteration
- $aggregate .= ".";
- }
-
- if ($enabled) {
- print " + ";
- }
- else {
- print " ";
- }
- }
- else {
- print " ";
- }
- print $_;
- }
- print "\nNOTE: \"+\" indicates that an analysis is enabled by default.\n";
- }
- close PS;
- }
- else {
- print " *** Could not query Clang for the list of available checkers.\n";
- if (defined $ArgClangNotFoundErrMsg) {
- print " *** Reason: $ArgClangNotFoundErrMsg\n";
- }
- }
-
-print <<ENDTEXT
-
-BUILD OPTIONS
-
- You can specify any build option acceptable to the build command.
-
-EXAMPLE
-
- scan-build -o /tmp/myhtmldir make -j4
-
-The above example causes analysis reports to be deposited into a subdirectory
-of "/tmp/myhtmldir" and to run "make" with the "-j4" option. A different
-subdirectory is created each time scan-build analyzes a project. The analyzer
-should support most parallel builds, but not distributed builds.
-
-ENDTEXT
-}
-
-##----------------------------------------------------------------------------##
-# HtmlEscape - HTML entity encode characters that are special in HTML
-##----------------------------------------------------------------------------##
-
-sub HtmlEscape {
- # copy argument to new variable so we don't clobber the original
- my $arg = shift || '';
- my $tmp = $arg;
- $tmp =~ s/&/&/g;
- $tmp =~ s/</</g;
- $tmp =~ s/>/>/g;
- return $tmp;
-}
-
-##----------------------------------------------------------------------------##
-# ShellEscape - backslash escape characters that are special to the shell
-##----------------------------------------------------------------------------##
-
-sub ShellEscape {
- # copy argument to new variable so we don't clobber the original
- my $arg = shift || '';
- if ($arg =~ /["\s]/) { return "'" . $arg . "'"; }
- return $arg;
-}
-
-##----------------------------------------------------------------------------##
-# FindXcrun - searches for the 'xcrun' executable. Returns "" if not found.
-##----------------------------------------------------------------------------##
-
-sub FindXcrun {
- my $xcrun = `which xcrun`;
- chomp $xcrun;
- return $xcrun;
-}
-
-##----------------------------------------------------------------------------##
-# FindClang - searches for 'clang' executable.
-##----------------------------------------------------------------------------##
-
-sub FindClang {
- if (!defined $Options{AnalyzerDiscoveryMethod}) {
- $Clang = Cwd::realpath("$RealBin/bin/clang") if (-f "$RealBin/bin/clang");
- if (!defined $Clang || ! -x $Clang) {
- $Clang = Cwd::realpath("$RealBin/clang") if (-f "$RealBin/clang");
- if (!defined $Clang || ! -x $Clang) {
- # When an Xcode toolchain is present, look for a clang in the sibling bin
- # of the parent of the bin directory. So if scan-build is at
- # $TOOLCHAIN/usr/local/bin/scan-build look for clang at
- # $TOOLCHAIN/usr/bin/clang.
- my $has_xcode_toolchain = FindXcrun() ne "";
- if ($has_xcode_toolchain && -f "$RealBin/../../bin/clang") {
- $Clang = Cwd::realpath("$RealBin/../../bin/clang");
- }
- }
- }
- if (!defined $Clang || ! -x $Clang) {
- return "error: Cannot find an executable 'clang' relative to" .
- " scan-build. Consider using --use-analyzer to pick a version of" .
- " 'clang' to use for static analysis.\n";
- }
- }
- else {
- if ($Options{AnalyzerDiscoveryMethod} =~ /^[Xx]code$/) {
- my $xcrun = FindXcrun();
- if ($xcrun eq "") {
- return "Cannot find 'xcrun' to find 'clang' for analysis.\n";
- }
- $Clang = `$xcrun -toolchain XcodeDefault -find clang`;
- chomp $Clang;
- if ($Clang eq "") {
- return "No 'clang' executable found by 'xcrun'\n";
- }
- }
- else {
- $Clang = $Options{AnalyzerDiscoveryMethod};
- if (!defined $Clang or not -x $Clang) {
- return "Cannot find an executable clang at '$Options{AnalyzerDiscoveryMethod}'\n";
- }
- }
- }
- return undef;
-}
-
-##----------------------------------------------------------------------------##
-# Process command-line arguments.
-##----------------------------------------------------------------------------##
-
-my $RequestDisplayHelp = 0;
-my $ForceDisplayHelp = 0;
-
-sub ProcessArgs {
- my $Args = shift;
- my $NumArgs = 0;
-
- while (@$Args) {
-
- $NumArgs++;
-
- # Scan for options we recognize.
-
- my $arg = $Args->[0];
-
- if ($arg eq "-h" or $arg eq "--help") {
- $RequestDisplayHelp = 1;
- shift @$Args;
- next;
- }
-
- if ($arg eq '-analyze-headers') {
- shift @$Args;
- $Options{AnalyzeHeaders} = 1;
- next;
- }
-
- if ($arg eq "-o") {
- if (defined($Options{OutputDir})) {
- DieDiag("Only one of '-o' or '--generate-index-only' can be specified.\n");
- }
-
- shift @$Args;
-
- if (!@$Args) {
- DieDiag("'-o' option requires a target directory name.\n");
- }
-
- # Construct an absolute path. Uses the current working directory
- # as a base if the original path was not absolute.
- my $OutDir = shift @$Args;
- mkpath($OutDir) unless (-e $OutDir); # abs_path wants existing dir
- $Options{OutputDir} = abs_path($OutDir);
-
- next;
- }
-
- if ($arg eq "--generate-index-only") {
- if (defined($Options{OutputDir})) {
- DieDiag("Only one of '-o' or '--generate-index-only' can be specified.\n");
- }
-
- shift @$Args;
-
- if (!@$Args) {
- DieDiag("'--generate-index-only' option requires a target directory name.\n");
- }
-
- # Construct an absolute path. Uses the current working directory
- # as a base if the original path was not absolute.
- my $OutDir = shift @$Args;
- mkpath($OutDir) unless (-e $OutDir); # abs_path wants existing dir
- $Options{OutputDir} = abs_path($OutDir);
- $Options{GenerateIndex} = 1;
-
- next;
- }
-
- if ($arg =~ /^--html-title(=(.+))?$/) {
- shift @$Args;
-
- if (!defined $2 || $2 eq '') {
- if (!@$Args) {
- DieDiag("'--html-title' option requires a string.\n");
- }
-
- $Options{HtmlTitle} = shift @$Args;
- } else {
- $Options{HtmlTitle} = $2;
- }
-
- next;
- }
-
- if ($arg eq "-k" or $arg eq "--keep-going") {
- shift @$Args;
- $Options{IgnoreErrors} = 1;
- next;
- }
-
- if ($arg eq "--keep-cc") {
- shift @$Args;
- $Options{KeepCC} = 1;
- next;
- }
-
- if ($arg =~ /^--use-cc(=(.+))?$/) {
- shift @$Args;
- my $cc;
-
- if (!defined $2 || $2 eq "") {
- if (!@$Args) {
- DieDiag("'--use-cc' option requires a compiler executable name.\n");
- }
- $cc = shift @$Args;
- }
- else {
- $cc = $2;
- }
-
- $Options{UseCC} = $cc;
- next;
- }
-
- if ($arg =~ /^--use-c\+\+(=(.+))?$/) {
- shift @$Args;
- my $cxx;
-
- if (!defined $2 || $2 eq "") {
- if (!@$Args) {
- DieDiag("'--use-c++' option requires a compiler executable name.\n");
- }
- $cxx = shift @$Args;
- }
- else {
- $cxx = $2;
- }
-
- $Options{UseCXX} = $cxx;
- next;
- }
-
- if ($arg =~ /^--analyzer-target(=(.+))?$/) {
- shift @ARGV;
- my $AnalyzerTarget;
-
- if (!defined $2 || $2 eq "") {
- if (!@ARGV) {
- DieDiag("'--analyzer-target' option requires a target triple name.\n");
- }
- $AnalyzerTarget = shift @ARGV;
- }
- else {
- $AnalyzerTarget = $2;
- }
-
- $Options{AnalyzerTarget} = $AnalyzerTarget;
- next;
- }
-
- if ($arg eq "-v") {
- shift @$Args;
- $Options{Verbose}++;
- next;
- }
-
- if ($arg eq "-V" or $arg eq "--view") {
- shift @$Args;
- $Options{ViewResults} = 1;
- next;
- }
-
- if ($arg eq "--status-bugs") {
- shift @$Args;
- $Options{ExitStatusFoundBugs} = 1;
- next;
- }
-
- if ($arg eq "--show-description") {
- shift @$Args;
- $Options{ShowDescription} = 1;
- next;
- }
-
- if ($arg eq "-store") {
- shift @$Args;
- $Options{StoreModel} = shift @$Args;
- next;
- }
-
- if ($arg eq "-constraints") {
- shift @$Args;
- $Options{ConstraintsModel} = shift @$Args;
- next;
- }
-
- if ($arg eq "-internal-stats") {
- shift @$Args;
- $Options{InternalStats} = 1;
- next;
- }
-
- if ($arg eq "-sarif") {
- shift @$Args;
- $Options{OutputFormat} = "sarif";
- next;
- }
-
- if ($arg eq "-plist") {
- shift @$Args;
- $Options{OutputFormat} = "plist";
- next;
- }
-
- if ($arg eq "-plist-html") {
- shift @$Args;
- $Options{OutputFormat} = "plist-html";
- next;
- }
-
- if ($arg eq "-analyzer-config") {
- shift @$Args;
- push @{$Options{ConfigOptions}}, shift @$Args;
- next;
- }
-
- if ($arg eq "-no-failure-reports") {
- shift @$Args;
- $Options{ReportFailures} = 0;
- next;
- }
-
- if ($arg eq "-stats") {
- shift @$Args;
- $Options{AnalyzerStats} = 1;
- next;
- }
-
- if ($arg eq "-maxloop") {
- shift @$Args;
- $Options{MaxLoop} = shift @$Args;
- next;
- }
-
- if ($arg eq "-enable-checker") {
- shift @$Args;
- my $Checker = shift @$Args;
- # Store $NumArgs to preserve the order the checkers were enabled.
- $Options{EnableCheckers}{$Checker} = $NumArgs;
- delete $Options{DisableCheckers}{$Checker};
- next;
- }
-
- if ($arg eq "-disable-checker") {
- shift @$Args;
- my $Checker = shift @$Args;
- # Store $NumArgs to preserve the order the checkers are disabled/silenced.
- # See whether it is a core checker to disable. That means we do not want
- # to emit a report from that checker so we have to silence it.
- if (index($Checker, "core") == 0) {
- $Options{SilenceCheckers}{$Checker} = $NumArgs;
- } else {
- $Options{DisableCheckers}{$Checker} = $NumArgs;
- delete $Options{EnableCheckers}{$Checker};
- }
- next;
- }
-
- if ($arg eq "--exclude") {
- shift @$Args;
- my $arg = shift @$Args;
- # Remove the trailing slash if any
- $arg =~ s|/$||;
- push @{$Options{Excludes}}, $arg;
- next;
- }
-
- if ($arg eq "-load-plugin") {
- shift @$Args;
- push @{$Options{PluginsToLoad}}, shift @$Args;
- next;
- }
-
- if ($arg eq "--use-analyzer") {
- shift @$Args;
- $Options{AnalyzerDiscoveryMethod} = shift @$Args;
- next;
- }
-
- if ($arg =~ /^--use-analyzer=(.+)$/) {
- shift @$Args;
- $Options{AnalyzerDiscoveryMethod} = $1;
- next;
- }
-
- if ($arg eq "--keep-empty") {
- shift @$Args;
- $Options{KeepEmpty} = 1;
- next;
- }
-
- if ($arg eq "--override-compiler") {
- shift @$Args;
- $Options{OverrideCompiler} = 1;
- next;
- }
-
- if ($arg eq "--force-analyze-debug-code") {
- shift @$Args;
- $Options{ForceAnalyzeDebugCode} = 1;
- next;
- }
-
- DieDiag("unrecognized option '$arg'\n") if ($arg =~ /^-/);
-
- $NumArgs--;
- last;
- }
- return $NumArgs;
-}
-
-if (!@ARGV) {
- $ForceDisplayHelp = 1
-}
-
-ProcessArgs(\@ARGV);
-# All arguments are now shifted from @ARGV. The rest is a build command, if any.
-
-my $ClangNotFoundErrMsg = FindClang();
-
-if ($ForceDisplayHelp || $RequestDisplayHelp) {
- DisplayHelp($ClangNotFoundErrMsg);
- exit $ForceDisplayHelp;
-}
-
-$CmdArgs = HtmlEscape(join(' ', map(ShellEscape($_), @ARGV)));
-
-if ($Options{GenerateIndex}) {
- $ClangVersion = "unknown";
- Finalize($Options{OutputDir}, 0);
-}
-
-# Make sure to use "" to handle paths with spaces.
-$ClangVersion = HtmlEscape(`"$Clang" --version`);
-
-if (!@ARGV and !$RequestDisplayHelp) {
- ErrorDiag("No build command specified.\n\n");
- $ForceDisplayHelp = 1;
-}
-
-# Determine the output directory for the HTML reports.
-my $BaseDir = $Options{OutputDir};
-$Options{OutputDir} = GetHTMLRunDir($Options{OutputDir});
-
-DieDiag($ClangNotFoundErrMsg) if (defined $ClangNotFoundErrMsg);
-
-$ClangCXX = $Clang;
-if ($Clang !~ /\+\+(\.exe)?$/) {
- # If $Clang holds the name of the clang++ executable then we leave
- # $ClangCXX and $Clang equal, otherwise construct the name of the clang++
- # executable from the clang executable name.
-
- # Determine operating system under which this copy of Perl was built.
- my $IsWinBuild = ($^O =~/msys|cygwin|MSWin32/);
- if($IsWinBuild) {
- $ClangCXX =~ s/.exe$/++.exe/;
- }
- else {
- $ClangCXX =~ s/\-\d+(\.\d+)?$//;
- $ClangCXX .= "++";
- }
-}
-
-# Determine the location of ccc-analyzer.
-my $AbsRealBin = Cwd::realpath($RealBin);
-my $Cmd = "$AbsRealBin/../libexec/ccc-analyzer";
-my $CmdCXX = "$AbsRealBin/../libexec/c++-analyzer";
-
-# Portability: use less strict but portable check -e (file exists) instead of
-# non-portable -x (file is executable). On some windows ports -x just checks
-# file extension to determine if a file is executable (see Perl language
-# reference, perlport)
-if (!defined $Cmd || ! -e $Cmd) {
- $Cmd = "$AbsRealBin/ccc-analyzer";
- DieDiag("'ccc-analyzer' does not exist at '$Cmd'\n") if(! -e $Cmd);
-}
-if (!defined $CmdCXX || ! -e $CmdCXX) {
- $CmdCXX = "$AbsRealBin/c++-analyzer";
- DieDiag("'c++-analyzer' does not exist at '$CmdCXX'\n") if(! -e $CmdCXX);
-}
-
-Diag("Using '$Clang' for static analysis\n");
-
-SetHtmlEnv(\@ARGV, $Options{OutputDir});
-
-my @AnalysesToRun;
-foreach (sort { $Options{EnableCheckers}{$a} <=> $Options{EnableCheckers}{$b} }
- keys %{$Options{EnableCheckers}}) {
- # Push checkers in order they were enabled.
- push @AnalysesToRun, "-analyzer-checker", $_;
-}
-foreach (sort { $Options{DisableCheckers}{$a} <=> $Options{DisableCheckers}{$b} }
- keys %{$Options{DisableCheckers}}) {
- # Push checkers in order they were disabled.
- push @AnalysesToRun, "-analyzer-disable-checker", $_;
-}
-if ($Options{AnalyzeHeaders}) { push @AnalysesToRun, "-analyzer-opt-analyze-headers"; }
-if ($Options{AnalyzerStats}) { push @AnalysesToRun, '-analyzer-checker=debug.Stats'; }
-if ($Options{MaxLoop} > 0) { push @AnalysesToRun, "-analyzer-max-loop $Options{MaxLoop}"; }
-
-# Delay setting up other environment variables in case we can do true
-# interposition.
-my $CCC_ANALYZER_ANALYSIS = join ' ', @AnalysesToRun;
-my $CCC_ANALYZER_PLUGINS = join ' ', map { "-load ".$_ } @{$Options{PluginsToLoad}};
-my $CCC_ANALYZER_CONFIG = join ' ', map { "-analyzer-config ".$_ } @{$Options{ConfigOptions}};
-
-if (%{$Options{SilenceCheckers}}) {
- $CCC_ANALYZER_CONFIG =
- $CCC_ANALYZER_CONFIG." -analyzer-config silence-checkers="
- .join(';', sort {
- $Options{SilenceCheckers}{$a} <=>
- $Options{SilenceCheckers}{$b}
- } keys %{$Options{SilenceCheckers}});
-}
-
-my %EnvVars = (
- 'CC' => $Cmd,
- 'CXX' => $CmdCXX,
- 'CLANG' => $Clang,
- 'CLANG_CXX' => $ClangCXX,
- 'VERBOSE' => $Options{Verbose},
- 'CCC_ANALYZER_ANALYSIS' => $CCC_ANALYZER_ANALYSIS,
- 'CCC_ANALYZER_PLUGINS' => $CCC_ANALYZER_PLUGINS,
- 'CCC_ANALYZER_CONFIG' => $CCC_ANALYZER_CONFIG,
- 'OUTPUT_DIR' => $Options{OutputDir},
- 'CCC_CC' => $Options{UseCC},
- 'CCC_CXX' => $Options{UseCXX},
- 'CCC_REPORT_FAILURES' => $Options{ReportFailures},
- 'CCC_ANALYZER_STORE_MODEL' => $Options{StoreModel},
- 'CCC_ANALYZER_CONSTRAINTS_MODEL' => $Options{ConstraintsModel},
- 'CCC_ANALYZER_INTERNAL_STATS' => $Options{InternalStats},
- 'CCC_ANALYZER_OUTPUT_FORMAT' => $Options{OutputFormat},
- 'CLANG_ANALYZER_TARGET' => $Options{AnalyzerTarget},
- 'CCC_ANALYZER_FORCE_ANALYZE_DEBUG_CODE' => $Options{ForceAnalyzeDebugCode}
-);
-
-# Run the build.
-my $ExitStatus = RunBuildCommand(\@ARGV, $Options{IgnoreErrors}, $Options{KeepCC},
- $Cmd, $CmdCXX, \%EnvVars);
-
-Finalize($BaseDir, $ExitStatus);
diff --git a/clang-r416183d/bin/scan-view b/clang-r416183d/bin/scan-view
deleted file mode 100755
index 6165432..0000000
--- a/clang-r416183d/bin/scan-view
+++ /dev/null
@@ -1,150 +0,0 @@
-#!/usr/bin/env python
-
-from __future__ import print_function
-
-"""The clang static analyzer results viewer.
-"""
-
-import sys
-import imp
-import os
-import posixpath
-import threading
-import time
-try:
- from urllib.request import urlopen
-except ImportError:
- from urllib2 import urlopen
-import webbrowser
-
-# How long to wait for server to start.
-kSleepTimeout = .05
-kMaxSleeps = int(60 / kSleepTimeout)
-
-# Default server parameters
-
-kDefaultHost = '127.0.0.1'
-kDefaultPort = 8181
-kMaxPortsToTry = 100
-
-###
-
-
-def url_is_up(url):
- try:
- o = urlopen(url)
- except IOError:
- return False
- o.close()
- return True
-
-
-def start_browser(port, options):
- import webbrowser
-
- url = 'http://%s:%d' % (options.host, port)
-
- # Wait for server to start...
- if options.debug:
- sys.stderr.write('%s: Waiting for server.' % sys.argv[0])
- sys.stderr.flush()
- for i in range(kMaxSleeps):
- if url_is_up(url):
- break
- if options.debug:
- sys.stderr.write('.')
- sys.stderr.flush()
- time.sleep(kSleepTimeout)
- else:
- print('WARNING: Unable to detect that server started.', file=sys.stderr)
-
- if options.debug:
- print('%s: Starting webbrowser...' % sys.argv[0], file=sys.stderr)
- webbrowser.open(url)
-
-
-def run(port, options, root):
- # Prefer to look relative to the installed binary
- share = os.path.dirname(__file__) + "/../share/scan-view"
- if not os.path.isdir(share):
- # Otherwise look relative to the source
- share = os.path.dirname(__file__) + "/../../scan-view/share"
- sys.path.append(share)
-
- import ScanView
- try:
- print('Starting scan-view at: http://%s:%d' % (options.host,
- port))
- print(' Use Ctrl-C to exit.')
- httpd = ScanView.create_server((options.host, port),
- options, root)
- httpd.serve_forever()
- except KeyboardInterrupt:
- pass
-
-
-def port_is_open(port):
- try:
- import socketserver
- except ImportError:
- import SocketServer as socketserver
- try:
- t = socketserver.TCPServer((kDefaultHost, port), None)
- except:
- return False
- t.server_close()
- return True
-
-
-def main():
- import argparse
- parser = argparse.ArgumentParser(description="The clang static analyzer "
- "results viewer.")
- parser.add_argument("root", metavar="<results directory>", type=str)
- parser.add_argument(
- '--host', dest="host", default=kDefaultHost, type=str,
- help="Host interface to listen on. (default=%s)" % kDefaultHost)
- parser.add_argument('--port', dest="port", default=None, type=int,
- help="Port to listen on. (default=%s)" % kDefaultPort)
- parser.add_argument("--debug", dest="debug", default=0,
- action="count",
- help="Print additional debugging information.")
- parser.add_argument("--auto-reload", dest="autoReload", default=False,
- action="store_true",
- help="Automatically update module for each request.")
- parser.add_argument("--no-browser", dest="startBrowser", default=True,
- action="store_false",
- help="Don't open a webbrowser on startup.")
- parser.add_argument("--allow-all-hosts", dest="onlyServeLocal",
- default=True, action="store_false",
- help='Allow connections from any host (access '
- 'restricted to "127.0.0.1" by default)')
- args = parser.parse_args()
-
- # Make sure this directory is in a reasonable state to view.
- if not posixpath.exists(posixpath.join(args.root, 'index.html')):
- parser.error('Invalid directory, analysis results not found!')
-
- # Find an open port. We aren't particularly worried about race
- # conditions here. Note that if the user specified a port we only
- # use that one.
- if args.port is not None:
- port = args.port
- else:
- for i in range(kMaxPortsToTry):
- if port_is_open(kDefaultPort + i):
- port = kDefaultPort + i
- break
- else:
- parser.error('Unable to find usable port in [%d,%d)' %
- (kDefaultPort, kDefaultPort+kMaxPortsToTry))
-
- # Kick off thread to wait for server and start web browser, if
- # requested.
- if args.startBrowser:
- threading.Thread(target=start_browser, args=(port, args)).start()
-
- run(port, args, args.root)
-
-if __name__ == '__main__':
- main()
diff --git a/clang-r416183d/include/c++/v1/__availability b/clang-r416183d/include/c++/v1/__availability
deleted file mode 100644
index db2267c..0000000
--- a/clang-r416183d/include/c++/v1/__availability
+++ /dev/null
@@ -1,206 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___AVAILABILITY
-#define _LIBCPP___AVAILABILITY
-
-#include <__config>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-# pragma GCC system_header
-#endif
-
-// Libc++ is shipped by various vendors. In particular, it is used as a system
-// library on macOS, iOS and other Apple platforms. In order for users to be
-// able to compile a binary that is intended to be deployed to an older version
-// of a platform, Clang provides availability attributes [1]. These attributes
-// can be placed on declarations and are used to describe the life cycle of a
-// symbol in the library.
-//
-// The main goal is to ensure a compile-time error if a symbol that hasn't been
-// introduced in a previously released library is used in a program that targets
-// that previously released library. Normally, this would be a load-time error
-// when one tries to launch the program against the older library.
-//
-// For example, the filesystem library was introduced in the dylib in macOS 10.15.
-// If a user compiles on a macOS 10.15 host but targets macOS 10.13 with their
-// program, the compiler would normally not complain (because the required
-// declarations are in the headers), but the dynamic loader would fail to find
-// the symbols when actually trying to launch the program on macOS 10.13. To
-// turn this into a compile-time issue instead, declarations are annotated with
-// when they were introduced, and the compiler can produce a diagnostic if the
-// program references something that isn't available on the deployment target.
-//
-// This mechanism is general in nature, and any vendor can add their markup to
-// the library (see below). Whenever a new feature is added that requires support
-// in the shared library, a macro should be added below to mark this feature
-// as unavailable. When vendors decide to ship the feature as part of their
-// shared library, they can update the markup appropriately.
-//
-// Note that this mechanism is disabled by default in the "upstream" libc++.
-// Availability annotations are only meaningful when shipping libc++ inside
-// a platform (i.e. as a system library), and so vendors that want them should
-// turn those annotations on at CMake configuration time.
-//
-// [1]: https://clang.llvm.org/docs/AttributeReference.html#availability
-
-
-// For backwards compatibility, allow users to define _LIBCPP_DISABLE_AVAILABILITY
-// for a while.
-#if defined(_LIBCPP_DISABLE_AVAILABILITY)
-# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
-# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS
-# endif
-#endif
-
-// Availability markup is disabled when building the library, or when the compiler
-// doesn't support the proper attributes.
-#if defined(_LIBCPP_BUILDING_LIBRARY) || \
- defined(_LIBCXXABI_BUILDING_LIBRARY) || \
- !__has_feature(attribute_availability_with_strict) || \
- !__has_feature(attribute_availability_in_templates) || \
- !__has_extension(pragma_clang_attribute_external_declaration)
-# if !defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
-# define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS
-# endif
-#endif
-
-#if defined(_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS)
-
- // This controls the availability of std::shared_mutex and std::shared_timed_mutex,
- // which were added to the dylib later.
-# define _LIBCPP_AVAILABILITY_SHARED_MUTEX
-
- // These macros control the availability of std::bad_optional_access and
- // other exception types. These were put in the shared library to prevent
- // code bloat from every user program defining the vtable for these exception
- // types.
-# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS
-# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST
-
- // This controls the availability of std::uncaught_exceptions().
-# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS
-
- // This controls the availability of the sized version of ::operator delete,
- // which was added to the dylib later.
-# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE
-
- // This controls the availability of the std::future_error exception.
-# define _LIBCPP_AVAILABILITY_FUTURE_ERROR
-
- // This controls the availability of std::type_info's vtable.
- // I can't imagine how using std::type_info can work at all if
- // this isn't supported.
-# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE
-
- // This controls the availability of std::locale::category members
- // (e.g. std::locale::collate), which are defined in the dylib.
-# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY
-
- // This controls the availability of atomic operations on std::shared_ptr
- // (e.g. `std::atomic_store(std::shared_ptr)`), which require a shared
- // lock table located in the dylib.
-# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR
-
- // These macros control the availability of all parts of <filesystem> that
- // depend on something in the dylib.
-# define _LIBCPP_AVAILABILITY_FILESYSTEM
-# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH
-# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP
-
- // This controls the availability of std::to_chars.
-# define _LIBCPP_AVAILABILITY_TO_CHARS
-
- // This controls the availability of the C++20 synchronization library,
- // which requires shared library support for various operations
- // (see libcxx/src/atomic.cpp).
-# define _LIBCPP_AVAILABILITY_SYNC
-
-#elif defined(__APPLE__)
-
-# define _LIBCPP_AVAILABILITY_SHARED_MUTEX \
- __attribute__((availability(macosx,strict,introduced=10.12))) \
- __attribute__((availability(ios,strict,introduced=10.0))) \
- __attribute__((availability(tvos,strict,introduced=10.0))) \
- __attribute__((availability(watchos,strict,introduced=3.0)))
-# define _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS \
- __attribute__((availability(macosx,strict,introduced=10.13))) \
- __attribute__((availability(ios,strict,introduced=11.0))) \
- __attribute__((availability(tvos,strict,introduced=11.0))) \
- __attribute__((availability(watchos,strict,introduced=4.0)))
-# define _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS \
- _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_BAD_ANY_CAST \
- _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_UNCAUGHT_EXCEPTIONS \
- __attribute__((availability(macosx,strict,introduced=10.12))) \
- __attribute__((availability(ios,strict,introduced=10.0))) \
- __attribute__((availability(tvos,strict,introduced=10.0))) \
- __attribute__((availability(watchos,strict,introduced=3.0)))
-# define _LIBCPP_AVAILABILITY_SIZED_NEW_DELETE \
- __attribute__((availability(macosx,strict,introduced=10.12))) \
- __attribute__((availability(ios,strict,introduced=10.0))) \
- __attribute__((availability(tvos,strict,introduced=10.0))) \
- __attribute__((availability(watchos,strict,introduced=3.0)))
-# define _LIBCPP_AVAILABILITY_FUTURE_ERROR \
- __attribute__((availability(ios,strict,introduced=6.0)))
-# define _LIBCPP_AVAILABILITY_TYPEINFO_VTABLE \
- __attribute__((availability(macosx,strict,introduced=10.9))) \
- __attribute__((availability(ios,strict,introduced=7.0)))
-# define _LIBCPP_AVAILABILITY_LOCALE_CATEGORY \
- __attribute__((availability(macosx,strict,introduced=10.9))) \
- __attribute__((availability(ios,strict,introduced=7.0)))
-# define _LIBCPP_AVAILABILITY_ATOMIC_SHARED_PTR \
- __attribute__((availability(macosx,strict,introduced=10.9))) \
- __attribute__((availability(ios,strict,introduced=7.0)))
-# define _LIBCPP_AVAILABILITY_FILESYSTEM \
- __attribute__((availability(macosx,strict,introduced=10.15))) \
- __attribute__((availability(ios,strict,introduced=13.0))) \
- __attribute__((availability(tvos,strict,introduced=13.0))) \
- __attribute__((availability(watchos,strict,introduced=6.0)))
-# define _LIBCPP_AVAILABILITY_FILESYSTEM_PUSH \
- _Pragma("clang attribute push(__attribute__((availability(macosx,strict,introduced=10.15))), apply_to=any(function,record))") \
- _Pragma("clang attribute push(__attribute__((availability(ios,strict,introduced=13.0))), apply_to=any(function,record))") \
- _Pragma("clang attribute push(__attribute__((availability(tvos,strict,introduced=13.0))), apply_to=any(function,record))") \
- _Pragma("clang attribute push(__attribute__((availability(watchos,strict,introduced=6.0))), apply_to=any(function,record))")
-# define _LIBCPP_AVAILABILITY_FILESYSTEM_POP \
- _Pragma("clang attribute pop") \
- _Pragma("clang attribute pop") \
- _Pragma("clang attribute pop") \
- _Pragma("clang attribute pop")
-# define _LIBCPP_AVAILABILITY_TO_CHARS \
- _LIBCPP_AVAILABILITY_FILESYSTEM
-# define _LIBCPP_AVAILABILITY_SYNC \
- __attribute__((unavailable))
-
-#else
-
-// ...New vendors can add availability markup here...
-
-# error "It looks like you're trying to enable vendor availability markup, but you haven't defined the corresponding macros yet!"
-
-#endif
-
-// Define availability attributes that depend on _LIBCPP_NO_EXCEPTIONS.
-// Those are defined in terms of the availability attributes above, and
-// should not be vendor-specific.
-#if defined(_LIBCPP_NO_EXCEPTIONS)
-# define _LIBCPP_AVAILABILITY_FUTURE
-# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST
-# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS
-#else
-# define _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_AVAILABILITY_FUTURE_ERROR
-# define _LIBCPP_AVAILABILITY_THROW_BAD_ANY_CAST _LIBCPP_AVAILABILITY_BAD_ANY_CAST
-# define _LIBCPP_AVAILABILITY_THROW_BAD_OPTIONAL_ACCESS _LIBCPP_AVAILABILITY_BAD_OPTIONAL_ACCESS
-# define _LIBCPP_AVAILABILITY_THROW_BAD_VARIANT_ACCESS _LIBCPP_AVAILABILITY_BAD_VARIANT_ACCESS
-#endif
-
-#endif // _LIBCPP___AVAILABILITY
diff --git a/clang-r416183d/include/c++/v1/__bit_reference b/clang-r416183d/include/c++/v1/__bit_reference
deleted file mode 100644
index 284ed0f..0000000
--- a/clang-r416183d/include/c++/v1/__bit_reference
+++ /dev/null
@@ -1,1305 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___BIT_REFERENCE
-#define _LIBCPP___BIT_REFERENCE
-
-#include <__config>
-#include <bit>
-#include <algorithm>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Cp, bool _IsConst, typename _Cp::__storage_type = 0> class __bit_iterator;
-template <class _Cp> class __bit_const_reference;
-
-template <class _Tp>
-struct __has_storage_type
-{
- static const bool value = false;
-};
-
-template <class _Cp, bool = __has_storage_type<_Cp>::value>
-class __bit_reference
-{
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename _Cp::__storage_pointer __storage_pointer;
-
- __storage_pointer __seg_;
- __storage_type __mask_;
-
- friend typename _Cp::__self;
-
- friend class __bit_const_reference<_Cp>;
- friend class __bit_iterator<_Cp, false>;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference(const __bit_reference&) = default;
-
- _LIBCPP_INLINE_VISIBILITY operator bool() const _NOEXCEPT
- {return static_cast<bool>(*__seg_ & __mask_);}
- _LIBCPP_INLINE_VISIBILITY bool operator ~() const _NOEXCEPT
- {return !static_cast<bool>(*this);}
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference& operator=(bool __x) _NOEXCEPT
- {
- if (__x)
- *__seg_ |= __mask_;
- else
- *__seg_ &= ~__mask_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference& operator=(const __bit_reference& __x) _NOEXCEPT
- {return operator=(static_cast<bool>(__x));}
-
- _LIBCPP_INLINE_VISIBILITY void flip() _NOEXCEPT {*__seg_ ^= __mask_;}
- _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, false> operator&() const _NOEXCEPT
- {return __bit_iterator<_Cp, false>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));}
-private:
- _LIBCPP_INLINE_VISIBILITY
- __bit_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
- : __seg_(__s), __mask_(__m) {}
-};
-
-template <class _Cp>
-class __bit_reference<_Cp, false>
-{
-};
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__bit_reference<_Cp> __x, __bit_reference<_Cp> __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp, class _Dp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__bit_reference<_Cp> __x, __bit_reference<_Dp> __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(__bit_reference<_Cp> __x, bool& __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(bool& __x, __bit_reference<_Cp> __y) _NOEXCEPT
-{
- bool __t = __x;
- __x = __y;
- __y = __t;
-}
-
-template <class _Cp>
-class __bit_const_reference
-{
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename _Cp::__const_storage_pointer __storage_pointer;
-
- __storage_pointer __seg_;
- __storage_type __mask_;
-
- friend typename _Cp::__self;
- friend class __bit_iterator<_Cp, true>;
-public:
- _LIBCPP_INLINE_VISIBILITY
- __bit_const_reference(const __bit_const_reference&) = default;
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_const_reference(const __bit_reference<_Cp>& __x) _NOEXCEPT
- : __seg_(__x.__seg_), __mask_(__x.__mask_) {}
-
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR operator bool() const _NOEXCEPT
- {return static_cast<bool>(*__seg_ & __mask_);}
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator<_Cp, true> operator&() const _NOEXCEPT
- {return __bit_iterator<_Cp, true>(__seg_, static_cast<unsigned>(__libcpp_ctz(__mask_)));}
-private:
- _LIBCPP_INLINE_VISIBILITY
- _LIBCPP_CONSTEXPR
- __bit_const_reference(__storage_pointer __s, __storage_type __m) _NOEXCEPT
- : __seg_(__s), __mask_(__m) {}
-
- __bit_const_reference& operator=(const __bit_const_reference&) = delete;
-};
-
-// find
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, _IsConst>
-__find_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- static const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = *__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
- if (__n == __dn)
- return __first + __n;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- if (*__first.__seg_)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(*__first.__seg_)));
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
- }
- return _It(__first.__seg_, static_cast<unsigned>(__n));
-}
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, _IsConst>
-__find_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = ~*__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
- if (__n == __dn)
- return __first + __n;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- {
- __storage_type __b = ~*__first.__seg_;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
- }
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = ~*__first.__seg_ & __m;
- if (__b)
- return _It(__first.__seg_, static_cast<unsigned>(_VSTD::__libcpp_ctz(__b)));
- }
- return _It(__first.__seg_, static_cast<unsigned>(__n));
-}
-
-template <class _Cp, bool _IsConst, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, _IsConst>
-find(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
-{
- if (static_cast<bool>(__value_))
- return _VSTD::__find_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
- return _VSTD::__find_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
-}
-
-// count
-
-template <class _Cp, bool _IsConst>
-typename __bit_iterator<_Cp, _IsConst>::difference_type
-__count_bool_true(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- typedef typename _It::difference_type difference_type;
- const int __bits_per_word = _It::__bits_per_word;
- difference_type __r = 0;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __r = _VSTD::__libcpp_popcount(*__first.__seg_ & __m);
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- __r += _VSTD::__libcpp_popcount(*__first.__seg_);
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __r += _VSTD::__libcpp_popcount(*__first.__seg_ & __m);
- }
- return __r;
-}
-
-template <class _Cp, bool _IsConst>
-typename __bit_iterator<_Cp, _IsConst>::difference_type
-__count_bool_false(__bit_iterator<_Cp, _IsConst> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, _IsConst> _It;
- typedef typename _It::__storage_type __storage_type;
- typedef typename _It::difference_type difference_type;
- const int __bits_per_word = _It::__bits_per_word;
- difference_type __r = 0;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __r = _VSTD::__libcpp_popcount(~*__first.__seg_ & __m);
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- for (; __n >= __bits_per_word; ++__first.__seg_, __n -= __bits_per_word)
- __r += _VSTD::__libcpp_popcount(~*__first.__seg_);
- // do last partial word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __r += _VSTD::__libcpp_popcount(~*__first.__seg_ & __m);
- }
- return __r;
-}
-
-template <class _Cp, bool _IsConst, class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __bit_iterator<_Cp, _IsConst>::difference_type
-count(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, const _Tp& __value_)
-{
- if (static_cast<bool>(__value_))
- return _VSTD::__count_bool_true(__first, static_cast<typename _Cp::size_type>(__last - __first));
- return _VSTD::__count_bool_false(__first, static_cast<typename _Cp::size_type>(__last - __first));
-}
-
-// fill_n
-
-template <class _Cp>
-void
-__fill_n_false(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, false> _It;
- typedef typename _It::__storage_type __storage_type;
- const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- *__first.__seg_ &= ~__m;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- __storage_type __nw = __n / __bits_per_word;
- _VSTD::memset(_VSTD::__to_address(__first.__seg_), 0, __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- // do last partial word
- if (__n > 0)
- {
- __first.__seg_ += __nw;
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- *__first.__seg_ &= ~__m;
- }
-}
-
-template <class _Cp>
-void
-__fill_n_true(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n)
-{
- typedef __bit_iterator<_Cp, false> _It;
- typedef typename _It::__storage_type __storage_type;
- const int __bits_per_word = _It::__bits_per_word;
- // do first partial word
- if (__first.__ctz_ != 0)
- {
- __storage_type __clz_f = static_cast<__storage_type>(__bits_per_word - __first.__ctz_);
- __storage_type __dn = _VSTD::min(__clz_f, __n);
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- *__first.__seg_ |= __m;
- __n -= __dn;
- ++__first.__seg_;
- }
- // do middle whole words
- __storage_type __nw = __n / __bits_per_word;
- _VSTD::memset(_VSTD::__to_address(__first.__seg_), -1, __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- // do last partial word
- if (__n > 0)
- {
- __first.__seg_ += __nw;
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- *__first.__seg_ |= __m;
- }
-}
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-fill_n(__bit_iterator<_Cp, false> __first, typename _Cp::size_type __n, bool __value_)
-{
- if (__n > 0)
- {
- if (__value_)
- _VSTD::__fill_n_true(__first, __n);
- else
- _VSTD::__fill_n_false(__first, __n);
- }
-}
-
-// fill
-
-template <class _Cp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-fill(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __last, bool __value_)
-{
- _VSTD::fill_n(__first, static_cast<typename _Cp::size_type>(__last - __first), __value_);
-}
-
-// copy
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
- __storage_type __b = *__first.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- __storage_type __nw = __n / __bits_per_word;
- _VSTD::memmove(_VSTD::__to_address(__result.__seg_),
- _VSTD::__to_address(__first.__seg_),
- __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- __result.__seg_ += __nw;
- // do last word
- if (__n > 0)
- {
- __first.__seg_ += __nw;
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- static const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz_f = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = *__first.__seg_ & __m;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
- *__result.__seg_ &= ~__m;
- if (__result.__ctz_ > __first.__ctz_)
- *__result.__seg_ |= __b << (__result.__ctz_ - __first.__ctz_);
- else
- *__result.__seg_ |= __b >> (__first.__ctz_ - __result.__ctz_);
- __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- if (__dn > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __dn);
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> (__first.__ctz_ + __ddn);
- __result.__ctz_ = static_cast<unsigned>(__dn);
- }
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __m = ~__storage_type(0) << __result.__ctz_;
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
- {
- __storage_type __b = *__first.__seg_;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b << __result.__ctz_;
- ++__result.__seg_;
- *__result.__seg_ &= __m;
- *__result.__seg_ |= __b >> __clz_r;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first.__seg_ & __m;
- __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b << __result.__ctz_;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> __dn;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-copy(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- if (__first.__ctz_ == __result.__ctz_)
- return _VSTD::__copy_aligned(__first, __last, __result);
- return _VSTD::__copy_unaligned(__first, __last, __result);
-}
-
-// copy_backward
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_backward_aligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__last.__ctz_ != 0)
- {
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
- __n -= __dn;
- unsigned __clz = __bits_per_word - __last.__ctz_;
- __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz);
- __storage_type __b = *__last.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
- __result.__ctz_) % __bits_per_word);
- // __last.__ctz_ = 0
- }
- // __last.__ctz_ == 0 || __n == 0
- // __result.__ctz_ == 0 || __n == 0
- // do middle words
- __storage_type __nw = __n / __bits_per_word;
- __result.__seg_ -= __nw;
- __last.__seg_ -= __nw;
- _VSTD::memmove(_VSTD::__to_address(__result.__seg_),
- _VSTD::__to_address(__last.__seg_),
- __nw * sizeof(__storage_type));
- __n -= __nw * __bits_per_word;
- // do last word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) << (__bits_per_word - __n);
- __storage_type __b = *--__last.__seg_ & __m;
- *--__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b;
- __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-__bit_iterator<_Cp, false>
-__copy_backward_unaligned(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last,
- __bit_iterator<_Cp, false> __result)
-{
- typedef __bit_iterator<_Cp, _IsConst> _In;
- typedef typename _In::difference_type difference_type;
- typedef typename _In::__storage_type __storage_type;
- const int __bits_per_word = _In::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__last.__ctz_ != 0)
- {
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__last.__ctz_), __n);
- __n -= __dn;
- unsigned __clz_l = __bits_per_word - __last.__ctz_;
- __storage_type __m = (~__storage_type(0) << (__last.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_l);
- __storage_type __b = *__last.__seg_ & __m;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __ddn = _VSTD::min(__dn, static_cast<difference_type>(__result.__ctz_));
- if (__ddn > 0)
- {
- __m = (~__storage_type(0) << (__result.__ctz_ - __ddn)) & (~__storage_type(0) >> __clz_r);
- *__result.__seg_ &= ~__m;
- if (__result.__ctz_ > __last.__ctz_)
- *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
- else
- *__result.__seg_ |= __b >> (__last.__ctz_ - __result.__ctz_);
- __result.__ctz_ = static_cast<unsigned>(((-__ddn & (__bits_per_word - 1)) +
- __result.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- }
- if (__dn > 0)
- {
- // __result.__ctz_ == 0
- --__result.__seg_;
- __result.__ctz_ = static_cast<unsigned>(-__dn & (__bits_per_word - 1));
- __m = ~__storage_type(0) << __result.__ctz_;
- *__result.__seg_ &= ~__m;
- __last.__ctz_ -= __dn + __ddn;
- *__result.__seg_ |= __b << (__result.__ctz_ - __last.__ctz_);
- }
- // __last.__ctz_ = 0
- }
- // __last.__ctz_ == 0 || __n == 0
- // __result.__ctz_ != 0 || __n == 0
- // do middle words
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __m = ~__storage_type(0) >> __clz_r;
- for (; __n >= __bits_per_word; __n -= __bits_per_word)
- {
- __storage_type __b = *--__last.__seg_;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> __clz_r;
- *--__result.__seg_ &= __m;
- *__result.__seg_ |= __b << __result.__ctz_;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) << (__bits_per_word - __n);
- __storage_type __b = *--__last.__seg_ & __m;
- __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__result.__ctz_));
- __m = (~__storage_type(0) << (__result.__ctz_ - __dn)) & (~__storage_type(0) >> __clz_r);
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b >> (__bits_per_word - __result.__ctz_);
- __result.__ctz_ = static_cast<unsigned>(((-__dn & (__bits_per_word - 1)) +
- __result.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- // __result.__ctz_ == 0
- --__result.__seg_;
- __result.__ctz_ = static_cast<unsigned>(-__n & (__bits_per_word - 1));
- __m = ~__storage_type(0) << __result.__ctz_;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b << (__result.__ctz_ - (__bits_per_word - __n - __dn));
- }
- }
- }
- return __result;
-}
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-copy_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- if (__last.__ctz_ == __result.__ctz_)
- return _VSTD::__copy_backward_aligned(__first, __last, __result);
- return _VSTD::__copy_backward_unaligned(__first, __last, __result);
-}
-
-// move
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-move(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- return _VSTD::copy(__first, __last, __result);
-}
-
-// move_backward
-
-template <class _Cp, bool _IsConst>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<_Cp, false>
-move_backward(__bit_iterator<_Cp, _IsConst> __first, __bit_iterator<_Cp, _IsConst> __last, __bit_iterator<_Cp, false> __result)
-{
- return _VSTD::copy_backward(__first, __last, __result);
-}
-
-// swap_ranges
-
-template <class __C1, class __C2>
-__bit_iterator<__C2, false>
-__swap_ranges_aligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
- __bit_iterator<__C2, false> __result)
-{
- typedef __bit_iterator<__C1, false> _I1;
- typedef typename _I1::difference_type difference_type;
- typedef typename _I1::__storage_type __storage_type;
- const int __bits_per_word = _I1::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1;
- *__first.__seg_ |= __b2;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_, ++__result.__seg_)
- swap(*__first.__seg_, *__result.__seg_);
- // do last word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1;
- *__first.__seg_ |= __b2;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- return __result;
-}
-
-template <class __C1, class __C2>
-__bit_iterator<__C2, false>
-__swap_ranges_unaligned(__bit_iterator<__C1, false> __first, __bit_iterator<__C1, false> __last,
- __bit_iterator<__C2, false> __result)
-{
- typedef __bit_iterator<__C1, false> _I1;
- typedef typename _I1::difference_type difference_type;
- typedef typename _I1::__storage_type __storage_type;
- const int __bits_per_word = _I1::__bits_per_word;
- difference_type __n = __last - __first;
- if (__n > 0)
- {
- // do first word
- if (__first.__ctz_ != 0)
- {
- unsigned __clz_f = __bits_per_word - __first.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- if (__result.__ctz_ > __first.__ctz_)
- {
- unsigned __s = __result.__ctz_ - __first.__ctz_;
- *__result.__seg_ |= __b1 << __s;
- *__first.__seg_ |= __b2 >> __s;
- }
- else
- {
- unsigned __s = __first.__ctz_ - __result.__ctz_;
- *__result.__seg_ |= __b1 >> __s;
- *__first.__seg_ |= __b2 << __s;
- }
- __result.__seg_ += (__ddn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__ddn + __result.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- if (__dn > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __dn);
- __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- unsigned __s = __first.__ctz_ + __ddn;
- *__result.__seg_ |= __b1 >> __s;
- *__first.__seg_ |= __b2 << __s;
- __result.__ctz_ = static_cast<unsigned>(__dn);
- }
- ++__first.__seg_;
- // __first.__ctz_ = 0;
- }
- // __first.__ctz_ == 0;
- // do middle words
- __storage_type __m = ~__storage_type(0) << __result.__ctz_;
- unsigned __clz_r = __bits_per_word - __result.__ctz_;
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first.__seg_)
- {
- __storage_type __b1 = *__first.__seg_;
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1 << __result.__ctz_;
- *__first.__seg_ = __b2 >> __result.__ctz_;
- ++__result.__seg_;
- __b2 = *__result.__seg_ & ~__m;
- *__result.__seg_ &= __m;
- *__result.__seg_ |= __b1 >> __clz_r;
- *__first.__seg_ |= __b2 << __clz_r;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b1 = *__first.__seg_ & __m;
- *__first.__seg_ &= ~__m;
- __storage_type __dn = _VSTD::min<__storage_type>(__n, __clz_r);
- __m = (~__storage_type(0) << __result.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
- __storage_type __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1 << __result.__ctz_;
- *__first.__seg_ |= __b2 >> __result.__ctz_;
- __result.__seg_ += (__dn + __result.__ctz_) / __bits_per_word;
- __result.__ctz_ = static_cast<unsigned>((__dn + __result.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __b2 = *__result.__seg_ & __m;
- *__result.__seg_ &= ~__m;
- *__result.__seg_ |= __b1 >> __dn;
- *__first.__seg_ |= __b2 << __dn;
- __result.__ctz_ = static_cast<unsigned>(__n);
- }
- }
- }
- return __result;
-}
-
-template <class __C1, class __C2>
-inline _LIBCPP_INLINE_VISIBILITY
-__bit_iterator<__C2, false>
-swap_ranges(__bit_iterator<__C1, false> __first1, __bit_iterator<__C1, false> __last1,
- __bit_iterator<__C2, false> __first2)
-{
- if (__first1.__ctz_ == __first2.__ctz_)
- return _VSTD::__swap_ranges_aligned(__first1, __last1, __first2);
- return _VSTD::__swap_ranges_unaligned(__first1, __last1, __first2);
-}
-
-// rotate
-
-template <class _Cp>
-struct __bit_array
-{
- typedef typename _Cp::difference_type difference_type;
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename _Cp::__storage_pointer __storage_pointer;
- typedef typename _Cp::iterator iterator;
- static const unsigned __bits_per_word = _Cp::__bits_per_word;
- static const unsigned _Np = 4;
-
- difference_type __size_;
- __storage_type __word_[_Np];
-
- _LIBCPP_INLINE_VISIBILITY static difference_type capacity()
- {return static_cast<difference_type>(_Np * __bits_per_word);}
- _LIBCPP_INLINE_VISIBILITY explicit __bit_array(difference_type __s) : __size_(__s) {}
- _LIBCPP_INLINE_VISIBILITY iterator begin()
- {
- return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]), 0);
- }
- _LIBCPP_INLINE_VISIBILITY iterator end()
- {
- return iterator(pointer_traits<__storage_pointer>::pointer_to(__word_[0]) + __size_ / __bits_per_word,
- static_cast<unsigned>(__size_ % __bits_per_word));
- }
-};
-
-template <class _Cp>
-__bit_iterator<_Cp, false>
-rotate(__bit_iterator<_Cp, false> __first, __bit_iterator<_Cp, false> __middle, __bit_iterator<_Cp, false> __last)
-{
- typedef __bit_iterator<_Cp, false> _I1;
- typedef typename _I1::difference_type difference_type;
- difference_type __d1 = __middle - __first;
- difference_type __d2 = __last - __middle;
- _I1 __r = __first + __d2;
- while (__d1 != 0 && __d2 != 0)
- {
- if (__d1 <= __d2)
- {
- if (__d1 <= __bit_array<_Cp>::capacity())
- {
- __bit_array<_Cp> __b(__d1);
- _VSTD::copy(__first, __middle, __b.begin());
- _VSTD::copy(__b.begin(), __b.end(), _VSTD::copy(__middle, __last, __first));
- break;
- }
- else
- {
- __bit_iterator<_Cp, false> __mp = _VSTD::swap_ranges(__first, __middle, __middle);
- __first = __middle;
- __middle = __mp;
- __d2 -= __d1;
- }
- }
- else
- {
- if (__d2 <= __bit_array<_Cp>::capacity())
- {
- __bit_array<_Cp> __b(__d2);
- _VSTD::copy(__middle, __last, __b.begin());
- _VSTD::copy_backward(__b.begin(), __b.end(), _VSTD::copy_backward(__first, __middle, __last));
- break;
- }
- else
- {
- __bit_iterator<_Cp, false> __mp = __first + __d2;
- _VSTD::swap_ranges(__first, __mp, __middle);
- __first = __mp;
- __d1 -= __d2;
- }
- }
- }
- return __r;
-}
-
-// equal
-
-template <class _Cp, bool _IC1, bool _IC2>
-bool
-__equal_unaligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
- __bit_iterator<_Cp, _IC2> __first2)
-{
- typedef __bit_iterator<_Cp, _IC1> _It;
- typedef typename _It::difference_type difference_type;
- typedef typename _It::__storage_type __storage_type;
- static const int __bits_per_word = _It::__bits_per_word;
- difference_type __n = __last1 - __first1;
- if (__n > 0)
- {
- // do first word
- if (__first1.__ctz_ != 0)
- {
- unsigned __clz_f = __bits_per_word - __first1.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz_f), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz_f - __dn));
- __storage_type __b = *__first1.__seg_ & __m;
- unsigned __clz_r = __bits_per_word - __first2.__ctz_;
- __storage_type __ddn = _VSTD::min<__storage_type>(__dn, __clz_r);
- __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __ddn));
- if (__first2.__ctz_ > __first1.__ctz_)
- {
- if ((*__first2.__seg_ & __m) != (__b << (__first2.__ctz_ - __first1.__ctz_)))
- return false;
- }
- else
- {
- if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ - __first2.__ctz_)))
- return false;
- }
- __first2.__seg_ += (__ddn + __first2.__ctz_) / __bits_per_word;
- __first2.__ctz_ = static_cast<unsigned>((__ddn + __first2.__ctz_) % __bits_per_word);
- __dn -= __ddn;
- if (__dn > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __dn);
- if ((*__first2.__seg_ & __m) != (__b >> (__first1.__ctz_ + __ddn)))
- return false;
- __first2.__ctz_ = static_cast<unsigned>(__dn);
- }
- ++__first1.__seg_;
- // __first1.__ctz_ = 0;
- }
- // __first1.__ctz_ == 0;
- // do middle words
- unsigned __clz_r = __bits_per_word - __first2.__ctz_;
- __storage_type __m = ~__storage_type(0) << __first2.__ctz_;
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_)
- {
- __storage_type __b = *__first1.__seg_;
- if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
- return false;
- ++__first2.__seg_;
- if ((*__first2.__seg_ & ~__m) != (__b >> __clz_r))
- return false;
- }
- // do last word
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- __storage_type __b = *__first1.__seg_ & __m;
- __storage_type __dn = _VSTD::min(__n, static_cast<difference_type>(__clz_r));
- __m = (~__storage_type(0) << __first2.__ctz_) & (~__storage_type(0) >> (__clz_r - __dn));
- if ((*__first2.__seg_ & __m) != (__b << __first2.__ctz_))
- return false;
- __first2.__seg_ += (__dn + __first2.__ctz_) / __bits_per_word;
- __first2.__ctz_ = static_cast<unsigned>((__dn + __first2.__ctz_) % __bits_per_word);
- __n -= __dn;
- if (__n > 0)
- {
- __m = ~__storage_type(0) >> (__bits_per_word - __n);
- if ((*__first2.__seg_ & __m) != (__b >> __dn))
- return false;
- }
- }
- }
- return true;
-}
-
-template <class _Cp, bool _IC1, bool _IC2>
-bool
-__equal_aligned(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1,
- __bit_iterator<_Cp, _IC2> __first2)
-{
- typedef __bit_iterator<_Cp, _IC1> _It;
- typedef typename _It::difference_type difference_type;
- typedef typename _It::__storage_type __storage_type;
- static const int __bits_per_word = _It::__bits_per_word;
- difference_type __n = __last1 - __first1;
- if (__n > 0)
- {
- // do first word
- if (__first1.__ctz_ != 0)
- {
- unsigned __clz = __bits_per_word - __first1.__ctz_;
- difference_type __dn = _VSTD::min(static_cast<difference_type>(__clz), __n);
- __n -= __dn;
- __storage_type __m = (~__storage_type(0) << __first1.__ctz_) & (~__storage_type(0) >> (__clz - __dn));
- if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
- return false;
- ++__first2.__seg_;
- ++__first1.__seg_;
- // __first1.__ctz_ = 0;
- // __first2.__ctz_ = 0;
- }
- // __first1.__ctz_ == 0;
- // __first2.__ctz_ == 0;
- // do middle words
- for (; __n >= __bits_per_word; __n -= __bits_per_word, ++__first1.__seg_, ++__first2.__seg_)
- if (*__first2.__seg_ != *__first1.__seg_)
- return false;
- // do last word
- if (__n > 0)
- {
- __storage_type __m = ~__storage_type(0) >> (__bits_per_word - __n);
- if ((*__first2.__seg_ & __m) != (*__first1.__seg_ & __m))
- return false;
- }
- }
- return true;
-}
-
-template <class _Cp, bool _IC1, bool _IC2>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-equal(__bit_iterator<_Cp, _IC1> __first1, __bit_iterator<_Cp, _IC1> __last1, __bit_iterator<_Cp, _IC2> __first2)
-{
- if (__first1.__ctz_ == __first2.__ctz_)
- return _VSTD::__equal_aligned(__first1, __last1, __first2);
- return _VSTD::__equal_unaligned(__first1, __last1, __first2);
-}
-
-template <class _Cp, bool _IsConst,
- typename _Cp::__storage_type>
-class __bit_iterator
-{
-public:
- typedef typename _Cp::difference_type difference_type;
- typedef bool value_type;
- typedef __bit_iterator pointer;
- typedef typename conditional<_IsConst, __bit_const_reference<_Cp>, __bit_reference<_Cp> >::type reference;
- typedef random_access_iterator_tag iterator_category;
-
-private:
- typedef typename _Cp::__storage_type __storage_type;
- typedef typename conditional<_IsConst, typename _Cp::__const_storage_pointer,
- typename _Cp::__storage_pointer>::type __storage_pointer;
- static const unsigned __bits_per_word = _Cp::__bits_per_word;
-
- __storage_pointer __seg_;
- unsigned __ctz_;
-
-public:
- _LIBCPP_INLINE_VISIBILITY __bit_iterator() _NOEXCEPT
-#if _LIBCPP_STD_VER > 11
- : __seg_(nullptr), __ctz_(0)
-#endif
- {}
-
- // avoid re-declaring a copy constructor for the non-const version.
- using __type_for_copy_to_const =
- _If<_IsConst, __bit_iterator<_Cp, false>, struct __private_nat>;
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_iterator(const __type_for_copy_to_const& __it) _NOEXCEPT
- : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
-
- // The non-const __bit_iterator has historically had a non-trivial
- // copy constructor (as a quirk of its construction). We need to maintain
- // this for ABI purposes.
- using __type_for_abi_non_trivial_copy_ctor =
- _If<!_IsConst, __bit_iterator, struct __private_nat>;
-
- _LIBCPP_INLINE_VISIBILITY
- __bit_iterator(__type_for_abi_non_trivial_copy_ctor const& __it) _NOEXCEPT
- : __seg_(__it.__seg_), __ctz_(__it.__ctz_) {}
-
- // Always declare the copy assignment operator since the implicit declaration
- // is deprecated.
- _LIBCPP_INLINE_VISIBILITY
- __bit_iterator& operator=(__bit_iterator const&) = default;
-
- _LIBCPP_INLINE_VISIBILITY reference operator*() const _NOEXCEPT
- {return reference(__seg_, __storage_type(1) << __ctz_);}
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator++()
- {
- if (__ctz_ != __bits_per_word-1)
- ++__ctz_;
- else
- {
- __ctz_ = 0;
- ++__seg_;
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator++(int)
- {
- __bit_iterator __tmp = *this;
- ++(*this);
- return __tmp;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator--()
- {
- if (__ctz_ != 0)
- --__ctz_;
- else
- {
- __ctz_ = __bits_per_word - 1;
- --__seg_;
- }
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator--(int)
- {
- __bit_iterator __tmp = *this;
- --(*this);
- return __tmp;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator+=(difference_type __n)
- {
- if (__n >= 0)
- __seg_ += (__n + __ctz_) / __bits_per_word;
- else
- __seg_ += static_cast<difference_type>(__n - __bits_per_word + __ctz_ + 1)
- / static_cast<difference_type>(__bits_per_word);
- __n &= (__bits_per_word - 1);
- __ctz_ = static_cast<unsigned>((__n + __ctz_) % __bits_per_word);
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator& operator-=(difference_type __n)
- {
- return *this += -__n;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator+(difference_type __n) const
- {
- __bit_iterator __t(*this);
- __t += __n;
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY __bit_iterator operator-(difference_type __n) const
- {
- __bit_iterator __t(*this);
- __t -= __n;
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- friend __bit_iterator operator+(difference_type __n, const __bit_iterator& __it) {return __it + __n;}
-
- _LIBCPP_INLINE_VISIBILITY
- friend difference_type operator-(const __bit_iterator& __x, const __bit_iterator& __y)
- {return (__x.__seg_ - __y.__seg_) * __bits_per_word + __x.__ctz_ - __y.__ctz_;}
-
- _LIBCPP_INLINE_VISIBILITY reference operator[](difference_type __n) const {return *(*this + __n);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator==(const __bit_iterator& __x, const __bit_iterator& __y)
- {return __x.__seg_ == __y.__seg_ && __x.__ctz_ == __y.__ctz_;}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator!=(const __bit_iterator& __x, const __bit_iterator& __y)
- {return !(__x == __y);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator<(const __bit_iterator& __x, const __bit_iterator& __y)
- {return __x.__seg_ < __y.__seg_ || (__x.__seg_ == __y.__seg_ && __x.__ctz_ < __y.__ctz_);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator>(const __bit_iterator& __x, const __bit_iterator& __y)
- {return __y < __x;}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator<=(const __bit_iterator& __x, const __bit_iterator& __y)
- {return !(__y < __x);}
-
- _LIBCPP_INLINE_VISIBILITY friend bool operator>=(const __bit_iterator& __x, const __bit_iterator& __y)
- {return !(__x < __y);}
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __bit_iterator(__storage_pointer __s, unsigned __ctz) _NOEXCEPT
- : __seg_(__s), __ctz_(__ctz) {}
-
- friend typename _Cp::__self;
-
- friend class __bit_reference<_Cp>;
- friend class __bit_const_reference<_Cp>;
- friend class __bit_iterator<_Cp, true>;
- template <class _Dp> friend struct __bit_array;
- template <class _Dp> friend void __fill_n_false(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
- template <class _Dp> friend void __fill_n_true(__bit_iterator<_Dp, false> __first, typename _Dp::size_type __n);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_aligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_unaligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_aligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> __copy_backward_unaligned(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, false> copy_backward(__bit_iterator<_Dp, _IC> __first,
- __bit_iterator<_Dp, _IC> __last,
- __bit_iterator<_Dp, false> __result);
- template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_aligned(__bit_iterator<__C1, false>,
- __bit_iterator<__C1, false>,
- __bit_iterator<__C2, false>);
- template <class __C1, class __C2>friend __bit_iterator<__C2, false> __swap_ranges_unaligned(__bit_iterator<__C1, false>,
- __bit_iterator<__C1, false>,
- __bit_iterator<__C2, false>);
- template <class __C1, class __C2>friend __bit_iterator<__C2, false> swap_ranges(__bit_iterator<__C1, false>,
- __bit_iterator<__C1, false>,
- __bit_iterator<__C2, false>);
- template <class _Dp> friend __bit_iterator<_Dp, false> rotate(__bit_iterator<_Dp, false>,
- __bit_iterator<_Dp, false>,
- __bit_iterator<_Dp, false>);
- template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_aligned(__bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC2>);
- template <class _Dp, bool _IC1, bool _IC2> friend bool __equal_unaligned(__bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC2>);
- template <class _Dp, bool _IC1, bool _IC2> friend bool equal(__bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC1>,
- __bit_iterator<_Dp, _IC2>);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_true(__bit_iterator<_Dp, _IC>,
- typename _Dp::size_type);
- template <class _Dp, bool _IC> friend __bit_iterator<_Dp, _IC> __find_bool_false(__bit_iterator<_Dp, _IC>,
- typename _Dp::size_type);
- template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
- __count_bool_true(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
- template <class _Dp, bool _IC> friend typename __bit_iterator<_Dp, _IC>::difference_type
- __count_bool_false(__bit_iterator<_Dp, _IC>, typename _Dp::size_type);
-};
-
-_LIBCPP_END_NAMESPACE_STD
-
-_LIBCPP_POP_MACROS
-
-#endif // _LIBCPP___BIT_REFERENCE
diff --git a/clang-r416183d/include/c++/v1/__bsd_locale_defaults.h b/clang-r416183d/include/c++/v1/__bsd_locale_defaults.h
deleted file mode 100644
index 2ace2a2..0000000
--- a/clang-r416183d/include/c++/v1/__bsd_locale_defaults.h
+++ /dev/null
@@ -1,36 +0,0 @@
-// -*- C++ -*-
-//===---------------------- __bsd_locale_defaults.h -----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// The BSDs have lots of *_l functions. We don't want to define those symbols
-// on other platforms though, for fear of conflicts with user code. So here,
-// we will define the mapping from an internal macro to the real BSD symbol.
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_BSD_LOCALE_DEFAULTS_H
-#define _LIBCPP_BSD_LOCALE_DEFAULTS_H
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#define __libcpp_mb_cur_max_l(loc) MB_CUR_MAX_L(loc)
-#define __libcpp_btowc_l(ch, loc) btowc_l(ch, loc)
-#define __libcpp_wctob_l(wch, loc) wctob_l(wch, loc)
-#define __libcpp_wcsnrtombs_l(dst, src, nwc, len, ps, loc) wcsnrtombs_l(dst, src, nwc, len, ps, loc)
-#define __libcpp_wcrtomb_l(src, wc, ps, loc) wcrtomb_l(src, wc, ps, loc)
-#define __libcpp_mbsnrtowcs_l(dst, src, nms, len, ps, loc) mbsnrtowcs_l(dst, src, nms, len, ps, loc)
-#define __libcpp_mbrtowc_l(pwc, s, n, ps, l) mbrtowc_l(pwc, s, n, ps, l)
-#define __libcpp_mbtowc_l(pwc, pmb, max, l) mbtowc_l(pwc, pmb, max, l)
-#define __libcpp_mbrlen_l(s, n, ps, l) mbrlen_l(s, n, ps, l)
-#define __libcpp_localeconv_l(l) localeconv_l(l)
-#define __libcpp_mbsrtowcs_l(dest, src, len, ps, l) mbsrtowcs_l(dest, src, len, ps, l)
-#define __libcpp_snprintf_l(...) snprintf_l(__VA_ARGS__)
-#define __libcpp_asprintf_l(...) asprintf_l(__VA_ARGS__)
-#define __libcpp_sscanf_l(...) sscanf_l(__VA_ARGS__)
-
-#endif // _LIBCPP_BSD_LOCALE_DEFAULTS_H
diff --git a/clang-r416183d/include/c++/v1/__bsd_locale_fallbacks.h b/clang-r416183d/include/c++/v1/__bsd_locale_fallbacks.h
deleted file mode 100644
index a807fe0..0000000
--- a/clang-r416183d/include/c++/v1/__bsd_locale_fallbacks.h
+++ /dev/null
@@ -1,139 +0,0 @@
-// -*- C++ -*-
-//===---------------------- __bsd_locale_fallbacks.h ----------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-// The BSDs have lots of *_l functions. This file provides reimplementations
-// of those functions for non-BSD platforms.
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
-#define _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <memory>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(MB_CUR_MAX) __libcpp_mb_cur_max_l(locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return MB_CUR_MAX;
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-wint_t __libcpp_btowc_l(int __c, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return btowc(__c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __libcpp_wctob_l(wint_t __c, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return wctob(__c);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_wcsnrtombs_l(char *__dest, const wchar_t **__src, size_t __nwc,
- size_t __len, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return wcsnrtombs(__dest, __src, __nwc, __len, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_wcrtomb_l(char *__s, wchar_t __wc, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return wcrtomb(__s, __wc, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbsnrtowcs_l(wchar_t * __dest, const char **__src, size_t __nms,
- size_t __len, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbsnrtowcs(__dest, __src, __nms, __len, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbrtowc_l(wchar_t *__pwc, const char *__s, size_t __n,
- mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbrtowc(__pwc, __s, __n, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-int __libcpp_mbtowc_l(wchar_t *__pwc, const char *__pmb, size_t __max, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbtowc(__pwc, __pmb, __max);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbrlen_l(const char *__s, size_t __n, mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbrlen(__s, __n, __ps);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-lconv *__libcpp_localeconv_l(locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return localeconv();
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t __libcpp_mbsrtowcs_l(wchar_t *__dest, const char **__src, size_t __len,
- mbstate_t *__ps, locale_t __l)
-{
- __libcpp_locale_guard __current(__l);
- return mbsrtowcs(__dest, __src, __len, __ps);
-}
-
-inline
-int __libcpp_snprintf_l(char *__s, size_t __n, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
- __libcpp_locale_guard __current(__l);
- int __res = vsnprintf(__s, __n, __format, __va);
- va_end(__va);
- return __res;
-}
-
-inline
-int __libcpp_asprintf_l(char **__s, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
- __libcpp_locale_guard __current(__l);
- int __res = vasprintf(__s, __format, __va);
- va_end(__va);
- return __res;
-}
-
-inline
-int __libcpp_sscanf_l(const char *__s, locale_t __l, const char *__format, ...) {
- va_list __va;
- va_start(__va, __format);
- __libcpp_locale_guard __current(__l);
- int __res = vsscanf(__s, __format, __va);
- va_end(__va);
- return __res;
-}
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_BSD_LOCALE_FALLBACKS_DEFAULTS_H
diff --git a/clang-r416183d/include/c++/v1/__config b/clang-r416183d/include/c++/v1/__config
deleted file mode 100644
index b288453..0000000
--- a/clang-r416183d/include/c++/v1/__config
+++ /dev/null
@@ -1,1477 +0,0 @@
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CONFIG_SITE
-#define _LIBCPP_CONFIG_SITE
-
-/* #undef _LIBCPP_ABI_VERSION */
-/* #undef _LIBCPP_ABI_UNSTABLE */
-/* #undef _LIBCPP_ABI_FORCE_ITANIUM */
-/* #undef _LIBCPP_ABI_FORCE_MICROSOFT */
-/* #undef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT */
-/* #undef _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE */
-/* #undef _LIBCPP_HAS_NO_STDIN */
-/* #undef _LIBCPP_HAS_NO_STDOUT */
-/* #undef _LIBCPP_HAS_NO_THREADS */
-/* #undef _LIBCPP_HAS_NO_MONOTONIC_CLOCK */
-/* #undef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS */
-/* #undef _LIBCPP_HAS_MUSL_LIBC */
-/* #undef _LIBCPP_HAS_THREAD_API_PTHREAD */
-/* #undef _LIBCPP_HAS_THREAD_API_EXTERNAL */
-/* #undef _LIBCPP_HAS_THREAD_API_WIN32 */
-/* #undef _LIBCPP_HAS_THREAD_LIBRARY_EXTERNAL */
-/* #undef _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS */
-#define _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS
-/* #undef _LIBCPP_NO_VCRUNTIME */
-/* #undef _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION */
-/* #undef _LIBCPP_ABI_NAMESPACE */
-/* #undef _LIBCPP_HAS_PARALLEL_ALGORITHMS */
-/* #undef _LIBCPP_HAS_NO_RANDOM_DEVICE */
-/* #undef _LIBCPP_HAS_NO_LOCALIZATION */
-
-
-
-#endif // _LIBCPP_CONFIG_SITE
-// -*- C++ -*-
-//===--------------------------- __config ---------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_CONFIG
-#define _LIBCPP_CONFIG
-
-#if defined(_MSC_VER) && !defined(__clang__)
-# if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-# define _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
-# endif
-#endif
-
-#ifndef _LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER
-#pragma GCC system_header
-#endif
-
-#ifdef __cplusplus
-
-#ifdef __GNUC__
-# define _GNUC_VER (__GNUC__ * 100 + __GNUC_MINOR__)
-// The _GNUC_VER_NEW macro better represents the new GCC versioning scheme
-// introduced in GCC 5.0.
-# define _GNUC_VER_NEW (_GNUC_VER * 10 + __GNUC_PATCHLEVEL__)
-#else
-# define _GNUC_VER 0
-# define _GNUC_VER_NEW 0
-#endif
-
-#define _LIBCPP_VERSION 12000
-
-#ifndef _LIBCPP_ABI_VERSION
-# define _LIBCPP_ABI_VERSION 1
-#endif
-
-#if __STDC_HOSTED__ == 0
-# define _LIBCPP_FREESTANDING
-#endif
-
-#ifndef _LIBCPP_STD_VER
-# if __cplusplus <= 201103L
-# define _LIBCPP_STD_VER 11
-# elif __cplusplus <= 201402L
-# define _LIBCPP_STD_VER 14
-# elif __cplusplus <= 201703L
-# define _LIBCPP_STD_VER 17
-# elif __cplusplus <= 202002L
-# define _LIBCPP_STD_VER 20
-# else
-# define _LIBCPP_STD_VER 21 // current year, or date of c++2b ratification
-# endif
-#endif // _LIBCPP_STD_VER
-
-#if defined(__ELF__)
-# define _LIBCPP_OBJECT_FORMAT_ELF 1
-#elif defined(__MACH__)
-# define _LIBCPP_OBJECT_FORMAT_MACHO 1
-#elif defined(_WIN32)
-# define _LIBCPP_OBJECT_FORMAT_COFF 1
-#elif defined(__wasm__)
-# define _LIBCPP_OBJECT_FORMAT_WASM 1
-#else
- // ... add new file formats here ...
-#endif
-
-#if defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
-// Change short string representation so that string data starts at offset 0,
-// improving its alignment in some cases.
-# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-// Fix deque iterator type in order to support incomplete types.
-# define _LIBCPP_ABI_INCOMPLETE_TYPES_IN_DEQUE
-// Fix undefined behavior in how std::list stores its linked nodes.
-# define _LIBCPP_ABI_LIST_REMOVE_NODE_POINTER_UB
-// Fix undefined behavior in how __tree stores its end and parent nodes.
-# define _LIBCPP_ABI_TREE_REMOVE_NODE_POINTER_UB
-// Fix undefined behavior in how __hash_table stores its pointer types.
-# define _LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB
-# define _LIBCPP_ABI_FORWARD_LIST_REMOVE_NODE_POINTER_UB
-# define _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
-// Don't use a nullptr_t simulation type in C++03 instead using C++11 nullptr
-// provided under the alternate keyword __nullptr, which changes the mangling
-// of nullptr_t. This option is ABI incompatible with GCC in C++03 mode.
-# define _LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR
-// Define the `pointer_safety` enum as a C++11 strongly typed enumeration
-// instead of as a class simulating an enum. If this option is enabled
-// `pointer_safety` and `get_pointer_safety()` will no longer be available
-// in C++03.
-# define _LIBCPP_ABI_POINTER_SAFETY_ENUM_TYPE
-// Define a key function for `bad_function_call` in the library, to centralize
-// its vtable and typeinfo to libc++ rather than having all other libraries
-// using that class define their own copies.
-# define _LIBCPP_ABI_BAD_FUNCTION_CALL_KEY_FUNCTION
-// Enable optimized version of __do_get_(un)signed which avoids redundant copies.
-# define _LIBCPP_ABI_OPTIMIZED_LOCALE_NUM_GET
-// Use the smallest possible integer type to represent the index of the variant.
-// Previously libc++ used "unsigned int" exclusively.
-# define _LIBCPP_ABI_VARIANT_INDEX_TYPE_OPTIMIZATION
-// Unstable attempt to provide a more optimized std::function
-# define _LIBCPP_ABI_OPTIMIZED_FUNCTION
-// All the regex constants must be distinct and nonzero.
-# define _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
-// Re-worked external template instantiations for std::string with a focus on
-// performance and fast-path inlining.
-# define _LIBCPP_ABI_STRING_OPTIMIZED_EXTERNAL_INSTANTIATION
-// Enable clang::trivial_abi on std::unique_ptr.
-# define _LIBCPP_ABI_ENABLE_UNIQUE_PTR_TRIVIAL_ABI
-// Enable clang::trivial_abi on std::shared_ptr and std::weak_ptr
-# define _LIBCPP_ABI_ENABLE_SHARED_PTR_TRIVIAL_ABI
-#elif _LIBCPP_ABI_VERSION == 1
-# if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
-// Enable compiling copies of now inline methods into the dylib to support
-// applications compiled against older libraries. This is unnecessary with
-// COFF dllexport semantics, since dllexport forces a non-inline definition
-// of inline functions to be emitted anyway. Our own non-inline copy would
-// conflict with the dllexport-emitted copy, so we disable it.
-# define _LIBCPP_DEPRECATED_ABI_LEGACY_LIBRARY_DEFINITIONS_FOR_INLINE_FUNCTIONS
-# endif
-// Feature macros for disabling pre ABI v1 features. All of these options
-// are deprecated.
-# if defined(__FreeBSD__)
-# define _LIBCPP_DEPRECATED_ABI_DISABLE_PAIR_TRIVIAL_COPY_CTOR
-# endif
-#endif
-
-#if defined(_LIBCPP_BUILDING_LIBRARY) || defined(_LIBCPP_ABI_UNSTABLE) || _LIBCPP_ABI_VERSION >= 2
-// Enable additional explicit instantiations of iostreams components. This
-// reduces the number of weak definitions generated in programs that use
-// iostreams by providing a single strong definition in the shared library.
-# define _LIBCPP_ABI_ENABLE_ADDITIONAL_IOSTREAM_EXPLICIT_INSTANTIATIONS_1
-#endif
-
-#define _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_X##_LIBCPP_Y
-#define _LIBCPP_CONCAT(_LIBCPP_X,_LIBCPP_Y) _LIBCPP_CONCAT1(_LIBCPP_X,_LIBCPP_Y)
-
-#ifndef _LIBCPP_ABI_NAMESPACE
-# define _LIBCPP_ABI_NAMESPACE _LIBCPP_CONCAT(__,_LIBCPP_ABI_VERSION)
-#endif
-
-#if __cplusplus < 201103L
-#define _LIBCPP_CXX03_LANG
-#endif
-
-#ifndef __has_attribute
-#define __has_attribute(__x) 0
-#endif
-
-#ifndef __has_builtin
-#define __has_builtin(__x) 0
-#endif
-
-#ifndef __has_extension
-#define __has_extension(__x) 0
-#endif
-
-#ifndef __has_feature
-#define __has_feature(__x) 0
-#endif
-
-#ifndef __has_cpp_attribute
-#define __has_cpp_attribute(__x) 0
-#endif
-
-// '__is_identifier' returns '0' if '__x' is a reserved identifier provided by
-// the compiler and '1' otherwise.
-#ifndef __is_identifier
-#define __is_identifier(__x) 1
-#endif
-
-#ifndef __has_declspec_attribute
-#define __has_declspec_attribute(__x) 0
-#endif
-
-#define __has_keyword(__x) !(__is_identifier(__x))
-
-#ifndef __has_include
-#define __has_include(...) 0
-#endif
-
-#if defined(__clang__)
-# define _LIBCPP_COMPILER_CLANG
-# ifndef __apple_build_version__
-# define _LIBCPP_CLANG_VER (__clang_major__ * 100 + __clang_minor__)
-# endif
-#elif defined(__GNUC__)
-# define _LIBCPP_COMPILER_GCC
-#elif defined(_MSC_VER)
-# define _LIBCPP_COMPILER_MSVC
-#elif defined(__IBMCPP__)
-# define _LIBCPP_COMPILER_IBM
-#endif
-
-#if defined(_LIBCPP_COMPILER_GCC) && __cplusplus < 201103L
-#error "libc++ does not support using GCC with C++03. Please enable C++11"
-#endif
-
-// FIXME: ABI detection should be done via compiler builtin macros. This
-// is just a placeholder until Clang implements such macros. For now assume
-// that Windows compilers pretending to be MSVC++ target the Microsoft ABI,
-// and allow the user to explicitly specify the ABI to handle cases where this
-// heuristic falls short.
-#if defined(_LIBCPP_ABI_FORCE_ITANIUM) && defined(_LIBCPP_ABI_FORCE_MICROSOFT)
-# error "Only one of _LIBCPP_ABI_FORCE_ITANIUM and _LIBCPP_ABI_FORCE_MICROSOFT can be defined"
-#elif defined(_LIBCPP_ABI_FORCE_ITANIUM)
-# define _LIBCPP_ABI_ITANIUM
-#elif defined(_LIBCPP_ABI_FORCE_MICROSOFT)
-# define _LIBCPP_ABI_MICROSOFT
-#else
-# if defined(_WIN32) && defined(_MSC_VER)
-# define _LIBCPP_ABI_MICROSOFT
-# else
-# define _LIBCPP_ABI_ITANIUM
-# endif
-#endif
-
-#if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_NO_VCRUNTIME)
-# define _LIBCPP_ABI_VCRUNTIME
-#endif
-
-// Need to detect which libc we're using if we're on Linux.
-#if defined(__linux__)
-# include <features.h>
-# if defined(__GLIBC_PREREQ)
-# define _LIBCPP_GLIBC_PREREQ(a, b) __GLIBC_PREREQ(a, b)
-# else
-# define _LIBCPP_GLIBC_PREREQ(a, b) 0
-# endif // defined(__GLIBC_PREREQ)
-#endif // defined(__linux__)
-
-#ifdef __LITTLE_ENDIAN__
-# if __LITTLE_ENDIAN__
-# define _LIBCPP_LITTLE_ENDIAN
-# endif // __LITTLE_ENDIAN__
-#endif // __LITTLE_ENDIAN__
-
-#ifdef __BIG_ENDIAN__
-# if __BIG_ENDIAN__
-# define _LIBCPP_BIG_ENDIAN
-# endif // __BIG_ENDIAN__
-#endif // __BIG_ENDIAN__
-
-#ifdef __BYTE_ORDER__
-# if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
-# define _LIBCPP_LITTLE_ENDIAN
-# elif __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-# define _LIBCPP_BIG_ENDIAN
-# endif // __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
-#endif // __BYTE_ORDER__
-
-#ifdef __FreeBSD__
-# include <sys/endian.h>
-# include <osreldate.h>
-# if _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else // _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# endif // _BYTE_ORDER == _LITTLE_ENDIAN
-# ifndef __LONG_LONG_SUPPORTED
-# define _LIBCPP_HAS_NO_LONG_LONG
-# endif // __LONG_LONG_SUPPORTED
-#endif // __FreeBSD__
-
-#if defined(__NetBSD__) || defined(__OpenBSD__)
-# include <sys/endian.h>
-# if _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else // _BYTE_ORDER == _LITTLE_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# endif // _BYTE_ORDER == _LITTLE_ENDIAN
-#endif // defined(__NetBSD__) || defined(__OpenBSD__)
-
-#if defined(_WIN32)
-# define _LIBCPP_WIN32API
-# define _LIBCPP_LITTLE_ENDIAN
-# define _LIBCPP_SHORT_WCHAR 1
-// Both MinGW and native MSVC provide a "MSVC"-like environment
-# define _LIBCPP_MSVCRT_LIKE
-// If mingw not explicitly detected, assume using MS C runtime only if
-// a MS compatibility version is specified.
-# if defined(_MSC_VER) && !defined(__MINGW32__)
-# define _LIBCPP_MSVCRT // Using Microsoft's C Runtime library
-# endif
-# if (defined(_M_AMD64) || defined(__x86_64__)) || (defined(_M_ARM) || defined(__arm__))
-# define _LIBCPP_HAS_BITSCAN64
-# endif
-# define _LIBCPP_HAS_OPEN_WITH_WCHAR
-# if defined(_LIBCPP_MSVCRT)
-# define _LIBCPP_HAS_QUICK_EXIT
-# endif
-
-// Some CRT APIs are unavailable to store apps
-# if defined(WINAPI_FAMILY)
-# include <winapifamily.h>
-# if !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) && \
- (!defined(WINAPI_PARTITION_SYSTEM) || \
- !WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_SYSTEM))
-# define _LIBCPP_WINDOWS_STORE_APP
-# endif
-# endif
-#endif // defined(_WIN32)
-
-#ifdef __sun__
-# include <sys/isa_defs.h>
-# ifdef _LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# else
-# define _LIBCPP_BIG_ENDIAN
-# endif
-#endif // __sun__
-
-#if defined(__OpenBSD__) || defined(__CloudABI__)
- // Certain architectures provide arc4random(). Prefer using
- // arc4random() over /dev/{u,}random to make it possible to obtain
- // random data even when using sandboxing mechanisms such as chroots,
- // Capsicum, etc.
-# define _LIBCPP_USING_ARC4_RANDOM
-#elif defined(__Fuchsia__) || defined(__wasi__)
-# define _LIBCPP_USING_GETENTROPY
-#elif defined(__native_client__)
- // NaCl's sandbox (which PNaCl also runs in) doesn't allow filesystem access,
- // including accesses to the special files under /dev. C++11's
- // std::random_device is instead exposed through a NaCl syscall.
-# define _LIBCPP_USING_NACL_RANDOM
-#elif defined(_LIBCPP_WIN32API)
-# define _LIBCPP_USING_WIN32_RANDOM
-#else
-# define _LIBCPP_USING_DEV_RANDOM
-#endif
-
-#if !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN)
-# include <endian.h>
-# if __BYTE_ORDER == __LITTLE_ENDIAN
-# define _LIBCPP_LITTLE_ENDIAN
-# elif __BYTE_ORDER == __BIG_ENDIAN
-# define _LIBCPP_BIG_ENDIAN
-# else // __BYTE_ORDER == __BIG_ENDIAN
-# error unable to determine endian
-# endif
-#endif // !defined(_LIBCPP_LITTLE_ENDIAN) && !defined(_LIBCPP_BIG_ENDIAN)
-
-#if __has_attribute(__no_sanitize__) && !defined(_LIBCPP_COMPILER_GCC)
-# define _LIBCPP_NO_CFI __attribute__((__no_sanitize__("cfi")))
-#else
-# define _LIBCPP_NO_CFI
-#endif
-
-#if __ISO_C_VISIBLE >= 2011 || __cplusplus >= 201103L
-# if defined(__FreeBSD__)
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# define _LIBCPP_HAS_QUICK_EXIT
-# if __FreeBSD_version >= 1300064 || \
- (__FreeBSD_version >= 1201504 && __FreeBSD_version < 1300000)
-# define _LIBCPP_HAS_TIMESPEC_GET
-# endif
-# elif defined(__BIONIC__)
-# if __ANDROID_API__ >= 21
-# define _LIBCPP_HAS_QUICK_EXIT
-# endif
-# if __ANDROID_API__ >= 28
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# endif
-# if __ANDROID_API__ >= 29
-# define _LIBCPP_HAS_TIMESPEC_GET
-# endif
-# elif defined(__Fuchsia__) || defined(__wasi__) || defined(__NetBSD__)
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# define _LIBCPP_HAS_QUICK_EXIT
-# define _LIBCPP_HAS_TIMESPEC_GET
-# elif defined(__OpenBSD__)
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# define _LIBCPP_HAS_TIMESPEC_GET
-# elif defined(__linux__)
-# if !defined(_LIBCPP_HAS_MUSL_LIBC)
-# if _LIBCPP_GLIBC_PREREQ(2, 15) || defined(__BIONIC__)
-# define _LIBCPP_HAS_QUICK_EXIT
-# endif
-# if _LIBCPP_GLIBC_PREREQ(2, 17)
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# define _LIBCPP_HAS_TIMESPEC_GET
-# endif
-# else // defined(_LIBCPP_HAS_MUSL_LIBC)
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# define _LIBCPP_HAS_QUICK_EXIT
-# define _LIBCPP_HAS_TIMESPEC_GET
-# endif
-# elif defined(__APPLE__)
- // timespec_get and aligned_alloc were introduced in macOS 10.15 and
- // aligned releases
-# if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 101500 || \
- __ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__ >= 130000 || \
- __ENVIRONMENT_TV_OS_VERSION_MIN_REQUIRED__ >= 130000 || \
- __ENVIRONMENT_WATCH_OS_VERSION_MIN_REQUIRED__ >= 60000)
-# define _LIBCPP_HAS_ALIGNED_ALLOC
-# define _LIBCPP_HAS_TIMESPEC_GET
-# endif
-# endif // __APPLE__
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-# define _LIBCPP_ALIGNOF(_Tp) alignof(_Tp)
-#elif defined(_LIBCPP_COMPILER_CLANG)
-# define _LIBCPP_ALIGNOF(_Tp) _Alignof(_Tp)
-#else
-# error "We don't know a correct way to implement alignof(T) in C++03 outside of Clang"
-#endif
-
-#define _LIBCPP_PREFERRED_ALIGNOF(_Tp) __alignof(_Tp)
-
-#if defined(_LIBCPP_COMPILER_CLANG)
-
-#if defined(_LIBCPP_ALTERNATE_STRING_LAYOUT)
-# error _LIBCPP_ALTERNATE_STRING_LAYOUT is deprecated, please use _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT instead
-#endif
-#if defined(__APPLE__) && !defined(__i386__) && !defined(__x86_64__) && \
- (!defined(__arm__) || __ARM_ARCH_7K__ >= 2)
-# define _LIBCPP_ABI_ALTERNATE_STRING_LAYOUT
-#endif
-
-#if __has_feature(cxx_alignas)
-# define _ALIGNAS_TYPE(x) alignas(x)
-# define _ALIGNAS(x) alignas(x)
-#else
-# define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
-# define _ALIGNAS(x) __attribute__((__aligned__(x)))
-#endif
-
-#if __cplusplus < 201103L
-typedef __char16_t char16_t;
-typedef __char32_t char32_t;
-#endif
-
-#if !__has_feature(cxx_exceptions)
-# define _LIBCPP_NO_EXCEPTIONS
-#endif
-
-#if !(__has_feature(cxx_strong_enums))
-#define _LIBCPP_HAS_NO_STRONG_ENUMS
-#endif
-
-#if __has_feature(cxx_attributes)
-# define _LIBCPP_NORETURN [[noreturn]]
-#else
-# define _LIBCPP_NORETURN __attribute__ ((noreturn))
-#endif
-
-#if !(__has_feature(cxx_nullptr))
-# if (__has_extension(cxx_nullptr) || __has_keyword(__nullptr)) && defined(_LIBCPP_ABI_ALWAYS_USE_CXX11_NULLPTR)
-# define nullptr __nullptr
-# else
-# define _LIBCPP_HAS_NO_NULLPTR
-# endif
-#endif
-
-// Objective-C++ features (opt-in)
-#if __has_feature(objc_arc)
-#define _LIBCPP_HAS_OBJC_ARC
-#endif
-
-#if __has_feature(objc_arc_weak)
-#define _LIBCPP_HAS_OBJC_ARC_WEAK
-#endif
-
-#if __has_extension(blocks)
-# define _LIBCPP_HAS_EXTENSION_BLOCKS
-#endif
-
-#if defined(_LIBCPP_HAS_EXTENSION_BLOCKS) && defined(__APPLE__)
-# define _LIBCPP_HAS_BLOCKS_RUNTIME
-#endif
-
-#if !(__has_feature(cxx_relaxed_constexpr))
-#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
-#endif
-
-#if !(__has_feature(cxx_variable_templates))
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-#endif
-
-#if !(__has_feature(cxx_noexcept))
-#define _LIBCPP_HAS_NO_NOEXCEPT
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_ASAN) && !__has_feature(address_sanitizer)
-#define _LIBCPP_HAS_NO_ASAN
-#endif
-
-// Allow for build-time disabling of unsigned integer sanitization
-#if !defined(_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK) && __has_attribute(no_sanitize)
-#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK __attribute__((__no_sanitize__("unsigned-integer-overflow")))
-#endif
-
-#if __has_builtin(__builtin_launder)
-#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
-#endif
-
-#if __has_builtin(__builtin_constant_p)
-#define _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P
-#endif
-
-#if !__is_identifier(__has_unique_object_representations)
-#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS
-#endif
-
-#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
-
-// Literal operators ""d and ""y are supported starting with LLVM Clang 8 and AppleClang 10.0.1
-#if (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER < 800) || \
- (defined(__apple_build_version__) && __apple_build_version__ < 10010000)
-#define _LIBCPP_HAS_NO_CXX20_CHRONO_LITERALS
-#endif
-
-#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__
-
-#elif defined(_LIBCPP_COMPILER_GCC)
-
-#define _ALIGNAS(x) __attribute__((__aligned__(x)))
-#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
-
-#define _LIBCPP_NORETURN __attribute__((noreturn))
-
-#if !__EXCEPTIONS
-# define _LIBCPP_NO_EXCEPTIONS
-#endif
-
-// Determine if GCC supports relaxed constexpr
-#if !defined(__cpp_constexpr) || __cpp_constexpr < 201304L
-#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
-#endif
-
-// GCC 5 supports variable templates
-#if !defined(__cpp_variable_templates) || __cpp_variable_templates < 201304L
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_ASAN) && !defined(__SANITIZE_ADDRESS__)
-#define _LIBCPP_HAS_NO_ASAN
-#endif
-
-#if _GNUC_VER >= 700
-#define _LIBCPP_COMPILER_HAS_BUILTIN_LAUNDER
-#define _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P
-#define _LIBCPP_HAS_UNIQUE_OBJECT_REPRESENTATIONS
-#endif
-
-#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
-
-#define _LIBCPP_DISABLE_EXTENSION_WARNING __extension__
-
-#elif defined(_LIBCPP_COMPILER_MSVC)
-
-#define _LIBCPP_TOSTRING2(x) #x
-#define _LIBCPP_TOSTRING(x) _LIBCPP_TOSTRING2(x)
-#define _LIBCPP_WARNING(x) __pragma(message(__FILE__ "(" _LIBCPP_TOSTRING(__LINE__) ") : warning note: " x))
-
-#if _MSC_VER < 1900
-#error "MSVC versions prior to Visual Studio 2015 are not supported"
-#endif
-
-#define _LIBCPP_HAS_NO_CXX14_CONSTEXPR
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-#define __alignof__ __alignof
-#define _LIBCPP_NORETURN __declspec(noreturn)
-#define _ALIGNAS(x) __declspec(align(x))
-#define _ALIGNAS_TYPE(x) alignas(x)
-
-#define _LIBCPP_WEAK
-
-#define _LIBCPP_HAS_NO_ASAN
-
-#define _LIBCPP_ALWAYS_INLINE __forceinline
-
-#define _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-#define _LIBCPP_DISABLE_EXTENSION_WARNING
-
-#elif defined(_LIBCPP_COMPILER_IBM)
-
-#define _ALIGNAS(x) __attribute__((__aligned__(x)))
-#define _ALIGNAS_TYPE(x) __attribute__((__aligned__(_LIBCPP_ALIGNOF(x))))
-#define _ATTRIBUTE(x) __attribute__((x))
-#define _LIBCPP_NORETURN __attribute__((noreturn))
-
-#define _LIBCPP_HAS_NO_UNICODE_CHARS
-#define _LIBCPP_HAS_NO_VARIABLE_TEMPLATES
-
-#if defined(_AIX)
-#define __MULTILOCALE_API
-#endif
-
-#define _LIBCPP_HAS_NO_ASAN
-
-#define _LIBCPP_ALWAYS_INLINE __attribute__ ((__always_inline__))
-
-#define _LIBCPP_HAS_NO_VECTOR_EXTENSION
-
-#define _LIBCPP_DISABLE_EXTENSION_WARNING
-
-#endif // _LIBCPP_COMPILER_[CLANG|GCC|MSVC|IBM]
-
-#if defined(_LIBCPP_OBJECT_FORMAT_COFF)
-
-#ifdef _DLL
-# define _LIBCPP_CRT_FUNC __declspec(dllimport)
-#else
-# define _LIBCPP_CRT_FUNC
-#endif
-
-#if defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_DLL_VIS
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-# define _LIBCPP_OVERRIDABLE_FUNC_VIS
-# define _LIBCPP_EXPORTED_FROM_ABI
-#elif defined(_LIBCPP_BUILDING_LIBRARY)
-# define _LIBCPP_DLL_VIS __declspec(dllexport)
-# if defined(__MINGW32__)
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-# else
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS _LIBCPP_DLL_VIS
-# endif
-# define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_DLL_VIS
-# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllexport)
-#else
-# define _LIBCPP_DLL_VIS __declspec(dllimport)
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS _LIBCPP_DLL_VIS
-# define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-# define _LIBCPP_OVERRIDABLE_FUNC_VIS
-# define _LIBCPP_EXPORTED_FROM_ABI __declspec(dllimport)
-#endif
-
-#define _LIBCPP_TYPE_VIS _LIBCPP_DLL_VIS
-#define _LIBCPP_FUNC_VIS _LIBCPP_DLL_VIS
-#define _LIBCPP_EXCEPTION_ABI _LIBCPP_DLL_VIS
-#define _LIBCPP_HIDDEN
-#define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
-#define _LIBCPP_TEMPLATE_VIS
-#define _LIBCPP_ENUM_VIS
-
-#endif // defined(_LIBCPP_OBJECT_FORMAT_COFF)
-
-#ifndef _LIBCPP_HIDDEN
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_HIDDEN __attribute__ ((__visibility__("hidden")))
-# else
-# define _LIBCPP_HIDDEN
-# endif
-#endif
-
-#ifndef _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-// The inline should be removed once PR32114 is resolved
-# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS inline _LIBCPP_HIDDEN
-# else
-# define _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_FUNC_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_FUNC_VIS __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_FUNC_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_TYPE_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_TYPE_VIS __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_TYPE_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_TEMPLATE_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# if __has_attribute(__type_visibility__)
-# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__type_visibility__("default")))
-# else
-# define _LIBCPP_TEMPLATE_VIS __attribute__ ((__visibility__("default")))
-# endif
-# else
-# define _LIBCPP_TEMPLATE_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_EXPORTED_FROM_ABI
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_EXPORTED_FROM_ABI __attribute__((__visibility__("default")))
-# else
-# define _LIBCPP_EXPORTED_FROM_ABI
-# endif
-#endif
-
-#ifndef _LIBCPP_OVERRIDABLE_FUNC_VIS
-#define _LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_FUNC_VIS
-#endif
-
-#ifndef _LIBCPP_EXCEPTION_ABI
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_EXCEPTION_ABI __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_EXCEPTION_ABI
-# endif
-#endif
-
-#ifndef _LIBCPP_ENUM_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS) && __has_attribute(__type_visibility__)
-# define _LIBCPP_ENUM_VIS __attribute__ ((__type_visibility__("default")))
-# else
-# define _LIBCPP_ENUM_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# if !defined(_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS)
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS __attribute__ ((__visibility__("default")))
-# else
-# define _LIBCPP_EXTERN_TEMPLATE_TYPE_VIS
-# endif
-#endif
-
-#ifndef _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-#define _LIBCPP_CLASS_TEMPLATE_INSTANTIATION_VIS
-#endif
-
-#if __has_attribute(internal_linkage)
-# define _LIBCPP_INTERNAL_LINKAGE __attribute__ ((internal_linkage))
-#else
-# define _LIBCPP_INTERNAL_LINKAGE _LIBCPP_ALWAYS_INLINE
-#endif
-
-#if __has_attribute(exclude_from_explicit_instantiation)
-# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION __attribute__ ((__exclude_from_explicit_instantiation__))
-#else
- // Try to approximate the effect of exclude_from_explicit_instantiation
- // (which is that entities are not assumed to be provided by explicit
- // template instantiations in the dylib) by always inlining those entities.
-# define _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION _LIBCPP_ALWAYS_INLINE
-#endif
-
-#ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU
-# ifndef _LIBCPP_HIDE_FROM_ABI_PER_TU_BY_DEFAULT
-# define _LIBCPP_HIDE_FROM_ABI_PER_TU 0
-# else
-# define _LIBCPP_HIDE_FROM_ABI_PER_TU 1
-# endif
-#endif
-
-#ifndef _LIBCPP_HIDE_FROM_ABI
-# if _LIBCPP_HIDE_FROM_ABI_PER_TU
-# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_INTERNAL_LINKAGE
-# else
-# define _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDDEN _LIBCPP_EXCLUDE_FROM_EXPLICIT_INSTANTIATION
-# endif
-#endif
-
-#ifdef _LIBCPP_BUILDING_LIBRARY
-# if _LIBCPP_ABI_VERSION > 1
-# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
-# else
-# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1
-# endif
-#else
-# define _LIBCPP_HIDE_FROM_ABI_AFTER_V1 _LIBCPP_HIDE_FROM_ABI
-#endif
-
-// Just so we can migrate to the new macros gradually.
-#define _LIBCPP_INLINE_VISIBILITY _LIBCPP_HIDE_FROM_ABI
-
-// Inline namespaces are available in Clang/GCC/MSVC regardless of C++ dialect.
-#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std { inline namespace _LIBCPP_ABI_NAMESPACE {
-#define _LIBCPP_END_NAMESPACE_STD } }
-#define _VSTD std::_LIBCPP_ABI_NAMESPACE
-_LIBCPP_BEGIN_NAMESPACE_STD _LIBCPP_END_NAMESPACE_STD
-
-#if _LIBCPP_STD_VER >= 17
-#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \
- _LIBCPP_BEGIN_NAMESPACE_STD inline namespace __fs { namespace filesystem {
-#else
-#define _LIBCPP_BEGIN_NAMESPACE_FILESYSTEM \
- _LIBCPP_BEGIN_NAMESPACE_STD namespace __fs { namespace filesystem {
-#endif
-
-#define _LIBCPP_END_NAMESPACE_FILESYSTEM \
- _LIBCPP_END_NAMESPACE_STD } }
-
-#define _VSTD_FS _VSTD::__fs::filesystem
-
-#ifndef _LIBCPP_PREFERRED_OVERLOAD
-# if __has_attribute(__enable_if__)
-# define _LIBCPP_PREFERRED_OVERLOAD __attribute__ ((__enable_if__(true, "")))
-# endif
-#endif
-
-#ifndef _LIBCPP_HAS_NO_NOEXCEPT
-# define _NOEXCEPT noexcept
-# define _NOEXCEPT_(x) noexcept(x)
-#else
-# define _NOEXCEPT throw()
-# define _NOEXCEPT_(x)
-#endif
-
-#ifdef _LIBCPP_HAS_NO_UNICODE_CHARS
-typedef unsigned short char16_t;
-typedef unsigned int char32_t;
-#endif // _LIBCPP_HAS_NO_UNICODE_CHARS
-
-#ifndef __SIZEOF_INT128__
-#define _LIBCPP_HAS_NO_INT128
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
-# define static_assert(...) _Static_assert(__VA_ARGS__)
-# define decltype(...) __decltype(__VA_ARGS__)
-#endif // _LIBCPP_CXX03_LANG
-
-#ifdef _LIBCPP_CXX03_LANG
-# define _LIBCPP_CONSTEXPR
-#else
-# define _LIBCPP_CONSTEXPR constexpr
-#endif
-
-#ifndef __cpp_consteval
-# define _LIBCPP_CONSTEVAL _LIBCPP_CONSTEXPR
-#else
-# define _LIBCPP_CONSTEVAL consteval
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
-# define _LIBCPP_DEFAULT {}
-#else
-# define _LIBCPP_DEFAULT = default;
-#endif
-
-#ifdef _LIBCPP_CXX03_LANG
-# define _LIBCPP_EQUAL_DELETE
-#else
-# define _LIBCPP_EQUAL_DELETE = delete
-#endif
-
-#ifdef __GNUC__
-# define _LIBCPP_NOALIAS __attribute__((__malloc__))
-#else
-# define _LIBCPP_NOALIAS
-#endif
-
-#if __has_feature(cxx_explicit_conversions) || defined(__IBMCPP__) || \
- (!defined(_LIBCPP_CXX03_LANG) && defined(__GNUC__)) // All supported GCC versions
-# define _LIBCPP_EXPLICIT explicit
-#else
-# define _LIBCPP_EXPLICIT
-#endif
-
-#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
-# define _LIBCPP_DECLARE_STRONG_ENUM(x) struct _LIBCPP_TYPE_VIS x { enum __lx
-# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x) \
- __lx __v_; \
- _LIBCPP_INLINE_VISIBILITY x(__lx __v) : __v_(__v) {} \
- _LIBCPP_INLINE_VISIBILITY explicit x(int __v) : __v_(static_cast<__lx>(__v)) {} \
- _LIBCPP_INLINE_VISIBILITY operator int() const {return __v_;} \
- };
-#else // _LIBCPP_HAS_NO_STRONG_ENUMS
-# define _LIBCPP_DECLARE_STRONG_ENUM(x) enum class _LIBCPP_ENUM_VIS x
-# define _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(x)
-#endif // _LIBCPP_HAS_NO_STRONG_ENUMS
-
-// _LIBCPP_DEBUG potential values:
-// - undefined: No assertions. This is the default.
-// - 0: Basic assertions
-// - 1: Basic assertions + iterator validity checks.
-#if !defined(_LIBCPP_DEBUG)
-# define _LIBCPP_DEBUG_LEVEL 0
-#elif _LIBCPP_DEBUG == 0
-# define _LIBCPP_DEBUG_LEVEL 1
-#elif _LIBCPP_DEBUG == 1
-# define _LIBCPP_DEBUG_LEVEL 2
-#else
-# error Supported values for _LIBCPP_DEBUG are 0 and 1
-#endif
-
-// _LIBCPP_DEBUG_LEVEL is always defined to one of [0, 1, 2] at this point
-#if _LIBCPP_DEBUG_LEVEL >= 1
-# define _LIBCPP_DISABLE_EXTERN_TEMPLATE
-#endif
-
-#ifdef _LIBCPP_DISABLE_EXTERN_TEMPLATE
-#define _LIBCPP_EXTERN_TEMPLATE(...)
-#endif
-
-#ifndef _LIBCPP_EXTERN_TEMPLATE
-#define _LIBCPP_EXTERN_TEMPLATE(...) extern template __VA_ARGS__;
-#endif
-
-#ifndef _LIBCPP_EXTERN_TEMPLATE_DEFINE
-#define _LIBCPP_EXTERN_TEMPLATE_DEFINE(...) template __VA_ARGS__;
-#endif
-
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(_LIBCPP_MSVCRT_LIKE) || \
- defined(__sun__) || defined(__NetBSD__) || defined(__CloudABI__)
-#define _LIBCPP_LOCALE__L_EXTENSIONS 1
-#endif
-
-#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
-// Most unix variants have catopen. These are the specific ones that don't.
-# if !defined(__BIONIC__) && !defined(_NEWLIB_VERSION)
-# define _LIBCPP_HAS_CATOPEN 1
-# endif
-#endif
-
-#ifdef __FreeBSD__
-#define _DECLARE_C99_LDBL_MATH 1
-#endif
-
-// If we are getting operator new from the MSVC CRT, then allocation overloads
-// for align_val_t were added in 19.12, aka VS 2017 version 15.3.
-#if defined(_LIBCPP_MSVCRT) && defined(_MSC_VER) && _MSC_VER < 1912
-# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
-#elif defined(_LIBCPP_ABI_VCRUNTIME) && !defined(__cpp_aligned_new)
- // We're deferring to Microsoft's STL to provide aligned new et al. We don't
- // have it unless the language feature test macro is defined.
-# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
-#elif defined(__MVS__)
-# define _LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION
-#endif
-
-#if defined(__APPLE__)
-# if !defined(__MAC_OS_X_VERSION_MIN_REQUIRED) && \
- defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
-# define __MAC_OS_X_VERSION_MIN_REQUIRED __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
-# endif
-#endif // defined(__APPLE__)
-
-#if !defined(_LIBCPP_HAS_NO_ALIGNED_ALLOCATION) && \
- (defined(_LIBCPP_HAS_NO_LIBRARY_ALIGNED_ALLOCATION) || \
- (!defined(__cpp_aligned_new) || __cpp_aligned_new < 201606))
-# define _LIBCPP_HAS_NO_ALIGNED_ALLOCATION
-#endif
-
-#if defined(__APPLE__) || defined(__FreeBSD__)
-#define _LIBCPP_HAS_DEFAULTRUNELOCALE
-#endif
-
-#if defined(__APPLE__) || defined(__FreeBSD__) || defined(__sun__)
-#define _LIBCPP_WCTYPE_IS_MASK
-#endif
-
-#if _LIBCPP_STD_VER <= 17 || !defined(__cpp_char8_t)
-#define _LIBCPP_NO_HAS_CHAR8_T
-#endif
-
-// Deprecation macros.
-//
-// Deprecations warnings are always enabled, except when users explicitly opt-out
-// by defining _LIBCPP_DISABLE_DEPRECATION_WARNINGS.
-#if !defined(_LIBCPP_DISABLE_DEPRECATION_WARNINGS)
-# if __has_attribute(deprecated)
-# define _LIBCPP_DEPRECATED __attribute__ ((deprecated))
-# elif _LIBCPP_STD_VER > 11
-# define _LIBCPP_DEPRECATED [[deprecated]]
-# else
-# define _LIBCPP_DEPRECATED
-# endif
-#else
-# define _LIBCPP_DEPRECATED
-#endif
-
-#if !defined(_LIBCPP_CXX03_LANG)
-# define _LIBCPP_DEPRECATED_IN_CXX11 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX11
-#endif
-
-#if _LIBCPP_STD_VER >= 14
-# define _LIBCPP_DEPRECATED_IN_CXX14 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX14
-#endif
-
-#if _LIBCPP_STD_VER >= 17
-# define _LIBCPP_DEPRECATED_IN_CXX17 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX17
-#endif
-
-#if _LIBCPP_STD_VER > 17
-# define _LIBCPP_DEPRECATED_IN_CXX20 _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_IN_CXX20
-#endif
-
-#if !defined(_LIBCPP_NO_HAS_CHAR8_T)
-# define _LIBCPP_DEPRECATED_WITH_CHAR8_T _LIBCPP_DEPRECATED
-#else
-# define _LIBCPP_DEPRECATED_WITH_CHAR8_T
-#endif
-
-// Macros to enter and leave a state where deprecation warnings are suppressed.
-#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH) && \
- (defined(_LIBCPP_COMPILER_CLANG) || defined(_LIBCPP_COMPILER_GCC))
-# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH \
- _Pragma("GCC diagnostic push") \
- _Pragma("GCC diagnostic ignored \"-Wdeprecated\"")
-# define _LIBCPP_SUPPRESS_DEPRECATED_POP \
- _Pragma("GCC diagnostic pop")
-#endif
-#if !defined(_LIBCPP_SUPPRESS_DEPRECATED_PUSH)
-# define _LIBCPP_SUPPRESS_DEPRECATED_PUSH
-# define _LIBCPP_SUPPRESS_DEPRECATED_POP
-#endif
-
-#if _LIBCPP_STD_VER <= 11
-# define _LIBCPP_EXPLICIT_AFTER_CXX11
-#else
-# define _LIBCPP_EXPLICIT_AFTER_CXX11 explicit
-#endif
-
-#if _LIBCPP_STD_VER > 11 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-# define _LIBCPP_CONSTEXPR_AFTER_CXX11 constexpr
-#else
-# define _LIBCPP_CONSTEXPR_AFTER_CXX11
-#endif
-
-#if _LIBCPP_STD_VER > 14 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-# define _LIBCPP_CONSTEXPR_AFTER_CXX14 constexpr
-#else
-# define _LIBCPP_CONSTEXPR_AFTER_CXX14
-#endif
-
-#if _LIBCPP_STD_VER > 17 && !defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-# define _LIBCPP_CONSTEXPR_AFTER_CXX17 constexpr
-#else
-# define _LIBCPP_CONSTEXPR_AFTER_CXX17
-#endif
-
-// The _LIBCPP_NODISCARD_ATTRIBUTE should only be used to define other
-// NODISCARD macros to the correct attribute.
-#if __has_cpp_attribute(nodiscard) || defined(_LIBCPP_COMPILER_MSVC)
-# define _LIBCPP_NODISCARD_ATTRIBUTE [[nodiscard]]
-#elif defined(_LIBCPP_COMPILER_CLANG) && !defined(_LIBCPP_CXX03_LANG)
-# define _LIBCPP_NODISCARD_ATTRIBUTE [[clang::warn_unused_result]]
-#else
-// We can't use GCC's [[gnu::warn_unused_result]] and
-// __attribute__((warn_unused_result)), because GCC does not silence them via
-// (void) cast.
-# define _LIBCPP_NODISCARD_ATTRIBUTE
-#endif
-
-// _LIBCPP_NODISCARD_EXT may be used to apply [[nodiscard]] to entities not
-// specified as such as an extension.
-#if defined(_LIBCPP_ENABLE_NODISCARD) && !defined(_LIBCPP_DISABLE_NODISCARD_EXT)
-# define _LIBCPP_NODISCARD_EXT _LIBCPP_NODISCARD_ATTRIBUTE
-#else
-# define _LIBCPP_NODISCARD_EXT
-#endif
-
-#if !defined(_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17) && \
- (_LIBCPP_STD_VER > 17 || defined(_LIBCPP_ENABLE_NODISCARD))
-# define _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_NODISCARD_ATTRIBUTE
-#else
-# define _LIBCPP_NODISCARD_AFTER_CXX17
-#endif
-
-#if _LIBCPP_STD_VER > 14 && defined(__cpp_inline_variables) && (__cpp_inline_variables >= 201606L)
-# define _LIBCPP_INLINE_VAR inline
-#else
-# define _LIBCPP_INLINE_VAR
-#endif
-
-#ifndef _LIBCPP_CONSTEXPR_IF_NODEBUG
-#if defined(_LIBCPP_DEBUG) || defined(_LIBCPP_HAS_NO_CXX14_CONSTEXPR)
-#define _LIBCPP_CONSTEXPR_IF_NODEBUG
-#else
-#define _LIBCPP_CONSTEXPR_IF_NODEBUG constexpr
-#endif
-#endif
-
-#if __has_attribute(no_destroy)
-# define _LIBCPP_NO_DESTROY __attribute__((__no_destroy__))
-#else
-# define _LIBCPP_NO_DESTROY
-#endif
-
-#ifndef _LIBCPP_HAS_NO_ASAN
-extern "C" _LIBCPP_FUNC_VIS void __sanitizer_annotate_contiguous_container(
- const void *, const void *, const void *, const void *);
-#endif
-
-// Try to find out if RTTI is disabled.
-#if defined(_LIBCPP_COMPILER_CLANG) && !__has_feature(cxx_rtti)
-# define _LIBCPP_NO_RTTI
-#elif defined(__GNUC__) && !defined(__GXX_RTTI)
-# define _LIBCPP_NO_RTTI
-#elif defined(_LIBCPP_COMPILER_MSVC) && !defined(_CPPRTTI)
-# define _LIBCPP_NO_RTTI
-#endif
-
-#ifndef _LIBCPP_WEAK
-#define _LIBCPP_WEAK __attribute__((__weak__))
-#endif
-
-// Thread API
-#if !defined(_LIBCPP_HAS_NO_THREADS) && \
- !defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \
- !defined(_LIBCPP_HAS_THREAD_API_WIN32) && \
- !defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
-# if defined(__FreeBSD__) || \
- defined(__wasi__) || \
- defined(__NetBSD__) || \
- defined(__OpenBSD__) || \
- defined(__NuttX__) || \
- defined(__linux__) || \
- defined(__GNU__) || \
- defined(__APPLE__) || \
- defined(__CloudABI__) || \
- defined(__sun__) || \
- defined(__MVS__) || \
- (defined(__MINGW32__) && __has_include(<pthread.h>))
-# define _LIBCPP_HAS_THREAD_API_PTHREAD
-# elif defined(__Fuchsia__)
- // TODO(44575): Switch to C11 thread API when possible.
-# define _LIBCPP_HAS_THREAD_API_PTHREAD
-# elif defined(_LIBCPP_WIN32API)
-# define _LIBCPP_HAS_THREAD_API_WIN32
-# else
-# error "No thread API"
-# endif // _LIBCPP_HAS_THREAD_API
-#endif // _LIBCPP_HAS_NO_THREADS
-
-#if defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-#if defined(__ANDROID__) && __ANDROID_API__ >= 30
-#define _LIBCPP_HAS_COND_CLOCKWAIT
-#elif defined(_LIBCPP_GLIBC_PREREQ)
-#if _LIBCPP_GLIBC_PREREQ(2, 30)
-#define _LIBCPP_HAS_COND_CLOCKWAIT
-#endif
-#endif
-#endif
-
-#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
-#error _LIBCPP_HAS_THREAD_API_PTHREAD may only be defined when \
- _LIBCPP_HAS_NO_THREADS is not defined.
-#endif
-
-#if defined(_LIBCPP_HAS_NO_THREADS) && defined(_LIBCPP_HAS_THREAD_API_EXTERNAL)
-#error _LIBCPP_HAS_THREAD_API_EXTERNAL may not be defined when \
- _LIBCPP_HAS_NO_THREADS is defined.
-#endif
-
-#if defined(_LIBCPP_HAS_NO_MONOTONIC_CLOCK) && !defined(_LIBCPP_HAS_NO_THREADS)
-#error _LIBCPP_HAS_NO_MONOTONIC_CLOCK may only be defined when \
- _LIBCPP_HAS_NO_THREADS is defined.
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_THREADS) && !defined(__STDCPP_THREADS__)
-#define __STDCPP_THREADS__ 1
-#endif
-
-// The glibc and Bionic implementation of pthreads implements
-// pthread_mutex_destroy as nop for regular mutexes. Additionally, Win32
-// mutexes have no destroy mechanism.
-//
-// This optimization can't be performed on Apple platforms, where
-// pthread_mutex_destroy can allow the kernel to release resources.
-// See https://llvm.org/D64298 for details.
-//
-// TODO(EricWF): Enable this optimization on Bionic after speaking to their
-// respective stakeholders.
-#if (defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && defined(__GLIBC__)) \
- || (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) \
- || defined(_LIBCPP_HAS_THREAD_API_WIN32)
-# define _LIBCPP_HAS_TRIVIAL_MUTEX_DESTRUCTION
-#endif
-
-// Destroying a condvar is a nop on Windows.
-//
-// This optimization can't be performed on Apple platforms, where
-// pthread_cond_destroy can allow the kernel to release resources.
-// See https://llvm.org/D64298 for details.
-//
-// TODO(EricWF): This is potentially true for some pthread implementations
-// as well.
-#if (defined(_LIBCPP_HAS_THREAD_API_C11) && defined(__Fuchsia__)) || \
- defined(_LIBCPP_HAS_THREAD_API_WIN32)
-# define _LIBCPP_HAS_TRIVIAL_CONDVAR_DESTRUCTION
-#endif
-
-// Systems that use capability-based security (FreeBSD with Capsicum,
-// Nuxi CloudABI) may only provide local filesystem access (using *at()).
-// Functions like open(), rename(), unlink() and stat() should not be
-// used, as they attempt to access the global filesystem namespace.
-#ifdef __CloudABI__
-#define _LIBCPP_HAS_NO_GLOBAL_FILESYSTEM_NAMESPACE
-#endif
-
-// CloudABI is intended for running networked services. Processes do not
-// have standard input and output channels.
-#ifdef __CloudABI__
-#define _LIBCPP_HAS_NO_STDIN
-#define _LIBCPP_HAS_NO_STDOUT
-#endif
-
-// Some systems do not provide gets() in their C library, for security reasons.
-#ifndef _LIBCPP_C_HAS_NO_GETS
-# if defined(_LIBCPP_MSVCRT) || \
- (defined(__FreeBSD_version) && __FreeBSD_version >= 1300043) || \
- defined(__OpenBSD__)
-# define _LIBCPP_C_HAS_NO_GETS
-# endif
-#endif
-
-#if defined(__BIONIC__) || defined(__CloudABI__) || defined(__NuttX__) || \
- defined(__Fuchsia__) || defined(__wasi__) || defined(_LIBCPP_HAS_MUSL_LIBC) || \
- defined(__MVS__) || defined(__OpenBSD__)
-#define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE
-#endif
-
-// Thread-unsafe functions such as strtok() and localtime()
-// are not available.
-#ifdef __CloudABI__
-#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS
-#endif
-
-#if __has_feature(cxx_atomic) || __has_extension(c_atomic) || __has_keyword(_Atomic)
-# define _LIBCPP_HAS_C_ATOMIC_IMP
-#elif defined(_LIBCPP_COMPILER_GCC)
-# define _LIBCPP_HAS_GCC_ATOMIC_IMP
-#endif
-
-#if (!defined(_LIBCPP_HAS_C_ATOMIC_IMP) && \
- !defined(_LIBCPP_HAS_GCC_ATOMIC_IMP) && \
- !defined(_LIBCPP_HAS_EXTERNAL_ATOMIC_IMP)) \
- || defined(_LIBCPP_HAS_NO_THREADS)
-# define _LIBCPP_HAS_NO_ATOMIC_HEADER
-#else
-# ifndef _LIBCPP_ATOMIC_FLAG_TYPE
-# define _LIBCPP_ATOMIC_FLAG_TYPE bool
-# endif
-# ifdef _LIBCPP_FREESTANDING
-# define _LIBCPP_ATOMIC_ONLY_USE_BUILTINS
-# endif
-#endif
-
-#ifndef _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-#define _LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-#endif
-
-#if defined(_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS)
-# if defined(__clang__) && __has_attribute(acquire_capability)
-// Work around the attribute handling in clang. When both __declspec and
-// __attribute__ are present, the processing goes awry preventing the definition
-// of the types.
-# if !defined(_LIBCPP_OBJECT_FORMAT_COFF)
-# define _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
-# endif
-# endif
-#endif
-
-#ifndef _LIBCPP_THREAD_SAFETY_ANNOTATION
-# ifdef _LIBCPP_HAS_THREAD_SAFETY_ANNOTATIONS
-# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x) __attribute__((x))
-# else
-# define _LIBCPP_THREAD_SAFETY_ANNOTATION(x)
-# endif
-#endif // _LIBCPP_THREAD_SAFETY_ANNOTATION
-
-#if __has_attribute(require_constant_initialization)
-# define _LIBCPP_SAFE_STATIC __attribute__((__require_constant_initialization__))
-#else
-# define _LIBCPP_SAFE_STATIC
-#endif
-
-#if !__has_builtin(__builtin_addressof) && _GNUC_VER < 700
-#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
-#endif
-
-#if !__has_builtin(__builtin_is_constant_evaluated) && _GNUC_VER < 900
-#define _LIBCPP_HAS_NO_BUILTIN_IS_CONSTANT_EVALUATED
-#endif
-
-#if !defined(_LIBCPP_HAS_NO_OFF_T_FUNCTIONS)
-# if defined(_LIBCPP_MSVCRT) || defined(_NEWLIB_VERSION)
-# define _LIBCPP_HAS_NO_OFF_T_FUNCTIONS
-# endif
-#endif
-
-#if __has_attribute(diagnose_if) && !defined(_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS)
-# define _LIBCPP_DIAGNOSE_WARNING(...) \
- __attribute__((diagnose_if(__VA_ARGS__, "warning")))
-# define _LIBCPP_DIAGNOSE_ERROR(...) \
- __attribute__((diagnose_if(__VA_ARGS__, "error")))
-#else
-# define _LIBCPP_DIAGNOSE_WARNING(...)
-# define _LIBCPP_DIAGNOSE_ERROR(...)
-#endif
-
-// Use a function like macro to imply that it must be followed by a semicolon
-#if __cplusplus > 201402L && __has_cpp_attribute(fallthrough)
-# define _LIBCPP_FALLTHROUGH() [[fallthrough]]
-#elif __has_cpp_attribute(clang::fallthrough)
-# define _LIBCPP_FALLTHROUGH() [[clang::fallthrough]]
-#elif __has_attribute(fallthrough) || _GNUC_VER >= 700
-# define _LIBCPP_FALLTHROUGH() __attribute__((__fallthrough__))
-#else
-# define _LIBCPP_FALLTHROUGH() ((void)0)
-#endif
-
-#if __has_attribute(__nodebug__)
-#define _LIBCPP_NODEBUG __attribute__((__nodebug__))
-#else
-#define _LIBCPP_NODEBUG
-#endif
-
-#ifndef _LIBCPP_NODEBUG_TYPE
-#if __has_attribute(__nodebug__) && \
- (defined(_LIBCPP_CLANG_VER) && _LIBCPP_CLANG_VER >= 900)
-#define _LIBCPP_NODEBUG_TYPE __attribute__((nodebug))
-#else
-#define _LIBCPP_NODEBUG_TYPE
-#endif
-#endif // !defined(_LIBCPP_NODEBUG_TYPE)
-
-#if __has_attribute(__preferred_name__)
-#define _LIBCPP_PREFERRED_NAME(x) __attribute__((__preferred_name__(x)))
-#else
-#define _LIBCPP_PREFERRED_NAME(x)
-#endif
-
-#if defined(_LIBCPP_ABI_MICROSOFT) && \
- (defined(_LIBCPP_COMPILER_MSVC) || __has_declspec_attribute(empty_bases))
-# define _LIBCPP_DECLSPEC_EMPTY_BASES __declspec(empty_bases)
-#else
-# define _LIBCPP_DECLSPEC_EMPTY_BASES
-#endif
-
-#if defined(_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES)
-#define _LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR
-#define _LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS
-#define _LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE
-#define _LIBCPP_ENABLE_CXX17_REMOVED_BINDERS
-#endif // _LIBCPP_ENABLE_CXX17_REMOVED_FEATURES
-
-#if !defined(__cpp_deduction_guides) || __cpp_deduction_guides < 201611
-#define _LIBCPP_HAS_NO_DEDUCTION_GUIDES
-#endif
-
-#if !__has_keyword(__is_aggregate) && (_GNUC_VER_NEW < 7001)
-#define _LIBCPP_HAS_NO_IS_AGGREGATE
-#endif
-
-#if !defined(__cpp_coroutines) || __cpp_coroutines < 201703L
-#define _LIBCPP_HAS_NO_COROUTINES
-#endif
-
-#if !defined(__cpp_impl_three_way_comparison) || __cpp_impl_three_way_comparison < 201907L
-#define _LIBCPP_HAS_NO_SPACESHIP_OPERATOR
-#endif
-
-#if defined(_LIBCPP_COMPILER_IBM)
-#define _LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO
-#endif
-
-#if defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
-# define _LIBCPP_PUSH_MACROS
-# define _LIBCPP_POP_MACROS
-#else
- // Don't warn about macro conflicts when we can restore them at the
- // end of the header.
-# ifndef _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS
-# define _LIBCPP_DISABLE_MACRO_CONFLICT_WARNINGS
-# endif
-# if defined(_LIBCPP_COMPILER_MSVC)
-# define _LIBCPP_PUSH_MACROS \
- __pragma(push_macro("min")) \
- __pragma(push_macro("max"))
-# define _LIBCPP_POP_MACROS \
- __pragma(pop_macro("min")) \
- __pragma(pop_macro("max"))
-# else
-# define _LIBCPP_PUSH_MACROS \
- _Pragma("push_macro(\"min\")") \
- _Pragma("push_macro(\"max\")")
-# define _LIBCPP_POP_MACROS \
- _Pragma("pop_macro(\"min\")") \
- _Pragma("pop_macro(\"max\")")
-# endif
-#endif // defined(_LIBCPP_HAS_NO_PRAGMA_PUSH_POP_MACRO)
-
-#ifndef _LIBCPP_NO_AUTO_LINK
-# if defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY)
-# if defined(_DLL)
-# pragma comment(lib, "c++.lib")
-# else
-# pragma comment(lib, "libc++.lib")
-# endif
-# endif // defined(_LIBCPP_ABI_MICROSOFT) && !defined(_LIBCPP_BUILDING_LIBRARY)
-#endif // _LIBCPP_NO_AUTO_LINK
-
-#define _LIBCPP_UNUSED_VAR(x) ((void)(x))
-
-// Configures the fopen close-on-exec mode character, if any. This string will
-// be appended to any mode string used by fstream for fopen/fdopen.
-//
-// Not all platforms support this, but it helps avoid fd-leaks on platforms that
-// do.
-#if defined(__BIONIC__)
-# define _LIBCPP_FOPEN_CLOEXEC_MODE "e"
-#else
-# define _LIBCPP_FOPEN_CLOEXEC_MODE
-#endif
-
-#ifdef _LIBCPP_COMPILER_HAS_BUILTIN_CONSTANT_P
-#define _LIBCPP_BUILTIN_CONSTANT_P(x) __builtin_constant_p(x)
-#else
-#define _LIBCPP_BUILTIN_CONSTANT_P(x) false
-#endif
-
-// Support for _FILE_OFFSET_BITS=64 landed gradually in Android, so the full set
-// of functions used in cstdio may not be available for low API levels when
-// using 64-bit file offsets on LP32.
-#if defined(__BIONIC__) && defined(__USE_FILE_OFFSET64) && __ANDROID_API__ < 24
-#define _LIBCPP_HAS_NO_FGETPOS_FSETPOS
-#endif
-
-#if __has_attribute(init_priority)
-# define _LIBCPP_INIT_PRIORITY_MAX __attribute__((init_priority(101)))
-#else
-# define _LIBCPP_INIT_PRIORITY_MAX
-#endif
-
-#endif // __cplusplus
-
-#endif // _LIBCPP_CONFIG
diff --git a/clang-r416183d/include/c++/v1/__cxxabi_config.h b/clang-r416183d/include/c++/v1/__cxxabi_config.h
deleted file mode 100644
index cffedb8..0000000
--- a/clang-r416183d/include/c++/v1/__cxxabi_config.h
+++ /dev/null
@@ -1,100 +0,0 @@
-//===-------------------------- __cxxabi_config.h -------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef ____CXXABI_CONFIG_H
-#define ____CXXABI_CONFIG_H
-
-#if defined(__arm__) && !defined(__USING_SJLJ_EXCEPTIONS__) && \
- !defined(__ARM_DWARF_EH__)
-#define _LIBCXXABI_ARM_EHABI
-#endif
-
-#if !defined(__has_attribute)
-#define __has_attribute(_attribute_) 0
-#endif
-
-#if defined(__clang__)
-# define _LIBCXXABI_COMPILER_CLANG
-# ifndef __apple_build_version__
-# define _LIBCXXABI_CLANG_VER (__clang_major__ * 100 + __clang_minor__)
-# endif
-#elif defined(__GNUC__)
-# define _LIBCXXABI_COMPILER_GCC
-#elif defined(_MSC_VER)
-# define _LIBCXXABI_COMPILER_MSVC
-#elif defined(__IBMCPP__)
-# define _LIBCXXABI_COMPILER_IBM
-#endif
-
-#if defined(_WIN32)
- #if defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
- #define _LIBCXXABI_HIDDEN
- #define _LIBCXXABI_DATA_VIS
- #define _LIBCXXABI_FUNC_VIS
- #define _LIBCXXABI_TYPE_VIS
- #elif defined(_LIBCXXABI_BUILDING_LIBRARY)
- #define _LIBCXXABI_HIDDEN
- #define _LIBCXXABI_DATA_VIS __declspec(dllexport)
- #define _LIBCXXABI_FUNC_VIS __declspec(dllexport)
- #define _LIBCXXABI_TYPE_VIS __declspec(dllexport)
- #else
- #define _LIBCXXABI_HIDDEN
- #define _LIBCXXABI_DATA_VIS __declspec(dllimport)
- #define _LIBCXXABI_FUNC_VIS __declspec(dllimport)
- #define _LIBCXXABI_TYPE_VIS __declspec(dllimport)
- #endif
-#else
- #if !defined(_LIBCXXABI_DISABLE_VISIBILITY_ANNOTATIONS)
- #define _LIBCXXABI_HIDDEN __attribute__((__visibility__("hidden")))
- #define _LIBCXXABI_DATA_VIS __attribute__((__visibility__("default")))
- #define _LIBCXXABI_FUNC_VIS __attribute__((__visibility__("default")))
- #if __has_attribute(__type_visibility__)
- #define _LIBCXXABI_TYPE_VIS __attribute__((__type_visibility__("default")))
- #else
- #define _LIBCXXABI_TYPE_VIS __attribute__((__visibility__("default")))
- #endif
- #else
- #define _LIBCXXABI_HIDDEN
- #define _LIBCXXABI_DATA_VIS
- #define _LIBCXXABI_FUNC_VIS
- #define _LIBCXXABI_TYPE_VIS
- #endif
-#endif
-
-#if defined(_LIBCXXABI_COMPILER_MSVC)
-#define _LIBCXXABI_WEAK
-#else
-#define _LIBCXXABI_WEAK __attribute__((__weak__))
-#endif
-
-#if defined(__clang__)
-#define _LIBCXXABI_COMPILER_CLANG
-#elif defined(__GNUC__)
-#define _LIBCXXABI_COMPILER_GCC
-#endif
-
-#if __has_attribute(__no_sanitize__) && defined(_LIBCXXABI_COMPILER_CLANG)
-#define _LIBCXXABI_NO_CFI __attribute__((__no_sanitize__("cfi")))
-#else
-#define _LIBCXXABI_NO_CFI
-#endif
-
-// wasm32 follows the arm32 ABI convention of using 32-bit guard.
-#if defined(__arm__) || defined(__wasm32__) || defined(__ARM64_ARCH_8_32__)
-# define _LIBCXXABI_GUARD_ABI_ARM
-#endif
-
-#if defined(_LIBCXXABI_COMPILER_CLANG)
-# if !__has_feature(cxx_exceptions)
-# define _LIBCXXABI_NO_EXCEPTIONS
-# endif
-#elif defined(_LIBCXXABI_COMPILER_GCC) && !__EXCEPTIONS
-# define _LIBCXXABI_NO_EXCEPTIONS
-#endif
-
-#endif // ____CXXABI_CONFIG_H
diff --git a/clang-r416183d/include/c++/v1/__debug b/clang-r416183d/include/c++/v1/__debug
deleted file mode 100644
index 7b5bfb3..0000000
--- a/clang-r416183d/include/c++/v1/__debug
+++ /dev/null
@@ -1,273 +0,0 @@
-// -*- C++ -*-
-//===--------------------------- __debug ----------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_DEBUG_H
-#define _LIBCPP_DEBUG_H
-
-#include <__config>
-#include <iosfwd>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-#if defined(_LIBCPP_HAS_NO_NULLPTR)
-# include <cstddef>
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL >= 1 || defined(_LIBCPP_BUILDING_LIBRARY)
-# include <cstdlib>
-# include <cstdio>
-# include <cstddef>
-#endif
-
-#if _LIBCPP_DEBUG_LEVEL == 0
-# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0)
-# define _LIBCPP_ASSERT_IMPL(x, m) ((void)0)
-#elif _LIBCPP_DEBUG_LEVEL == 1
-# define _LIBCPP_DEBUG_ASSERT(x, m) ((void)0)
-# define _LIBCPP_ASSERT_IMPL(x, m) ((x) ? (void)0 : _VSTD::__libcpp_debug_function(_VSTD::__libcpp_debug_info(__FILE__, __LINE__, #x, m)))
-#elif _LIBCPP_DEBUG_LEVEL == 2
-# define _LIBCPP_DEBUG_ASSERT(x, m) _LIBCPP_ASSERT(x, m)
-# define _LIBCPP_ASSERT_IMPL(x, m) ((x) ? (void)0 : _VSTD::__libcpp_debug_function(_VSTD::__libcpp_debug_info(__FILE__, __LINE__, #x, m)))
-#else
-# error _LIBCPP_DEBUG_LEVEL must be one of 0, 1, 2
-#endif
-
-#if !defined(_LIBCPP_ASSERT)
-# define _LIBCPP_ASSERT(x, m) _LIBCPP_ASSERT_IMPL(x, m)
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-struct _LIBCPP_TEMPLATE_VIS __libcpp_debug_info {
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- __libcpp_debug_info()
- : __file_(nullptr), __line_(-1), __pred_(nullptr), __msg_(nullptr) {}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
- __libcpp_debug_info(const char* __f, int __l, const char* __p, const char* __m)
- : __file_(__f), __line_(__l), __pred_(__p), __msg_(__m) {}
-
- _LIBCPP_FUNC_VIS string what() const;
-
- const char* __file_;
- int __line_;
- const char* __pred_;
- const char* __msg_;
-};
-
-/// __libcpp_debug_function_type - The type of the assertion failure handler.
-typedef void(*__libcpp_debug_function_type)(__libcpp_debug_info const&);
-
-/// __libcpp_debug_function - The handler function called when a _LIBCPP_ASSERT
-/// fails.
-extern _LIBCPP_EXPORTED_FROM_ABI __libcpp_debug_function_type __libcpp_debug_function;
-
-/// __libcpp_abort_debug_function - A debug handler that aborts when called.
-_LIBCPP_NORETURN _LIBCPP_FUNC_VIS
-void __libcpp_abort_debug_function(__libcpp_debug_info const&);
-
-/// __libcpp_set_debug_function - Set the debug handler to the specified
-/// function.
-_LIBCPP_FUNC_VIS
-bool __libcpp_set_debug_function(__libcpp_debug_function_type __func);
-
-#if _LIBCPP_DEBUG_LEVEL == 2 || defined(_LIBCPP_BUILDING_LIBRARY)
-
-struct _LIBCPP_TYPE_VIS __c_node;
-
-struct _LIBCPP_TYPE_VIS __i_node
-{
- void* __i_;
- __i_node* __next_;
- __c_node* __c_;
-
-#ifndef _LIBCPP_CXX03_LANG
- __i_node(const __i_node&) = delete;
- __i_node& operator=(const __i_node&) = delete;
-#else
-private:
- __i_node(const __i_node&);
- __i_node& operator=(const __i_node&);
-public:
-#endif
- _LIBCPP_INLINE_VISIBILITY
- __i_node(void* __i, __i_node* __next, __c_node* __c)
- : __i_(__i), __next_(__next), __c_(__c) {}
- ~__i_node();
-};
-
-struct _LIBCPP_TYPE_VIS __c_node
-{
- void* __c_;
- __c_node* __next_;
- __i_node** beg_;
- __i_node** end_;
- __i_node** cap_;
-
-#ifndef _LIBCPP_CXX03_LANG
- __c_node(const __c_node&) = delete;
- __c_node& operator=(const __c_node&) = delete;
-#else
-private:
- __c_node(const __c_node&);
- __c_node& operator=(const __c_node&);
-public:
-#endif
- _LIBCPP_INLINE_VISIBILITY
- __c_node(void* __c, __c_node* __next)
- : __c_(__c), __next_(__next), beg_(nullptr), end_(nullptr), cap_(nullptr) {}
- virtual ~__c_node();
-
- virtual bool __dereferenceable(const void*) const = 0;
- virtual bool __decrementable(const void*) const = 0;
- virtual bool __addable(const void*, ptrdiff_t) const = 0;
- virtual bool __subscriptable(const void*, ptrdiff_t) const = 0;
-
- void __add(__i_node* __i);
- _LIBCPP_HIDDEN void __remove(__i_node* __i);
-};
-
-template <class _Cont>
-struct _C_node
- : public __c_node
-{
- _C_node(void* __c, __c_node* __n)
- : __c_node(__c, __n) {}
-
- virtual bool __dereferenceable(const void*) const;
- virtual bool __decrementable(const void*) const;
- virtual bool __addable(const void*, ptrdiff_t) const;
- virtual bool __subscriptable(const void*, ptrdiff_t) const;
-};
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__dereferenceable(const void* __i) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__dereferenceable(__j);
-}
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__decrementable(const void* __i) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__decrementable(__j);
-}
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__addable(const void* __i, ptrdiff_t __n) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__addable(__j, __n);
-}
-
-template <class _Cont>
-inline bool
-_C_node<_Cont>::__subscriptable(const void* __i, ptrdiff_t __n) const
-{
- typedef typename _Cont::const_iterator iterator;
- const iterator* __j = static_cast<const iterator*>(__i);
- _Cont* _Cp = static_cast<_Cont*>(__c_);
- return _Cp->__subscriptable(__j, __n);
-}
-
-class _LIBCPP_TYPE_VIS __libcpp_db
-{
- __c_node** __cbeg_;
- __c_node** __cend_;
- size_t __csz_;
- __i_node** __ibeg_;
- __i_node** __iend_;
- size_t __isz_;
-
- __libcpp_db();
-public:
-#ifndef _LIBCPP_CXX03_LANG
- __libcpp_db(const __libcpp_db&) = delete;
- __libcpp_db& operator=(const __libcpp_db&) = delete;
-#else
-private:
- __libcpp_db(const __libcpp_db&);
- __libcpp_db& operator=(const __libcpp_db&);
-public:
-#endif
- ~__libcpp_db();
-
- class __db_c_iterator;
- class __db_c_const_iterator;
- class __db_i_iterator;
- class __db_i_const_iterator;
-
- __db_c_const_iterator __c_end() const;
- __db_i_const_iterator __i_end() const;
-
- typedef __c_node*(_InsertConstruct)(void*, void*, __c_node*);
-
- template <class _Cont>
- _LIBCPP_INLINE_VISIBILITY static __c_node* __create_C_node(void *__mem, void *__c, __c_node *__next) {
- return ::new (__mem) _C_node<_Cont>(__c, __next);
- }
-
- template <class _Cont>
- _LIBCPP_INLINE_VISIBILITY
- void __insert_c(_Cont* __c)
- {
- __insert_c(static_cast<void*>(__c), &__create_C_node<_Cont>);
- }
-
- void __insert_i(void* __i);
- void __insert_c(void* __c, _InsertConstruct* __fn);
- void __erase_c(void* __c);
-
- void __insert_ic(void* __i, const void* __c);
- void __iterator_copy(void* __i, const void* __i0);
- void __erase_i(void* __i);
-
- void* __find_c_from_i(void* __i) const;
- void __invalidate_all(void* __c);
- __c_node* __find_c_and_lock(void* __c) const;
- __c_node* __find_c(void* __c) const;
- void unlock() const;
-
- void swap(void* __c1, void* __c2);
-
-
- bool __dereferenceable(const void* __i) const;
- bool __decrementable(const void* __i) const;
- bool __addable(const void* __i, ptrdiff_t __n) const;
- bool __subscriptable(const void* __i, ptrdiff_t __n) const;
- bool __less_than_comparable(const void* __i, const void* __j) const;
-private:
- _LIBCPP_HIDDEN
- __i_node* __insert_iterator(void* __i);
- _LIBCPP_HIDDEN
- __i_node* __find_iterator(const void* __i) const;
-
- friend _LIBCPP_FUNC_VIS __libcpp_db* __get_db();
-};
-
-_LIBCPP_FUNC_VIS __libcpp_db* __get_db();
-_LIBCPP_FUNC_VIS const __libcpp_db* __get_const_db();
-
-
-#endif // _LIBCPP_DEBUG_LEVEL == 2 || defined(_LIBCPP_BUILDING_LIBRARY)
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_DEBUG_H
diff --git a/clang-r416183d/include/c++/v1/__errc b/clang-r416183d/include/c++/v1/__errc
deleted file mode 100644
index a8ad29f..0000000
--- a/clang-r416183d/include/c++/v1/__errc
+++ /dev/null
@@ -1,217 +0,0 @@
-// -*- C++ -*-
-//===---------------------------- __errc ----------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP___ERRC
-#define _LIBCPP___ERRC
-
-/*
- system_error synopsis
-
-namespace std
-{
-
-enum class errc
-{
- address_family_not_supported, // EAFNOSUPPORT
- address_in_use, // EADDRINUSE
- address_not_available, // EADDRNOTAVAIL
- already_connected, // EISCONN
- argument_list_too_long, // E2BIG
- argument_out_of_domain, // EDOM
- bad_address, // EFAULT
- bad_file_descriptor, // EBADF
- bad_message, // EBADMSG
- broken_pipe, // EPIPE
- connection_aborted, // ECONNABORTED
- connection_already_in_progress, // EALREADY
- connection_refused, // ECONNREFUSED
- connection_reset, // ECONNRESET
- cross_device_link, // EXDEV
- destination_address_required, // EDESTADDRREQ
- device_or_resource_busy, // EBUSY
- directory_not_empty, // ENOTEMPTY
- executable_format_error, // ENOEXEC
- file_exists, // EEXIST
- file_too_large, // EFBIG
- filename_too_long, // ENAMETOOLONG
- function_not_supported, // ENOSYS
- host_unreachable, // EHOSTUNREACH
- identifier_removed, // EIDRM
- illegal_byte_sequence, // EILSEQ
- inappropriate_io_control_operation, // ENOTTY
- interrupted, // EINTR
- invalid_argument, // EINVAL
- invalid_seek, // ESPIPE
- io_error, // EIO
- is_a_directory, // EISDIR
- message_size, // EMSGSIZE
- network_down, // ENETDOWN
- network_reset, // ENETRESET
- network_unreachable, // ENETUNREACH
- no_buffer_space, // ENOBUFS
- no_child_process, // ECHILD
- no_link, // ENOLINK
- no_lock_available, // ENOLCK
- no_message_available, // ENODATA
- no_message, // ENOMSG
- no_protocol_option, // ENOPROTOOPT
- no_space_on_device, // ENOSPC
- no_stream_resources, // ENOSR
- no_such_device_or_address, // ENXIO
- no_such_device, // ENODEV
- no_such_file_or_directory, // ENOENT
- no_such_process, // ESRCH
- not_a_directory, // ENOTDIR
- not_a_socket, // ENOTSOCK
- not_a_stream, // ENOSTR
- not_connected, // ENOTCONN
- not_enough_memory, // ENOMEM
- not_supported, // ENOTSUP
- operation_canceled, // ECANCELED
- operation_in_progress, // EINPROGRESS
- operation_not_permitted, // EPERM
- operation_not_supported, // EOPNOTSUPP
- operation_would_block, // EWOULDBLOCK
- owner_dead, // EOWNERDEAD
- permission_denied, // EACCES
- protocol_error, // EPROTO
- protocol_not_supported, // EPROTONOSUPPORT
- read_only_file_system, // EROFS
- resource_deadlock_would_occur, // EDEADLK
- resource_unavailable_try_again, // EAGAIN
- result_out_of_range, // ERANGE
- state_not_recoverable, // ENOTRECOVERABLE
- stream_timeout, // ETIME
- text_file_busy, // ETXTBSY
- timed_out, // ETIMEDOUT
- too_many_files_open_in_system, // ENFILE
- too_many_files_open, // EMFILE
- too_many_links, // EMLINK
- too_many_symbolic_link_levels, // ELOOP
- value_too_large, // EOVERFLOW
- wrong_protocol_type // EPROTOTYPE
-};
-
-*/
-
-#include <__config>
-#include <cerrno>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-// Some error codes are not present on all platforms, so we provide equivalents
-// for them:
-
-//enum class errc
-_LIBCPP_DECLARE_STRONG_ENUM(errc)
-{
- address_family_not_supported = EAFNOSUPPORT,
- address_in_use = EADDRINUSE,
- address_not_available = EADDRNOTAVAIL,
- already_connected = EISCONN,
- argument_list_too_long = E2BIG,
- argument_out_of_domain = EDOM,
- bad_address = EFAULT,
- bad_file_descriptor = EBADF,
- bad_message = EBADMSG,
- broken_pipe = EPIPE,
- connection_aborted = ECONNABORTED,
- connection_already_in_progress = EALREADY,
- connection_refused = ECONNREFUSED,
- connection_reset = ECONNRESET,
- cross_device_link = EXDEV,
- destination_address_required = EDESTADDRREQ,
- device_or_resource_busy = EBUSY,
- directory_not_empty = ENOTEMPTY,
- executable_format_error = ENOEXEC,
- file_exists = EEXIST,
- file_too_large = EFBIG,
- filename_too_long = ENAMETOOLONG,
- function_not_supported = ENOSYS,
- host_unreachable = EHOSTUNREACH,
- identifier_removed = EIDRM,
- illegal_byte_sequence = EILSEQ,
- inappropriate_io_control_operation = ENOTTY,
- interrupted = EINTR,
- invalid_argument = EINVAL,
- invalid_seek = ESPIPE,
- io_error = EIO,
- is_a_directory = EISDIR,
- message_size = EMSGSIZE,
- network_down = ENETDOWN,
- network_reset = ENETRESET,
- network_unreachable = ENETUNREACH,
- no_buffer_space = ENOBUFS,
- no_child_process = ECHILD,
- no_link = ENOLINK,
- no_lock_available = ENOLCK,
-#ifdef ENODATA
- no_message_available = ENODATA,
-#else
- no_message_available = ENOMSG,
-#endif
- no_message = ENOMSG,
- no_protocol_option = ENOPROTOOPT,
- no_space_on_device = ENOSPC,
-#ifdef ENOSR
- no_stream_resources = ENOSR,
-#else
- no_stream_resources = ENOMEM,
-#endif
- no_such_device_or_address = ENXIO,
- no_such_device = ENODEV,
- no_such_file_or_directory = ENOENT,
- no_such_process = ESRCH,
- not_a_directory = ENOTDIR,
- not_a_socket = ENOTSOCK,
-#ifdef ENOSTR
- not_a_stream = ENOSTR,
-#else
- not_a_stream = EINVAL,
-#endif
- not_connected = ENOTCONN,
- not_enough_memory = ENOMEM,
- not_supported = ENOTSUP,
- operation_canceled = ECANCELED,
- operation_in_progress = EINPROGRESS,
- operation_not_permitted = EPERM,
- operation_not_supported = EOPNOTSUPP,
- operation_would_block = EWOULDBLOCK,
- owner_dead = EOWNERDEAD,
- permission_denied = EACCES,
- protocol_error = EPROTO,
- protocol_not_supported = EPROTONOSUPPORT,
- read_only_file_system = EROFS,
- resource_deadlock_would_occur = EDEADLK,
- resource_unavailable_try_again = EAGAIN,
- result_out_of_range = ERANGE,
- state_not_recoverable = ENOTRECOVERABLE,
-#ifdef ETIME
- stream_timeout = ETIME,
-#else
- stream_timeout = ETIMEDOUT,
-#endif
- text_file_busy = ETXTBSY,
- timed_out = ETIMEDOUT,
- too_many_files_open_in_system = ENFILE,
- too_many_files_open = EMFILE,
- too_many_links = EMLINK,
- too_many_symbolic_link_levels = ELOOP,
- value_too_large = EOVERFLOW,
- wrong_protocol_type = EPROTOTYPE
-};
-_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(errc)
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP___ERRC
diff --git a/clang-r416183d/include/c++/v1/__functional_03 b/clang-r416183d/include/c++/v1/__functional_03
deleted file mode 100644
index 9616480..0000000
--- a/clang-r416183d/include/c++/v1/__functional_03
+++ /dev/null
@@ -1,1591 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL_03
-#define _LIBCPP_FUNCTIONAL_03
-
-// manual variadic expansion for <functional>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-namespace __function {
-
-template<class _Fp> class __base;
-
-template<class _Rp>
-class __base<_Rp()>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()() = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0>
-class __base<_Rp(_A0)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_A0) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1>
-class __base<_Rp(_A0, _A1)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_A0, _A1) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1, class _A2>
-class __base<_Rp(_A0, _A1, _A2)>
-{
- __base(const __base&);
- __base& operator=(const __base&);
-public:
- __base() {}
- virtual ~__base() {}
- virtual __base* __clone() const = 0;
- virtual void __clone(__base*) const = 0;
- virtual void destroy() = 0;
- virtual void destroy_deallocate() = 0;
- virtual _Rp operator()(_A0, _A1, _A2) = 0;
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const = 0;
- virtual const std::type_info& target_type() const = 0;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _FD, class _Alloc, class _FB> class __func;
-
-template<class _Fp, class _Alloc, class _Rp>
-class __func<_Fp, _Alloc, _Rp()>
- : public __base<_Rp()>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {}
- explicit __func(_Fp __f, _Alloc __a) : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp()>* __clone() const;
- virtual void __clone(__base<_Rp()>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()();
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp>
-__base<_Rp()>*
-__func<_Fp, _Alloc, _Rp()>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-void
-__func<_Fp, _Alloc, _Rp()>::__clone(__base<_Rp()>* __p) const
-{
- ::new ((void*)__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-void
-__func<_Fp, _Alloc, _Rp()>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-void
-__func<_Fp, _Alloc, _Rp()>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-_Rp
-__func<_Fp, _Alloc, _Rp()>::operator()()
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first());
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp>
-const void*
-__func<_Fp, _Alloc, _Rp()>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp()>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-class __func<_Fp, _Alloc, _Rp(_A0)>
- : public __base<_Rp(_A0)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {}
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp(_A0)>* __clone() const;
- virtual void __clone(__base<_Rp(_A0)>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_A0);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-__base<_Rp(_A0)>*
-__func<_Fp, _Alloc, _Rp(_A0)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-void
-__func<_Fp, _Alloc, _Rp(_A0)>::__clone(__base<_Rp(_A0)>* __p) const
-{
- ::new ((void*)__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-void
-__func<_Fp, _Alloc, _Rp(_A0)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-void
-__func<_Fp, _Alloc, _Rp(_A0)>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-_Rp
-__func<_Fp, _Alloc, _Rp(_A0)>::operator()(_A0 __a0)
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), __a0);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-const void*
-__func<_Fp, _Alloc, _Rp(_A0)>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_A0)>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-class __func<_Fp, _Alloc, _Rp(_A0, _A1)>
- : public __base<_Rp(_A0, _A1)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {}
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp(_A0, _A1)>* __clone() const;
- virtual void __clone(__base<_Rp(_A0, _A1)>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_A0, _A1);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-__base<_Rp(_A0, _A1)>*
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::__clone(__base<_Rp(_A0, _A1)>* __p) const
-{
- ::new ((void*)__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-_Rp
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1)
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), __a0, __a1);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-const void*
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_A0, _A1)>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-class __func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>
- : public __base<_Rp(_A0, _A1, _A2)>
-{
- __compressed_pair<_Fp, _Alloc> __f_;
-public:
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f) : __f_(_VSTD::move(__f), __default_init_tag()) {}
- _LIBCPP_INLINE_VISIBILITY explicit __func(_Fp __f, _Alloc __a)
- : __f_(_VSTD::move(__f), _VSTD::move(__a)) {}
- virtual __base<_Rp(_A0, _A1, _A2)>* __clone() const;
- virtual void __clone(__base<_Rp(_A0, _A1, _A2)>*) const;
- virtual void destroy();
- virtual void destroy_deallocate();
- virtual _Rp operator()(_A0, _A1, _A2);
-#ifndef _LIBCPP_NO_RTTI
- virtual const void* target(const type_info&) const;
- virtual const std::type_info& target_type() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-__base<_Rp(_A0, _A1, _A2)>*
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone() const
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__func, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) __func(__f_.first(), _Alloc(__a));
- return __hold.release();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::__clone(__base<_Rp(_A0, _A1, _A2)>* __p) const
-{
- ::new ((void*)__p) __func(__f_.first(), __f_.second());
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy()
-{
- __f_.~__compressed_pair<_Fp, _Alloc>();
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-void
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::destroy_deallocate()
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- typedef typename __rebind_alloc_helper<__alloc_traits, __func>::type _Ap;
- _Ap __a(__f_.second());
- __f_.~__compressed_pair<_Fp, _Alloc>();
- __a.deallocate(this, 1);
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-_Rp
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2)
-{
- typedef __invoke_void_return_wrapper<_Rp> _Invoker;
- return _Invoker::__call(__f_.first(), __a0, __a1, __a2);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-const void*
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target(const type_info& __ti) const
-{
- if (__ti == typeid(_Fp))
- return &__f_.first();
- return (const void*)0;
-}
-
-template<class _Fp, class _Alloc, class _Rp, class _A0, class _A1, class _A2>
-const std::type_info&
-__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)>::target_type() const
-{
- return typeid(_Fp);
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-} // __function
-
-template<class _Rp>
-class _LIBCPP_TEMPLATE_VIS function<_Rp()>
-{
- typedef __function::__base<_Rp()> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2>
- bool operator==(const function<_R2()>&) const;// = delete;
- template<class _R2>
- bool operator!=(const function<_R2()>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()() const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp>
-function<_Rp()>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp>
-template<class _Alloc>
-function<_Rp()>::function(allocator_arg_t, const _Alloc&, const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp>
-template <class _Fp>
-function<_Rp()>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp()> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp>
-template <class _Fp, class _Alloc>
-function<_Rp()>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp()> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp>
-function<_Rp()>&
-function<_Rp()>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp>
-function<_Rp()>&
-function<_Rp()>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp()>&
->::type
-function<_Rp()>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp>
-function<_Rp()>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp>
-void
-function<_Rp()>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp>
-_Rp
-function<_Rp()>::operator()() const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)();
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp>
-const std::type_info&
-function<_Rp()>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp>
-template <typename _Tp>
-_Tp*
-function<_Rp()>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp>
-template <typename _Tp>
-const _Tp*
-function<_Rp()>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0)>
- : public unary_function<_A0, _Rp>
-{
- typedef __function::__base<_Rp(_A0)> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2, class _B0>
- bool operator==(const function<_R2(_B0)>&) const;// = delete;
- template<class _R2, class _B0>
- bool operator!=(const function<_R2(_B0)>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()(_A0) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0>
-template<class _Alloc>
-function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc&, const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0>
-template <class _Fp>
-function<_Rp(_A0)>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0>
-template <class _Fp, class _Alloc>
-function<_Rp(_A0)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_A0)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>&
-function<_Rp(_A0)>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>&
-function<_Rp(_A0)>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp, class _A0>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp(_A0)>&
->::type
-function<_Rp(_A0)>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class _A0>
-function<_Rp(_A0)>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class _A0>
-void
-function<_Rp(_A0)>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class _A0>
-_Rp
-function<_Rp(_A0)>::operator()(_A0 __a0) const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(__a0);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0>
-const std::type_info&
-function<_Rp(_A0)>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp, class _A0>
-template <typename _Tp>
-_Tp*
-function<_Rp(_A0)>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp, class _A0>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_A0)>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0, _A1)>
- : public binary_function<_A0, _A1, _Rp>
-{
- typedef __function::__base<_Rp(_A0, _A1)> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2, class _B0, class _B1>
- bool operator==(const function<_R2(_B0, _B1)>&) const;// = delete;
- template<class _R2, class _B0, class _B1>
- bool operator!=(const function<_R2(_B0, _B1)>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()(_A0, _A1) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1>
-template<class _Alloc>
-function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc&, const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1>
-template <class _Fp>
-function<_Rp(_A0, _A1)>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1>
-template <class _Fp, class _Alloc>
-function<_Rp(_A0, _A1)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>&
-function<_Rp(_A0, _A1)>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>&
-function<_Rp(_A0, _A1)>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp(_A0, _A1)>&
->::type
-function<_Rp(_A0, _A1)>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1>
-function<_Rp(_A0, _A1)>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class _A0, class _A1>
-void
-function<_Rp(_A0, _A1)>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class _A0, class _A1>
-_Rp
-function<_Rp(_A0, _A1)>::operator()(_A0 __a0, _A1 __a1) const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(__a0, __a1);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1>
-const std::type_info&
-function<_Rp(_A0, _A1)>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp, class _A0, class _A1>
-template <typename _Tp>
-_Tp*
-function<_Rp(_A0, _A1)>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp, class _A0, class _A1>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_A0, _A1)>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1, class _A2>
-class _LIBCPP_TEMPLATE_VIS function<_Rp(_A0, _A1, _A2)>
-{
- typedef __function::__base<_Rp(_A0, _A1, _A2)> __base;
- aligned_storage<3*sizeof(void*)>::type __buf_;
- __base* __f_;
-
-public:
- typedef _Rp result_type;
-
- // 20.7.16.2.1, construct/copy/destroy:
- _LIBCPP_INLINE_VISIBILITY explicit function() : __f_(0) {}
- _LIBCPP_INLINE_VISIBILITY function(nullptr_t) : __f_(0) {}
- function(const function&);
- template<class _Fp>
- function(_Fp,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&) : __f_(0) {}
- template<class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- function(allocator_arg_t, const _Alloc&, nullptr_t) : __f_(0) {}
- template<class _Alloc>
- function(allocator_arg_t, const _Alloc&, const function&);
- template<class _Fp, class _Alloc>
- function(allocator_arg_t, const _Alloc& __a, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type* = 0);
-
- function& operator=(const function&);
- function& operator=(nullptr_t);
- template<class _Fp>
- typename enable_if
- <
- !is_integral<_Fp>::value,
- function&
- >::type
- operator=(_Fp);
-
- ~function();
-
- // 20.7.16.2.2, function modifiers:
- void swap(function&);
- template<class _Fp, class _Alloc>
- _LIBCPP_INLINE_VISIBILITY
- void assign(_Fp __f, const _Alloc& __a)
- {function(allocator_arg, __a, __f).swap(*this);}
-
- // 20.7.16.2.3, function capacity:
- _LIBCPP_INLINE_VISIBILITY operator bool() const {return __f_;}
-
-private:
- // deleted overloads close possible hole in the type system
- template<class _R2, class _B0, class _B1, class _B2>
- bool operator==(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
- template<class _R2, class _B0, class _B1, class _B2>
- bool operator!=(const function<_R2(_B0, _B1, _B2)>&) const;// = delete;
-public:
- // 20.7.16.2.4, function invocation:
- _Rp operator()(_A0, _A1, _A2) const;
-
-#ifndef _LIBCPP_NO_RTTI
- // 20.7.16.2.5, function target access:
- const std::type_info& target_type() const;
- template <typename _Tp> _Tp* target();
- template <typename _Tp> const _Tp* target() const;
-#endif // _LIBCPP_NO_RTTI
-};
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>::function(const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template<class _Alloc>
-function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc&,
- const function& __f)
-{
- if (__f.__f_ == 0)
- __f_ = 0;
- else if (__f.__f_ == (const __base*)&__f.__buf_)
- {
- __f_ = (__base*)&__buf_;
- __f.__f_->__clone(__f_);
- }
- else
- __f_ = __f.__f_->__clone();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <class _Fp>
-function<_Rp(_A0, _A1, _A2)>::function(_Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, allocator<_Fp>, _Rp(_A0, _A1, _A2)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f);
- }
- else
- {
- typedef allocator<_FF> _Ap;
- _Ap __a;
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, allocator<_Fp>(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <class _Fp, class _Alloc>
-function<_Rp(_A0, _A1, _A2)>::function(allocator_arg_t, const _Alloc& __a0, _Fp __f,
- typename enable_if<!is_integral<_Fp>::value>::type*)
- : __f_(0)
-{
- typedef allocator_traits<_Alloc> __alloc_traits;
- if (__function::__not_null(__f))
- {
- typedef __function::__func<_Fp, _Alloc, _Rp(_A0, _A1, _A2)> _FF;
- if (sizeof(_FF) <= sizeof(__buf_))
- {
- __f_ = (__base*)&__buf_;
- ::new ((void*)__f_) _FF(__f, __a0);
- }
- else
- {
- typedef typename __rebind_alloc_helper<__alloc_traits, _FF>::type _Ap;
- _Ap __a(__a0);
- typedef __allocator_destructor<_Ap> _Dp;
- unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
- ::new ((void*)__hold.get()) _FF(__f, _Alloc(__a));
- __f_ = __hold.release();
- }
- }
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>&
-function<_Rp(_A0, _A1, _A2)>::operator=(const function& __f)
-{
- if (__f)
- function(__f).swap(*this);
- else
- *this = nullptr;
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>&
-function<_Rp(_A0, _A1, _A2)>::operator=(nullptr_t)
-{
- __base* __t = __f_;
- __f_ = 0;
- if (__t == (__base*)&__buf_)
- __t->destroy();
- else if (__t)
- __t->destroy_deallocate();
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <class _Fp>
-typename enable_if
-<
- !is_integral<_Fp>::value,
- function<_Rp(_A0, _A1, _A2)>&
->::type
-function<_Rp(_A0, _A1, _A2)>::operator=(_Fp __f)
-{
- function(_VSTD::move(__f)).swap(*this);
- return *this;
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-function<_Rp(_A0, _A1, _A2)>::~function()
-{
- if (__f_ == (__base*)&__buf_)
- __f_->destroy();
- else if (__f_)
- __f_->destroy_deallocate();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-void
-function<_Rp(_A0, _A1, _A2)>::swap(function& __f)
-{
- if (_VSTD::addressof(__f) == this)
- return;
- if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
- {
- typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
- __base* __t = (__base*)&__tempbuf;
- __f_->__clone(__t);
- __f_->destroy();
- __f_ = 0;
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = 0;
- __f_ = (__base*)&__buf_;
- __t->__clone((__base*)&__f.__buf_);
- __t->destroy();
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f_ == (__base*)&__buf_)
- {
- __f_->__clone((__base*)&__f.__buf_);
- __f_->destroy();
- __f_ = __f.__f_;
- __f.__f_ = (__base*)&__f.__buf_;
- }
- else if (__f.__f_ == (__base*)&__f.__buf_)
- {
- __f.__f_->__clone((__base*)&__buf_);
- __f.__f_->destroy();
- __f.__f_ = __f_;
- __f_ = (__base*)&__buf_;
- }
- else
- _VSTD::swap(__f_, __f.__f_);
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-_Rp
-function<_Rp(_A0, _A1, _A2)>::operator()(_A0 __a0, _A1 __a1, _A2 __a2) const
-{
- if (__f_ == 0)
- __throw_bad_function_call();
- return (*__f_)(__a0, __a1, __a2);
-}
-
-#ifndef _LIBCPP_NO_RTTI
-
-template<class _Rp, class _A0, class _A1, class _A2>
-const std::type_info&
-function<_Rp(_A0, _A1, _A2)>::target_type() const
-{
- if (__f_ == 0)
- return typeid(void);
- return __f_->target_type();
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <typename _Tp>
-_Tp*
-function<_Rp(_A0, _A1, _A2)>::target()
-{
- if (__f_ == 0)
- return (_Tp*)0;
- return (_Tp*) const_cast<void *>(__f_->target(typeid(_Tp)));
-}
-
-template<class _Rp, class _A0, class _A1, class _A2>
-template <typename _Tp>
-const _Tp*
-function<_Rp(_A0, _A1, _A2)>::target() const
-{
- if (__f_ == 0)
- return (const _Tp*)0;
- return (const _Tp*)__f_->target(typeid(_Tp));
-}
-
-#endif // _LIBCPP_NO_RTTI
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(const function<_Fp>& __f, nullptr_t) {return !__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator==(nullptr_t, const function<_Fp>& __f) {return !__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(const function<_Fp>& __f, nullptr_t) {return (bool)__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-operator!=(nullptr_t, const function<_Fp>& __f) {return (bool)__f;}
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-void
-swap(function<_Fp>& __x, function<_Fp>& __y)
-{return __x.swap(__y);}
-
-#endif // _LIBCPP_FUNCTIONAL_03
diff --git a/clang-r416183d/include/c++/v1/__functional_base b/clang-r416183d/include/c++/v1/__functional_base
deleted file mode 100644
index 708c1a2..0000000
--- a/clang-r416183d/include/c++/v1/__functional_base
+++ /dev/null
@@ -1,655 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL_BASE
-#define _LIBCPP_FUNCTIONAL_BASE
-
-#include <__config>
-#include <type_traits>
-#include <typeinfo>
-#include <exception>
-#include <new>
-#include <utility>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Arg1, class _Arg2, class _Result>
-struct _LIBCPP_TEMPLATE_VIS binary_function
-{
- typedef _Arg1 first_argument_type;
- typedef _Arg2 second_argument_type;
- typedef _Result result_type;
-};
-
-template <class _Tp>
-struct __has_result_type
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Up> static __two __test(...);
- template <class _Up> static char __test(typename _Up::result_type* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp = void>
-#else
-template <class _Tp>
-#endif
-struct _LIBCPP_TEMPLATE_VIS less : binary_function<_Tp, _Tp, bool>
-{
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- bool operator()(const _Tp& __x, const _Tp& __y) const
- {return __x < __y;}
-};
-
-#if _LIBCPP_STD_VER > 11
-template <>
-struct _LIBCPP_TEMPLATE_VIS less<void>
-{
- template <class _T1, class _T2>
- _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY
- auto operator()(_T1&& __t, _T2&& __u) const
- _NOEXCEPT_(noexcept(_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u)))
- -> decltype (_VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u))
- { return _VSTD::forward<_T1>(__t) < _VSTD::forward<_T2>(__u); }
- typedef void is_transparent;
-};
-#endif
-
-// __weak_result_type
-
-template <class _Tp>
-struct __derives_from_unary_function
-{
-private:
- struct __two {char __lx; char __lxx;};
- static __two __test(...);
- template <class _Ap, class _Rp>
- static unary_function<_Ap, _Rp>
- __test(const volatile unary_function<_Ap, _Rp>*);
-public:
- static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
- typedef decltype(__test((_Tp*)0)) type;
-};
-
-template <class _Tp>
-struct __derives_from_binary_function
-{
-private:
- struct __two {char __lx; char __lxx;};
- static __two __test(...);
- template <class _A1, class _A2, class _Rp>
- static binary_function<_A1, _A2, _Rp>
- __test(const volatile binary_function<_A1, _A2, _Rp>*);
-public:
- static const bool value = !is_same<decltype(__test((_Tp*)0)), __two>::value;
- typedef decltype(__test((_Tp*)0)) type;
-};
-
-template <class _Tp, bool = __derives_from_unary_function<_Tp>::value>
-struct __maybe_derive_from_unary_function // bool is true
- : public __derives_from_unary_function<_Tp>::type
-{
-};
-
-template <class _Tp>
-struct __maybe_derive_from_unary_function<_Tp, false>
-{
-};
-
-template <class _Tp, bool = __derives_from_binary_function<_Tp>::value>
-struct __maybe_derive_from_binary_function // bool is true
- : public __derives_from_binary_function<_Tp>::type
-{
-};
-
-template <class _Tp>
-struct __maybe_derive_from_binary_function<_Tp, false>
-{
-};
-
-template <class _Tp, bool = __has_result_type<_Tp>::value>
-struct __weak_result_type_imp // bool is true
- : public __maybe_derive_from_unary_function<_Tp>,
- public __maybe_derive_from_binary_function<_Tp>
-{
- typedef _LIBCPP_NODEBUG_TYPE typename _Tp::result_type result_type;
-};
-
-template <class _Tp>
-struct __weak_result_type_imp<_Tp, false>
- : public __maybe_derive_from_unary_function<_Tp>,
- public __maybe_derive_from_binary_function<_Tp>
-{
-};
-
-template <class _Tp>
-struct __weak_result_type
- : public __weak_result_type_imp<_Tp>
-{
-};
-
-// 0 argument case
-
-template <class _Rp>
-struct __weak_result_type<_Rp ()>
-{
- typedef _LIBCPP_NODEBUG_TYPE _Rp result_type;
-};
-
-template <class _Rp>
-struct __weak_result_type<_Rp (&)()>
-{
- typedef _LIBCPP_NODEBUG_TYPE _Rp result_type;
-};
-
-template <class _Rp>
-struct __weak_result_type<_Rp (*)()>
-{
- typedef _LIBCPP_NODEBUG_TYPE _Rp result_type;
-};
-
-// 1 argument case
-
-template <class _Rp, class _A1>
-struct __weak_result_type<_Rp (_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template <class _Rp, class _A1>
-struct __weak_result_type<_Rp (&)(_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template <class _Rp, class _A1>
-struct __weak_result_type<_Rp (*)(_A1)>
- : public unary_function<_A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)()>
- : public unary_function<_Cp*, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)() const>
- : public unary_function<const _Cp*, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)() volatile>
- : public unary_function<volatile _Cp*, _Rp>
-{
-};
-
-template <class _Rp, class _Cp>
-struct __weak_result_type<_Rp (_Cp::*)() const volatile>
- : public unary_function<const volatile _Cp*, _Rp>
-{
-};
-
-// 2 argument case
-
-template <class _Rp, class _A1, class _A2>
-struct __weak_result_type<_Rp (_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Rp, class _A1, class _A2>
-struct __weak_result_type<_Rp (*)(_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Rp, class _A1, class _A2>
-struct __weak_result_type<_Rp (&)(_A1, _A2)>
- : public binary_function<_A1, _A2, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1)>
- : public binary_function<_Cp*, _A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1) const>
- : public binary_function<const _Cp*, _A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1) volatile>
- : public binary_function<volatile _Cp*, _A1, _Rp>
-{
-};
-
-template <class _Rp, class _Cp, class _A1>
-struct __weak_result_type<_Rp (_Cp::*)(_A1) const volatile>
- : public binary_function<const volatile _Cp*, _A1, _Rp>
-{
-};
-
-
-#ifndef _LIBCPP_CXX03_LANG
-// 3 or more arguments
-
-template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
-struct __weak_result_type<_Rp (_A1, _A2, _A3, _A4...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
-struct __weak_result_type<_Rp (&)(_A1, _A2, _A3, _A4...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _A1, class _A2, class _A3, class ..._A4>
-struct __weak_result_type<_Rp (*)(_A1, _A2, _A3, _A4...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...)>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) volatile>
-{
- typedef _Rp result_type;
-};
-
-template <class _Rp, class _Cp, class _A1, class _A2, class ..._A3>
-struct __weak_result_type<_Rp (_Cp::*)(_A1, _A2, _A3...) const volatile>
-{
- typedef _Rp result_type;
-};
-
-template <class _Tp, class ..._Args>
-struct __invoke_return
-{
- typedef decltype(_VSTD::__invoke(declval<_Tp>(), declval<_Args>()...)) type;
-};
-
-#else // defined(_LIBCPP_CXX03_LANG)
-
-#include <__functional_base_03>
-
-#endif // !defined(_LIBCPP_CXX03_LANG)
-
-
-template <class _Ret>
-struct __invoke_void_return_wrapper
-{
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- static _Ret __call(_Args&&... __args) {
- return _VSTD::__invoke(_VSTD::forward<_Args>(__args)...);
- }
-#else
- template <class _Fn>
- static _Ret __call(_Fn __f) {
- return _VSTD::__invoke(__f);
- }
-
- template <class _Fn, class _A0>
- static _Ret __call(_Fn __f, _A0& __a0) {
- return _VSTD::__invoke(__f, __a0);
- }
-
- template <class _Fn, class _A0, class _A1>
- static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1) {
- return _VSTD::__invoke(__f, __a0, __a1);
- }
-
- template <class _Fn, class _A0, class _A1, class _A2>
- static _Ret __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2){
- return _VSTD::__invoke(__f, __a0, __a1, __a2);
- }
-#endif
-};
-
-template <>
-struct __invoke_void_return_wrapper<void>
-{
-#ifndef _LIBCPP_CXX03_LANG
- template <class ..._Args>
- static void __call(_Args&&... __args) {
- _VSTD::__invoke(_VSTD::forward<_Args>(__args)...);
- }
-#else
- template <class _Fn>
- static void __call(_Fn __f) {
- _VSTD::__invoke(__f);
- }
-
- template <class _Fn, class _A0>
- static void __call(_Fn __f, _A0& __a0) {
- _VSTD::__invoke(__f, __a0);
- }
-
- template <class _Fn, class _A0, class _A1>
- static void __call(_Fn __f, _A0& __a0, _A1& __a1) {
- _VSTD::__invoke(__f, __a0, __a1);
- }
-
- template <class _Fn, class _A0, class _A1, class _A2>
- static void __call(_Fn __f, _A0& __a0, _A1& __a1, _A2& __a2) {
- _VSTD::__invoke(__f, __a0, __a1, __a2);
- }
-#endif
-};
-
-template <class _Tp>
-class _LIBCPP_TEMPLATE_VIS reference_wrapper
- : public __weak_result_type<_Tp>
-{
-public:
- // types
- typedef _Tp type;
-private:
- type* __f_;
-
-public:
- // construct/copy/destroy
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- reference_wrapper(type& __f) _NOEXCEPT
- : __f_(_VSTD::addressof(__f)) {}
-#ifndef _LIBCPP_CXX03_LANG
- private: reference_wrapper(type&&); public: // = delete; // do not bind to temps
-#endif
-
- // access
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- operator type&() const _NOEXCEPT {return *__f_;}
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- type& get() const _NOEXCEPT {return *__f_;}
-
-#ifndef _LIBCPP_CXX03_LANG
- // invoke
- template <class... _ArgTypes>
- _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
- typename __invoke_of<type&, _ArgTypes...>::type
- operator() (_ArgTypes&&... __args) const {
- return _VSTD::__invoke(get(), _VSTD::forward<_ArgTypes>(__args)...);
- }
-#else
-
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return<type>::type
- operator() () const {
- return _VSTD::__invoke(get());
- }
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0>::type
- operator() (_A0& __a0) const {
- return _VSTD::__invoke(get(), __a0);
- }
-
- template <class _A0>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return0<type, _A0 const>::type
- operator() (_A0 const& __a0) const {
- return _VSTD::__invoke(get(), __a0);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1>::type
- operator() (_A0& __a0, _A1& __a1) const {
- return _VSTD::__invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1>::type
- operator() (_A0 const& __a0, _A1& __a1) const {
- return _VSTD::__invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0, _A1 const>::type
- operator() (_A0& __a0, _A1 const& __a1) const {
- return _VSTD::__invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return1<type, _A0 const, _A1 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1) const {
- return _VSTD::__invoke(get(), __a0, __a1);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2>::type
- operator() (_A0& __a0, _A1& __a1, _A2& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1, _A2 const>::type
- operator() (_A0& __a0, _A1& __a1, _A2 const& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1, _A2 const>::type
- operator() (_A0 const& __a0, _A1& __a1, _A2 const& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0, _A1 const, _A2 const>::type
- operator() (_A0& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-
- template <class _A0, class _A1, class _A2>
- _LIBCPP_INLINE_VISIBILITY
- typename __invoke_return2<type, _A0 const, _A1 const, _A2 const>::type
- operator() (_A0 const& __a0, _A1 const& __a1, _A2 const& __a2) const {
- return _VSTD::__invoke(get(), __a0, __a1, __a2);
- }
-#endif // _LIBCPP_CXX03_LANG
-};
-
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-reference_wrapper<_Tp>
-ref(_Tp& __t) _NOEXCEPT
-{
- return reference_wrapper<_Tp>(__t);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-reference_wrapper<_Tp>
-ref(reference_wrapper<_Tp> __t) _NOEXCEPT
-{
- return _VSTD::ref(__t.get());
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-reference_wrapper<const _Tp>
-cref(const _Tp& __t) _NOEXCEPT
-{
- return reference_wrapper<const _Tp>(__t);
-}
-
-template <class _Tp>
-inline _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR_AFTER_CXX17
-reference_wrapper<const _Tp>
-cref(reference_wrapper<_Tp> __t) _NOEXCEPT
-{
- return _VSTD::cref(__t.get());
-}
-
-#ifndef _LIBCPP_CXX03_LANG
-template <class _Tp> void ref(const _Tp&&) = delete;
-template <class _Tp> void cref(const _Tp&&) = delete;
-#endif
-
-#if _LIBCPP_STD_VER > 11
-template <class _Tp, class, class = void>
-struct __is_transparent : false_type {};
-
-template <class _Tp, class _Up>
-struct __is_transparent<_Tp, _Up,
- typename __void_t<typename _Tp::is_transparent>::type>
- : true_type {};
-#endif
-
-// allocator_arg_t
-
-struct _LIBCPP_TEMPLATE_VIS allocator_arg_t { explicit allocator_arg_t() = default; };
-
-#if defined(_LIBCPP_CXX03_LANG) || defined(_LIBCPP_BUILDING_LIBRARY)
-extern _LIBCPP_EXPORTED_FROM_ABI const allocator_arg_t allocator_arg;
-#else
-/* _LIBCPP_INLINE_VAR */ constexpr allocator_arg_t allocator_arg = allocator_arg_t();
-#endif
-
-// uses_allocator
-
-template <class _Tp>
-struct __has_allocator_type
-{
-private:
- struct __two {char __lx; char __lxx;};
- template <class _Up> static __two __test(...);
- template <class _Up> static char __test(typename _Up::allocator_type* = 0);
-public:
- static const bool value = sizeof(__test<_Tp>(0)) == 1;
-};
-
-template <class _Tp, class _Alloc, bool = __has_allocator_type<_Tp>::value>
-struct __uses_allocator
- : public integral_constant<bool,
- is_convertible<_Alloc, typename _Tp::allocator_type>::value>
-{
-};
-
-template <class _Tp, class _Alloc>
-struct __uses_allocator<_Tp, _Alloc, false>
- : public false_type
-{
-};
-
-template <class _Tp, class _Alloc>
-struct _LIBCPP_TEMPLATE_VIS uses_allocator
- : public __uses_allocator<_Tp, _Alloc>
-{
-};
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp, class _Alloc>
-_LIBCPP_INLINE_VAR constexpr size_t uses_allocator_v = uses_allocator<_Tp, _Alloc>::value;
-#endif
-
-#ifndef _LIBCPP_CXX03_LANG
-
-// allocator construction
-
-template <class _Tp, class _Alloc, class ..._Args>
-struct __uses_alloc_ctor_imp
-{
- typedef _LIBCPP_NODEBUG_TYPE typename __uncvref<_Alloc>::type _RawAlloc;
- static const bool __ua = uses_allocator<_Tp, _RawAlloc>::value;
- static const bool __ic =
- is_constructible<_Tp, allocator_arg_t, _Alloc, _Args...>::value;
- static const int value = __ua ? 2 - __ic : 0;
-};
-
-template <class _Tp, class _Alloc, class ..._Args>
-struct __uses_alloc_ctor
- : integral_constant<int, __uses_alloc_ctor_imp<_Tp, _Alloc, _Args...>::value>
- {};
-
-template <class _Tp, class _Allocator, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __user_alloc_construct_impl (integral_constant<int, 0>, _Tp *__storage, const _Allocator &, _Args &&... __args )
-{
- new (__storage) _Tp (_VSTD::forward<_Args>(__args)...);
-}
-
-// FIXME: This should have a version which takes a non-const alloc.
-template <class _Tp, class _Allocator, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __user_alloc_construct_impl (integral_constant<int, 1>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
-{
- new (__storage) _Tp (allocator_arg, __a, _VSTD::forward<_Args>(__args)...);
-}
-
-// FIXME: This should have a version which takes a non-const alloc.
-template <class _Tp, class _Allocator, class... _Args>
-inline _LIBCPP_INLINE_VISIBILITY
-void __user_alloc_construct_impl (integral_constant<int, 2>, _Tp *__storage, const _Allocator &__a, _Args &&... __args )
-{
- new (__storage) _Tp (_VSTD::forward<_Args>(__args)..., __a);
-}
-
-#endif // _LIBCPP_CXX03_LANG
-
-_LIBCPP_END_NAMESPACE_STD
-
-#endif // _LIBCPP_FUNCTIONAL_BASE
diff --git a/clang-r416183d/include/c++/v1/__functional_base_03 b/clang-r416183d/include/c++/v1/__functional_base_03
deleted file mode 100644
index 9b08bd2..0000000
--- a/clang-r416183d/include/c++/v1/__functional_base_03
+++ /dev/null
@@ -1,223 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP_FUNCTIONAL_BASE_03
-#define _LIBCPP_FUNCTIONAL_BASE_03
-
-// manual variadic expansion for <functional>
-
-// __invoke
-
-template <class _Ret, class _T1, bool _IsFunc, bool _IsBase>
-struct __enable_invoke_imp;
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, true, true> {
- typedef _Ret _Bullet1;
- typedef _Bullet1 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, true, false> {
- typedef _Ret _Bullet2;
- typedef _Bullet2 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, false, true> {
- typedef typename add_lvalue_reference<
- typename __apply_cv<_T1, _Ret>::type
- >::type _Bullet3;
- typedef _Bullet3 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1, false, false> {
- typedef typename add_lvalue_reference<
- typename __apply_cv<decltype(*declval<_T1>()), _Ret>::type
- >::type _Bullet4;
- typedef _Bullet4 type;
-};
-
-template <class _Ret, class _T1>
-struct __enable_invoke_imp<_Ret, _T1*, false, false> {
- typedef typename add_lvalue_reference<
- typename __apply_cv<_T1, _Ret>::type
- >::type _Bullet4;
- typedef _Bullet4 type;
-};
-
-template <class _Fn, class _T1,
- class _Traits = __member_pointer_traits<_Fn>,
- class _Ret = typename _Traits::_ReturnType,
- class _Class = typename _Traits::_ClassType>
-struct __enable_invoke : __enable_invoke_imp<
- _Ret, _T1,
- is_member_function_pointer<_Fn>::value,
- is_base_of<_Class, typename remove_reference<_T1>::type>::value>
-{
-};
-
-__nat __invoke(__any, ...);
-
-// first bullet
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1) {
- return (__t1.*__f)();
-}
-
-template <class _Fn, class _T1, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
- return (__t1.*__f)(__a0);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
- return (__t1.*__f)(__a0, __a1);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet1
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
- return (__t1.*__f)(__a0, __a1, __a2);
-}
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1) {
- return ((*__t1).*__f)();
-}
-
-template <class _Fn, class _T1, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1, _A0& __a0) {
- return ((*__t1).*__f)(__a0);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1) {
- return ((*__t1).*__f)(__a0, __a1);
-}
-
-template <class _Fn, class _T1, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet2
-__invoke(_Fn __f, _T1& __t1, _A0& __a0, _A1& __a1, _A2& __a2) {
- return ((*__t1).*__f)(__a0, __a1, __a2);
-}
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet3
-__invoke(_Fn __f, _T1& __t1) {
- return __t1.*__f;
-}
-
-template <class _Fn, class _T1>
-inline _LIBCPP_INLINE_VISIBILITY
-typename __enable_invoke<_Fn, _T1>::_Bullet4
-__invoke(_Fn __f, _T1& __t1) {
- return (*__t1).*__f;
-}
-
-// fifth bullet
-
-template <class _Fp>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(declval<_Fp&>()())
-__invoke(_Fp& __f)
-{
- return __f();
-}
-
-template <class _Fp, class _A0>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(declval<_Fp&>()(declval<_A0&>()))
-__invoke(_Fp& __f, _A0& __a0)
-{
- return __f(__a0);
-}
-
-template <class _Fp, class _A0, class _A1>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(declval<_Fp&>()(declval<_A0&>(), declval<_A1&>()))
-__invoke(_Fp& __f, _A0& __a0, _A1& __a1)
-{
- return __f(__a0, __a1);
-}
-
-template <class _Fp, class _A0, class _A1, class _A2>
-inline _LIBCPP_INLINE_VISIBILITY
-decltype(declval<_Fp&>()(declval<_A0&>(), declval<_A1&>(), declval<_A2&>()))
-__invoke(_Fp& __f, _A0& __a0, _A1& __a1, _A2& __a2)
-{
- return __f(__a0, __a1, __a2);
-}
-
-template <class _Fp, bool = __has_result_type<__weak_result_type<_Fp> >::value>
-struct __invoke_return
-{
- typedef typename __weak_result_type<_Fp>::result_type type;
-};
-
-template <class _Fp>
-struct __invoke_return<_Fp, false>
-{
- typedef decltype(_VSTD::__invoke(declval<_Fp&>())) type;
-};
-
-template <class _Tp, class _A0>
-struct __invoke_return0
-{
- typedef decltype(_VSTD::__invoke(declval<_Tp&>(), declval<_A0&>())) type;
-};
-
-template <class _Rp, class _Tp, class _A0>
-struct __invoke_return0<_Rp _Tp::*, _A0>
-{
- typedef typename __enable_invoke<_Rp _Tp::*, _A0>::type type;
-};
-
-template <class _Tp, class _A0, class _A1>
-struct __invoke_return1
-{
- typedef decltype(_VSTD::__invoke(declval<_Tp&>(), declval<_A0&>(),
- declval<_A1&>())) type;
-};
-
-template <class _Rp, class _Class, class _A0, class _A1>
-struct __invoke_return1<_Rp _Class::*, _A0, _A1> {
- typedef typename __enable_invoke<_Rp _Class::*, _A0>::type type;
-};
-
-template <class _Tp, class _A0, class _A1, class _A2>
-struct __invoke_return2
-{
- typedef decltype(_VSTD::__invoke(declval<_Tp&>(), declval<_A0&>(),
- declval<_A1&>(),
- declval<_A2&>())) type;
-};
-
-template <class _Ret, class _Class, class _A0, class _A1, class _A2>
-struct __invoke_return2<_Ret _Class::*, _A0, _A1, _A2> {
- typedef typename __enable_invoke<_Ret _Class::*, _A0>::type type;
-};
-#endif // _LIBCPP_FUNCTIONAL_BASE_03
diff --git a/clang-r416183d/include/c++/v1/__hash_table b/clang-r416183d/include/c++/v1/__hash_table
deleted file mode 100644
index 521ebbf..0000000
--- a/clang-r416183d/include/c++/v1/__hash_table
+++ /dev/null
@@ -1,2813 +0,0 @@
-// -*- C++ -*-
-//===----------------------------------------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef _LIBCPP__HASH_TABLE
-#define _LIBCPP__HASH_TABLE
-
-#include <__config>
-#include <initializer_list>
-#include <memory>
-#include <iterator>
-#include <algorithm>
-#include <cmath>
-#include <utility>
-#include <type_traits>
-
-#include <__debug>
-
-#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
-#pragma GCC system_header
-#endif
-
-_LIBCPP_PUSH_MACROS
-#include <__undef_macros>
-
-
-_LIBCPP_BEGIN_NAMESPACE_STD
-
-template <class _Key, class _Tp>
-struct __hash_value_type;
-
-template <class _Tp>
-struct __is_hash_value_type_imp : false_type {};
-
-template <class _Key, class _Value>
-struct __is_hash_value_type_imp<__hash_value_type<_Key, _Value> > : true_type {};
-
-template <class ..._Args>
-struct __is_hash_value_type : false_type {};
-
-template <class _One>
-struct __is_hash_value_type<_One> : __is_hash_value_type_imp<typename __uncvref<_One>::type> {};
-
-_LIBCPP_FUNC_VIS
-size_t __next_prime(size_t __n);
-
-template <class _NodePtr>
-struct __hash_node_base
-{
- typedef typename pointer_traits<_NodePtr>::element_type __node_type;
- typedef __hash_node_base __first_node;
- typedef typename __rebind_pointer<_NodePtr, __first_node>::type __node_base_pointer;
- typedef _NodePtr __node_pointer;
-
-#if defined(_LIBCPP_ABI_FIX_UNORDERED_NODE_POINTER_UB)
- typedef __node_base_pointer __next_pointer;
-#else
- typedef typename conditional<
- is_pointer<__node_pointer>::value,
- __node_base_pointer,
- __node_pointer>::type __next_pointer;
-#endif
-
- __next_pointer __next_;
-
- _LIBCPP_INLINE_VISIBILITY
- __next_pointer __ptr() _NOEXCEPT {
- return static_cast<__next_pointer>(
- pointer_traits<__node_base_pointer>::pointer_to(*this));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __node_pointer __upcast() _NOEXCEPT {
- return static_cast<__node_pointer>(
- pointer_traits<__node_base_pointer>::pointer_to(*this));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_t __hash() const _NOEXCEPT {
- return static_cast<__node_type const&>(*this).__hash_;
- }
-
- _LIBCPP_INLINE_VISIBILITY __hash_node_base() _NOEXCEPT : __next_(nullptr) {}
-};
-
-template <class _Tp, class _VoidPtr>
-struct __hash_node
- : public __hash_node_base
- <
- typename __rebind_pointer<_VoidPtr, __hash_node<_Tp, _VoidPtr> >::type
- >
-{
- typedef _Tp __node_value_type;
-
- size_t __hash_;
- __node_value_type __value_;
-};
-
-inline _LIBCPP_INLINE_VISIBILITY
-bool
-__is_hash_power2(size_t __bc)
-{
- return __bc > 2 && !(__bc & (__bc - 1));
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t
-__constrain_hash(size_t __h, size_t __bc)
-{
- return !(__bc & (__bc - 1)) ? __h & (__bc - 1) :
- (__h < __bc ? __h : __h % __bc);
-}
-
-inline _LIBCPP_INLINE_VISIBILITY
-size_t
-__next_hash_pow2(size_t __n)
-{
- return __n < 2 ? __n : (size_t(1) << (numeric_limits<size_t>::digits - __libcpp_clz(__n-1)));
-}
-
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc> class __hash_table;
-
-template <class _NodePtr> class _LIBCPP_TEMPLATE_VIS __hash_iterator;
-template <class _ConstNodePtr> class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
-template <class _NodePtr> class _LIBCPP_TEMPLATE_VIS __hash_local_iterator;
-template <class _ConstNodePtr> class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
-template <class _HashIterator> class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
-template <class _HashIterator> class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
-
-template <class _Tp>
-struct __hash_key_value_types {
- static_assert(!is_reference<_Tp>::value && !is_const<_Tp>::value, "");
- typedef _Tp key_type;
- typedef _Tp __node_value_type;
- typedef _Tp __container_value_type;
- static const bool __is_map = false;
-
- _LIBCPP_INLINE_VISIBILITY
- static key_type const& __get_key(_Tp const& __v) {
- return __v;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type const& __get_value(__node_value_type const& __v) {
- return __v;
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type* __get_ptr(__node_value_type& __n) {
- return _VSTD::addressof(__n);
- }
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type&& __move(__node_value_type& __v) {
- return _VSTD::move(__v);
- }
-};
-
-template <class _Key, class _Tp>
-struct __hash_key_value_types<__hash_value_type<_Key, _Tp> > {
- typedef _Key key_type;
- typedef _Tp mapped_type;
- typedef __hash_value_type<_Key, _Tp> __node_value_type;
- typedef pair<const _Key, _Tp> __container_value_type;
- typedef __container_value_type __map_value_type;
- static const bool __is_map = true;
-
- _LIBCPP_INLINE_VISIBILITY
- static key_type const& __get_key(__container_value_type const& __v) {
- return __v.first;
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static typename enable_if<__is_same_uncvref<_Up, __node_value_type>::value,
- __container_value_type const&>::type
- __get_value(_Up& __t) {
- return __t.__get_value();
- }
-
- template <class _Up>
- _LIBCPP_INLINE_VISIBILITY
- static typename enable_if<__is_same_uncvref<_Up, __container_value_type>::value,
- __container_value_type const&>::type
- __get_value(_Up& __t) {
- return __t;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- static __container_value_type* __get_ptr(__node_value_type& __n) {
- return _VSTD::addressof(__n.__get_value());
- }
- _LIBCPP_INLINE_VISIBILITY
- static pair<key_type&&, mapped_type&&> __move(__node_value_type& __v) {
- return __v.__move();
- }
-};
-
-template <class _Tp, class _AllocPtr, class _KVTypes = __hash_key_value_types<_Tp>,
- bool = _KVTypes::__is_map>
-struct __hash_map_pointer_types {};
-
-template <class _Tp, class _AllocPtr, class _KVTypes>
-struct __hash_map_pointer_types<_Tp, _AllocPtr, _KVTypes, true> {
- typedef typename _KVTypes::__map_value_type _Mv;
- typedef typename __rebind_pointer<_AllocPtr, _Mv>::type
- __map_value_type_pointer;
- typedef typename __rebind_pointer<_AllocPtr, const _Mv>::type
- __const_map_value_type_pointer;
-};
-
-template <class _NodePtr, class _NodeT = typename pointer_traits<_NodePtr>::element_type>
-struct __hash_node_types;
-
-template <class _NodePtr, class _Tp, class _VoidPtr>
-struct __hash_node_types<_NodePtr, __hash_node<_Tp, _VoidPtr> >
- : public __hash_key_value_types<_Tp>, __hash_map_pointer_types<_Tp, _VoidPtr>
-
-{
- typedef __hash_key_value_types<_Tp> __base;
-
-public:
- typedef ptrdiff_t difference_type;
- typedef size_t size_type;
-
- typedef typename __rebind_pointer<_NodePtr, void>::type __void_pointer;
-
- typedef typename pointer_traits<_NodePtr>::element_type __node_type;
- typedef _NodePtr __node_pointer;
-
- typedef __hash_node_base<__node_pointer> __node_base_type;
- typedef typename __rebind_pointer<_NodePtr, __node_base_type>::type
- __node_base_pointer;
-
- typedef typename __node_base_type::__next_pointer __next_pointer;
-
- typedef _Tp __node_value_type;
- typedef typename __rebind_pointer<_VoidPtr, __node_value_type>::type
- __node_value_type_pointer;
- typedef typename __rebind_pointer<_VoidPtr, const __node_value_type>::type
- __const_node_value_type_pointer;
-
-private:
- static_assert(!is_const<__node_type>::value,
- "_NodePtr should never be a pointer to const");
- static_assert((is_same<typename pointer_traits<_VoidPtr>::element_type, void>::value),
- "_VoidPtr does not point to unqualified void type");
- static_assert((is_same<typename __rebind_pointer<_VoidPtr, __node_type>::type,
- _NodePtr>::value), "_VoidPtr does not rebind to _NodePtr.");
-};
-
-template <class _HashIterator>
-struct __hash_node_types_from_iterator;
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_const_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-template <class _NodePtr>
-struct __hash_node_types_from_iterator<__hash_const_local_iterator<_NodePtr> > : __hash_node_types<_NodePtr> {};
-
-
-template <class _NodeValueTp, class _VoidPtr>
-struct __make_hash_node_types {
- typedef __hash_node<_NodeValueTp, _VoidPtr> _NodeTp;
- typedef typename __rebind_pointer<_VoidPtr, _NodeTp>::type _NodePtr;
- typedef __hash_node_types<_NodePtr> type;
-};
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_iterator
-{
- typedef __hash_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__node_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_iterator() _NOEXCEPT : __node_(nullptr) {
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__insert_i(this);
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(const __hash_iterator& __i)
- : __node_(__i.__node_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator& operator=(const __hash_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL == 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container iterator");
- return __node_->__upcast()->__value_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container iterator");
- __node_ = __node_->__next_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator operator++(int)
- {
- __hash_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_iterator& __x, const __hash_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_iterator& __x, const __hash_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(__next_pointer __node, const void* __c) _NOEXCEPT
- : __node_(__node)
- {
- __get_db()->__insert_ic(this, __c);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_iterator(__next_pointer __node) _NOEXCEPT
- : __node_(__node)
- {}
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-};
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_const_iterator
-{
- static_assert(!is_const<typename pointer_traits<_NodePtr>::element_type>::value, "");
- typedef __hash_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
-
-public:
- typedef __hash_iterator<_NodePtr> __non_const_iterator;
-
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
-
-
- _LIBCPP_INLINE_VISIBILITY __hash_const_iterator() _NOEXCEPT : __node_(nullptr) {
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__insert_i(this);
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(const __non_const_iterator& __x) _NOEXCEPT
- : __node_(__x.__node_)
- {
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__iterator_copy(this, &__x);
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(const __hash_const_iterator& __i)
- : __node_(__i.__node_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_const_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator& operator=(const __hash_const_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL == 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_iterator");
- return __node_->__upcast()->__value_;
- }
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container const_iterator");
- __node_ = __node_->__next_;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator operator++(int)
- {
- __hash_const_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_const_iterator& __x, const __hash_const_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(__next_pointer __node, const void* __c) _NOEXCEPT
- : __node_(__node)
- {
- __get_db()->__insert_ic(this, __c);
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_iterator(__next_pointer __node) _NOEXCEPT
- : __node_(__node)
- {}
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-};
-
-template <class _NodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_local_iterator
-{
- typedef __hash_node_types<_NodePtr> _NodeTypes;
- typedef _NodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
- size_t __bucket_;
- size_t __bucket_count_;
-
-public:
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef value_type& reference;
- typedef typename _NodeTypes::__node_value_type_pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY __hash_local_iterator() _NOEXCEPT : __node_(nullptr) {
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__insert_i(this);
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(const __hash_local_iterator& __i)
- : __node_(__i.__node_),
- __bucket_(__i.__bucket_),
- __bucket_count_(__i.__bucket_count_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_local_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator& operator=(const __hash_local_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- __bucket_ = __i.__bucket_;
- __bucket_count_ = __i.__bucket_count_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL == 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container local_iterator");
- return __node_->__upcast()->__value_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container local_iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container local_iterator");
- __node_ = __node_->__next_;
- if (__node_ != nullptr && __constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_)
- __node_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator operator++(int)
- {
- __hash_local_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_local_iterator& __x, const __hash_local_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count, const void* __c) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- __get_db()->__insert_ic(this, __c);
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_iterator;
-};
-
-template <class _ConstNodePtr>
-class _LIBCPP_TEMPLATE_VIS __hash_const_local_iterator
-{
- typedef __hash_node_types<_ConstNodePtr> _NodeTypes;
- typedef _ConstNodePtr __node_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
- __next_pointer __node_;
- size_t __bucket_;
- size_t __bucket_count_;
-
- typedef pointer_traits<__node_pointer> __pointer_traits;
- typedef typename __pointer_traits::element_type __node;
- typedef typename remove_const<__node>::type __non_const_node;
- typedef typename __rebind_pointer<__node_pointer, __non_const_node>::type
- __non_const_node_pointer;
-public:
- typedef __hash_local_iterator<__non_const_node_pointer>
- __non_const_iterator;
-
- typedef forward_iterator_tag iterator_category;
- typedef typename _NodeTypes::__node_value_type value_type;
- typedef typename _NodeTypes::difference_type difference_type;
- typedef const value_type& reference;
- typedef typename _NodeTypes::__const_node_value_type_pointer pointer;
-
-
- _LIBCPP_INLINE_VISIBILITY __hash_const_local_iterator() _NOEXCEPT : __node_(nullptr) {
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__insert_i(this);
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(const __non_const_iterator& __x) _NOEXCEPT
- : __node_(__x.__node_),
- __bucket_(__x.__bucket_),
- __bucket_count_(__x.__bucket_count_)
- {
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__iterator_copy(this, &__x);
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(const __hash_const_local_iterator& __i)
- : __node_(__i.__node_),
- __bucket_(__i.__bucket_),
- __bucket_count_(__i.__bucket_count_)
- {
- __get_db()->__iterator_copy(this, &__i);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- ~__hash_const_local_iterator()
- {
- __get_db()->__erase_i(this);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator& operator=(const __hash_const_local_iterator& __i)
- {
- if (this != &__i)
- {
- __get_db()->__iterator_copy(this, &__i);
- __node_ = __i.__node_;
- __bucket_ = __i.__bucket_;
- __bucket_count_ = __i.__bucket_count_;
- }
- return *this;
- }
-#endif // _LIBCPP_DEBUG_LEVEL == 2
-
- _LIBCPP_INLINE_VISIBILITY
- reference operator*() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_local_iterator");
- return __node_->__upcast()->__value_;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pointer operator->() const {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to dereference a non-dereferenceable unordered container const_local_iterator");
- return pointer_traits<pointer>::pointer_to(__node_->__upcast()->__value_);
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator& operator++() {
- _LIBCPP_DEBUG_ASSERT(__get_const_db()->__dereferenceable(this),
- "Attempted to increment non-incrementable unordered container const_local_iterator");
- __node_ = __node_->__next_;
- if (__node_ != nullptr && __constrain_hash(__node_->__hash(), __bucket_count_) != __bucket_)
- __node_ = nullptr;
- return *this;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator operator++(int)
- {
- __hash_const_local_iterator __t(*this);
- ++(*this);
- return __t;
- }
-
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator==(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
- {
- return __x.__node_ == __y.__node_;
- }
- friend _LIBCPP_INLINE_VISIBILITY
- bool operator!=(const __hash_const_local_iterator& __x, const __hash_const_local_iterator& __y)
- {return !(__x == __y);}
-
-private:
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count, const void* __c) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- __get_db()->__insert_ic(this, __c);
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#else
- _LIBCPP_INLINE_VISIBILITY
- __hash_const_local_iterator(__next_pointer __node, size_t __bucket,
- size_t __bucket_count) _NOEXCEPT
- : __node_(__node),
- __bucket_(__bucket),
- __bucket_count_(__bucket_count)
- {
- if (__node_ != nullptr)
- __node_ = __node_->__next_;
- }
-#endif
- template <class, class, class, class> friend class __hash_table;
- template <class> friend class _LIBCPP_TEMPLATE_VIS __hash_map_const_iterator;
-};
-
-template <class _Alloc>
-class __bucket_list_deallocator
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename __alloc_traits::size_type size_type;
-
- __compressed_pair<size_type, allocator_type> __data_;
-public:
- typedef typename __alloc_traits::pointer pointer;
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator()
- _NOEXCEPT_(is_nothrow_default_constructible<allocator_type>::value)
- : __data_(0, __default_init_tag()) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator(const allocator_type& __a, size_type __size)
- _NOEXCEPT_(is_nothrow_copy_constructible<allocator_type>::value)
- : __data_(__size, __a) {}
-
- _LIBCPP_INLINE_VISIBILITY
- __bucket_list_deallocator(__bucket_list_deallocator&& __x)
- _NOEXCEPT_(is_nothrow_move_constructible<allocator_type>::value)
- : __data_(_VSTD::move(__x.__data_))
- {
- __x.size() = 0;
- }
-
- _LIBCPP_INLINE_VISIBILITY
- size_type& size() _NOEXCEPT {return __data_.first();}
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __data_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- allocator_type& __alloc() _NOEXCEPT {return __data_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const allocator_type& __alloc() const _NOEXCEPT {return __data_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- __alloc_traits::deallocate(__alloc(), __p, size());
- }
-};
-
-template <class _Alloc> class __hash_map_node_destructor;
-
-template <class _Alloc>
-class __hash_node_destructor
-{
- typedef _Alloc allocator_type;
- typedef allocator_traits<allocator_type> __alloc_traits;
-
-public:
- typedef typename __alloc_traits::pointer pointer;
-private:
- typedef __hash_node_types<pointer> _NodeTypes;
-
- allocator_type& __na_;
-
-public:
- bool __value_constructed;
-
- __hash_node_destructor(__hash_node_destructor const&) = default;
- __hash_node_destructor& operator=(const __hash_node_destructor&) = delete;
-
-
- _LIBCPP_INLINE_VISIBILITY
- explicit __hash_node_destructor(allocator_type& __na,
- bool __constructed = false) _NOEXCEPT
- : __na_(__na),
- __value_constructed(__constructed)
- {}
-
- _LIBCPP_INLINE_VISIBILITY
- void operator()(pointer __p) _NOEXCEPT
- {
- if (__value_constructed)
- __alloc_traits::destroy(__na_, _NodeTypes::__get_ptr(__p->__value_));
- if (__p)
- __alloc_traits::deallocate(__na_, __p, 1);
- }
-
- template <class> friend class __hash_map_node_destructor;
-};
-
-#if _LIBCPP_STD_VER > 14
-template <class _NodeType, class _Alloc>
-struct __generic_container_node_destructor;
-
-template <class _Tp, class _VoidPtr, class _Alloc>
-struct __generic_container_node_destructor<__hash_node<_Tp, _VoidPtr>, _Alloc>
- : __hash_node_destructor<_Alloc>
-{
- using __hash_node_destructor<_Alloc>::__hash_node_destructor;
-};
-#endif
-
-template <class _Key, class _Hash, class _Equal>
-struct __enforce_unordered_container_requirements {
-#ifndef _LIBCPP_CXX03_LANG
- static_assert(__check_hash_requirements<_Key, _Hash>::value,
- "the specified hash does not meet the Hash requirements");
- static_assert(is_copy_constructible<_Equal>::value,
- "the specified comparator is required to be copy constructible");
-#endif
- typedef int type;
-};
-
-template <class _Key, class _Hash, class _Equal>
-#ifndef _LIBCPP_CXX03_LANG
- _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Equal const&, _Key const&, _Key const&>::value,
- "the specified comparator type does not provide a viable const call operator")
- _LIBCPP_DIAGNOSE_WARNING(!__invokable<_Hash const&, _Key const&>::value,
- "the specified hash functor does not provide a viable const call operator")
-#endif
-typename __enforce_unordered_container_requirements<_Key, _Hash, _Equal>::type
-__diagnose_unordered_container_requirements(int);
-
-// This dummy overload is used so that the compiler won't emit a spurious
-// "no matching function for call to __diagnose_unordered_xxx" diagnostic
-// when the overload above causes a hard error.
-template <class _Key, class _Hash, class _Equal>
-int __diagnose_unordered_container_requirements(void*);
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-class __hash_table
-{
-public:
- typedef _Tp value_type;
- typedef _Hash hasher;
- typedef _Equal key_equal;
- typedef _Alloc allocator_type;
-
-private:
- typedef allocator_traits<allocator_type> __alloc_traits;
- typedef typename
- __make_hash_node_types<value_type, typename __alloc_traits::void_pointer>::type
- _NodeTypes;
-public:
-
- typedef typename _NodeTypes::__node_value_type __node_value_type;
- typedef typename _NodeTypes::__container_value_type __container_value_type;
- typedef typename _NodeTypes::key_type key_type;
- typedef value_type& reference;
- typedef const value_type& const_reference;
- typedef typename __alloc_traits::pointer pointer;
- typedef typename __alloc_traits::const_pointer const_pointer;
-#ifndef _LIBCPP_ABI_FIX_UNORDERED_CONTAINER_SIZE_TYPE
- typedef typename __alloc_traits::size_type size_type;
-#else
- typedef typename _NodeTypes::size_type size_type;
-#endif
- typedef typename _NodeTypes::difference_type difference_type;
-public:
- // Create __node
-
- typedef typename _NodeTypes::__node_type __node;
- typedef typename __rebind_alloc_helper<__alloc_traits, __node>::type __node_allocator;
- typedef allocator_traits<__node_allocator> __node_traits;
- typedef typename _NodeTypes::__void_pointer __void_pointer;
- typedef typename _NodeTypes::__node_pointer __node_pointer;
- typedef typename _NodeTypes::__node_pointer __node_const_pointer;
- typedef typename _NodeTypes::__node_base_type __first_node;
- typedef typename _NodeTypes::__node_base_pointer __node_base_pointer;
- typedef typename _NodeTypes::__next_pointer __next_pointer;
-
-private:
- // check for sane allocator pointer rebinding semantics. Rebinding the
- // allocator for a new pointer type should be exactly the same as rebinding
- // the pointer using 'pointer_traits'.
- static_assert((is_same<__node_pointer, typename __node_traits::pointer>::value),
- "Allocator does not rebind pointers in a sane manner.");
- typedef typename __rebind_alloc_helper<__node_traits, __first_node>::type
- __node_base_allocator;
- typedef allocator_traits<__node_base_allocator> __node_base_traits;
- static_assert((is_same<__node_base_pointer, typename __node_base_traits::pointer>::value),
- "Allocator does not rebind pointers in a sane manner.");
-
-private:
-
- typedef typename __rebind_alloc_helper<__node_traits, __next_pointer>::type __pointer_allocator;
- typedef __bucket_list_deallocator<__pointer_allocator> __bucket_list_deleter;
- typedef unique_ptr<__next_pointer[], __bucket_list_deleter> __bucket_list;
- typedef allocator_traits<__pointer_allocator> __pointer_alloc_traits;
- typedef typename __bucket_list_deleter::pointer __node_pointer_pointer;
-
- // --- Member data begin ---
- __bucket_list __bucket_list_;
- __compressed_pair<__first_node, __node_allocator> __p1_;
- __compressed_pair<size_type, hasher> __p2_;
- __compressed_pair<float, key_equal> __p3_;
- // --- Member data end ---
-
- _LIBCPP_INLINE_VISIBILITY
- size_type& size() _NOEXCEPT {return __p2_.first();}
-public:
- _LIBCPP_INLINE_VISIBILITY
- size_type size() const _NOEXCEPT {return __p2_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- hasher& hash_function() _NOEXCEPT {return __p2_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const hasher& hash_function() const _NOEXCEPT {return __p2_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- float& max_load_factor() _NOEXCEPT {return __p3_.first();}
- _LIBCPP_INLINE_VISIBILITY
- float max_load_factor() const _NOEXCEPT {return __p3_.first();}
-
- _LIBCPP_INLINE_VISIBILITY
- key_equal& key_eq() _NOEXCEPT {return __p3_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const key_equal& key_eq() const _NOEXCEPT {return __p3_.second();}
-
- _LIBCPP_INLINE_VISIBILITY
- __node_allocator& __node_alloc() _NOEXCEPT {return __p1_.second();}
- _LIBCPP_INLINE_VISIBILITY
- const __node_allocator& __node_alloc() const _NOEXCEPT
- {return __p1_.second();}
-
-public:
- typedef __hash_iterator<__node_pointer> iterator;
- typedef __hash_const_iterator<__node_pointer> const_iterator;
- typedef __hash_local_iterator<__node_pointer> local_iterator;
- typedef __hash_const_local_iterator<__node_pointer> const_local_iterator;
-
- _LIBCPP_INLINE_VISIBILITY
- __hash_table()
- _NOEXCEPT_(
- is_nothrow_default_constructible<__bucket_list>::value &&
- is_nothrow_default_constructible<__first_node>::value &&
- is_nothrow_default_constructible<__node_allocator>::value &&
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value);
- _LIBCPP_INLINE_VISIBILITY
- __hash_table(const hasher& __hf, const key_equal& __eql);
- __hash_table(const hasher& __hf, const key_equal& __eql,
- const allocator_type& __a);
- explicit __hash_table(const allocator_type& __a);
- __hash_table(const __hash_table& __u);
- __hash_table(const __hash_table& __u, const allocator_type& __a);
- __hash_table(__hash_table&& __u)
- _NOEXCEPT_(
- is_nothrow_move_constructible<__bucket_list>::value &&
- is_nothrow_move_constructible<__first_node>::value &&
- is_nothrow_move_constructible<__node_allocator>::value &&
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value);
- __hash_table(__hash_table&& __u, const allocator_type& __a);
- ~__hash_table();
-
- __hash_table& operator=(const __hash_table& __u);
- _LIBCPP_INLINE_VISIBILITY
- __hash_table& operator=(__hash_table&& __u)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- template <class _InputIterator>
- void __assign_unique(_InputIterator __first, _InputIterator __last);
- template <class _InputIterator>
- void __assign_multi(_InputIterator __first, _InputIterator __last);
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_size() const _NOEXCEPT
- {
- return _VSTD::min<size_type>(
- __node_traits::max_size(__node_alloc()),
- numeric_limits<difference_type >::max()
- );
- }
-
-private:
- _LIBCPP_INLINE_VISIBILITY
- __next_pointer __node_insert_multi_prepare(size_t __cp_hash,
- value_type& __cp_val);
- _LIBCPP_INLINE_VISIBILITY
- void __node_insert_multi_perform(__node_pointer __cp,
- __next_pointer __pn) _NOEXCEPT;
-
- _LIBCPP_INLINE_VISIBILITY
- __next_pointer __node_insert_unique_prepare(size_t __nd_hash,
- value_type& __nd_val);
- _LIBCPP_INLINE_VISIBILITY
- void __node_insert_unique_perform(__node_pointer __ptr) _NOEXCEPT;
-
-public:
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __node_insert_unique(__node_pointer __nd);
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_multi(__node_pointer __nd);
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_insert_multi(const_iterator __p,
- __node_pointer __nd);
-
- template <class _Key, class ..._Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique_key_args(_Key const& __k, _Args&&... __args);
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique_impl(_Args&&... __args);
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique(_Pp&& __x) {
- return __emplace_unique_extract_key(_VSTD::forward<_Pp>(__x),
- __can_extract_key<_Pp, key_type>());
- }
-
- template <class _First, class _Second>
- _LIBCPP_INLINE_VISIBILITY
- typename enable_if<
- __can_extract_map_key<_First, key_type, __container_value_type>::value,
- pair<iterator, bool>
- >::type __emplace_unique(_First&& __f, _Second&& __s) {
- return __emplace_unique_key_args(__f, _VSTD::forward<_First>(__f),
- _VSTD::forward<_Second>(__s));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __emplace_unique(_Args&&... __args) {
- return __emplace_unique_impl(_VSTD::forward<_Args>(__args)...);
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_fail_tag) {
- return __emplace_unique_impl(_VSTD::forward<_Pp>(__x));
- }
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_self_tag) {
- return __emplace_unique_key_args(__x, _VSTD::forward<_Pp>(__x));
- }
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __emplace_unique_extract_key(_Pp&& __x, __extract_key_first_tag) {
- return __emplace_unique_key_args(__x.first, _VSTD::forward<_Pp>(__x));
- }
-
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_multi(_Args&&... __args);
- template <class... _Args>
- _LIBCPP_INLINE_VISIBILITY
- iterator __emplace_hint_multi(const_iterator __p, _Args&&... __args);
-
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool>
- __insert_unique(__container_value_type&& __x) {
- return __emplace_unique_key_args(_NodeTypes::__get_key(__x), _VSTD::move(__x));
- }
-
- template <class _Pp, class = typename enable_if<
- !__is_same_uncvref<_Pp, __container_value_type>::value
- >::type>
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(_Pp&& __x) {
- return __emplace_unique(_VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(_Pp&& __x) {
- return __emplace_multi(_VSTD::forward<_Pp>(__x));
- }
-
- template <class _Pp>
- _LIBCPP_INLINE_VISIBILITY
- iterator __insert_multi(const_iterator __p, _Pp&& __x) {
- return __emplace_hint_multi(__p, _VSTD::forward<_Pp>(__x));
- }
-
- _LIBCPP_INLINE_VISIBILITY
- pair<iterator, bool> __insert_unique(const __container_value_type& __x) {
- return __emplace_unique_key_args(_NodeTypes::__get_key(__x), __x);
- }
-
-#if _LIBCPP_STD_VER > 14
- template <class _NodeHandle, class _InsertReturnType>
- _LIBCPP_INLINE_VISIBILITY
- _InsertReturnType __node_handle_insert_unique(_NodeHandle&& __nh);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_unique(const_iterator __hint,
- _NodeHandle&& __nh);
- template <class _Table>
- _LIBCPP_INLINE_VISIBILITY
- void __node_handle_merge_unique(_Table& __source);
-
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_multi(_NodeHandle&& __nh);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- iterator __node_handle_insert_multi(const_iterator __hint, _NodeHandle&& __nh);
- template <class _Table>
- _LIBCPP_INLINE_VISIBILITY
- void __node_handle_merge_multi(_Table& __source);
-
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- _NodeHandle __node_handle_extract(key_type const& __key);
- template <class _NodeHandle>
- _LIBCPP_INLINE_VISIBILITY
- _NodeHandle __node_handle_extract(const_iterator __it);
-#endif
-
- void clear() _NOEXCEPT;
- void rehash(size_type __n);
- _LIBCPP_INLINE_VISIBILITY void reserve(size_type __n)
- {rehash(static_cast<size_type>(ceil(__n / max_load_factor())));}
-
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket_count() const _NOEXCEPT
- {
- return __bucket_list_.get_deleter().size();
- }
-
- _LIBCPP_INLINE_VISIBILITY
- iterator begin() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- iterator end() _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- const_iterator begin() const _NOEXCEPT;
- _LIBCPP_INLINE_VISIBILITY
- const_iterator end() const _NOEXCEPT;
-
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- size_type bucket(const _Key& __k) const
- {
- _LIBCPP_ASSERT(bucket_count() > 0,
- "unordered container::bucket(key) called when bucket_count() == 0");
- return __constrain_hash(hash_function()(__k), bucket_count());
- }
-
- template <class _Key>
- iterator find(const _Key& __x);
- template <class _Key>
- const_iterator find(const _Key& __x) const;
-
- typedef __hash_node_destructor<__node_allocator> _Dp;
- typedef unique_ptr<__node, _Dp> __node_holder;
-
- iterator erase(const_iterator __p);
- iterator erase(const_iterator __first, const_iterator __last);
- template <class _Key>
- size_type __erase_unique(const _Key& __k);
- template <class _Key>
- size_type __erase_multi(const _Key& __k);
- __node_holder remove(const_iterator __p) _NOEXCEPT;
-
- template <class _Key>
- _LIBCPP_INLINE_VISIBILITY
- size_type __count_unique(const _Key& __k) const;
- template <class _Key>
- size_type __count_multi(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_unique(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_unique(const _Key& __k) const;
-
- template <class _Key>
- pair<iterator, iterator>
- __equal_range_multi(const _Key& __k);
- template <class _Key>
- pair<const_iterator, const_iterator>
- __equal_range_multi(const _Key& __k) const;
-
- void swap(__hash_table& __u)
-#if _LIBCPP_STD_VER <= 11
- _NOEXCEPT_(
- __is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value
- && (!allocator_traits<__pointer_allocator>::propagate_on_container_swap::value
- || __is_nothrow_swappable<__pointer_allocator>::value)
- && (!__node_traits::propagate_on_container_swap::value
- || __is_nothrow_swappable<__node_allocator>::value)
- );
-#else
- _NOEXCEPT_(__is_nothrow_swappable<hasher>::value && __is_nothrow_swappable<key_equal>::value);
-#endif
-
- _LIBCPP_INLINE_VISIBILITY
- size_type max_bucket_count() const _NOEXCEPT
- {return max_size(); }
- size_type bucket_size(size_type __n) const;
- _LIBCPP_INLINE_VISIBILITY float load_factor() const _NOEXCEPT
- {
- size_type __bc = bucket_count();
- return __bc != 0 ? (float)size() / __bc : 0.f;
- }
- _LIBCPP_INLINE_VISIBILITY void max_load_factor(float __mlf) _NOEXCEPT
- {
- _LIBCPP_ASSERT(__mlf > 0,
- "unordered container::max_load_factor(lf) called with lf <= 0");
- max_load_factor() = _VSTD::max(__mlf, load_factor());
- }
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator
- begin(size_type __n)
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::begin(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL == 2
- return local_iterator(__bucket_list_[__n], __n, bucket_count(), this);
-#else
- return local_iterator(__bucket_list_[__n], __n, bucket_count());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- local_iterator
- end(size_type __n)
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::end(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL == 2
- return local_iterator(nullptr, __n, bucket_count(), this);
-#else
- return local_iterator(nullptr, __n, bucket_count());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator
- cbegin(size_type __n) const
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::cbegin(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL == 2
- return const_local_iterator(__bucket_list_[__n], __n, bucket_count(), this);
-#else
- return const_local_iterator(__bucket_list_[__n], __n, bucket_count());
-#endif
- }
-
- _LIBCPP_INLINE_VISIBILITY
- const_local_iterator
- cend(size_type __n) const
- {
- _LIBCPP_ASSERT(__n < bucket_count(),
- "unordered container::cend(n) called with n >= bucket_count()");
-#if _LIBCPP_DEBUG_LEVEL == 2
- return const_local_iterator(nullptr, __n, bucket_count(), this);
-#else
- return const_local_iterator(nullptr, __n, bucket_count());
-#endif
- }
-
-#if _LIBCPP_DEBUG_LEVEL == 2
-
- bool __dereferenceable(const const_iterator* __i) const;
- bool __decrementable(const const_iterator* __i) const;
- bool __addable(const const_iterator* __i, ptrdiff_t __n) const;
- bool __subscriptable(const const_iterator* __i, ptrdiff_t __n) const;
-
-#endif // _LIBCPP_DEBUG_LEVEL == 2
-
-private:
- void __rehash(size_type __n);
-
- template <class ..._Args>
- __node_holder __construct_node(_Args&& ...__args);
-
- template <class _First, class ..._Rest>
- __node_holder __construct_node_hash(size_t __hash, _First&& __f, _Rest&&... __rest);
-
-
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __hash_table& __u)
- {__copy_assign_alloc(__u, integral_constant<bool,
- __node_traits::propagate_on_container_copy_assignment::value>());}
- void __copy_assign_alloc(const __hash_table& __u, true_type);
- _LIBCPP_INLINE_VISIBILITY
- void __copy_assign_alloc(const __hash_table&, false_type) {}
-
- void __move_assign(__hash_table& __u, false_type);
- void __move_assign(__hash_table& __u, true_type)
- _NOEXCEPT_(
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value);
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table& __u)
- _NOEXCEPT_(
- !__node_traits::propagate_on_container_move_assignment::value ||
- (is_nothrow_move_assignable<__pointer_allocator>::value &&
- is_nothrow_move_assignable<__node_allocator>::value))
- {__move_assign_alloc(__u, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());}
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table& __u, true_type)
- _NOEXCEPT_(
- is_nothrow_move_assignable<__pointer_allocator>::value &&
- is_nothrow_move_assignable<__node_allocator>::value)
- {
- __bucket_list_.get_deleter().__alloc() =
- _VSTD::move(__u.__bucket_list_.get_deleter().__alloc());
- __node_alloc() = _VSTD::move(__u.__node_alloc());
- }
- _LIBCPP_INLINE_VISIBILITY
- void __move_assign_alloc(__hash_table&, false_type) _NOEXCEPT {}
-
- void __deallocate_node(__next_pointer __np) _NOEXCEPT;
- __next_pointer __detach() _NOEXCEPT;
-
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_map;
- template <class, class, class, class, class> friend class _LIBCPP_TEMPLATE_VIS unordered_multimap;
-};
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table()
- _NOEXCEPT_(
- is_nothrow_default_constructible<__bucket_list>::value &&
- is_nothrow_default_constructible<__first_node>::value &&
- is_nothrow_default_constructible<__node_allocator>::value &&
- is_nothrow_default_constructible<hasher>::value &&
- is_nothrow_default_constructible<key_equal>::value)
- : __p2_(0, __default_init_tag()),
- __p3_(1.0f, __default_init_tag())
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
- const key_equal& __eql)
- : __bucket_list_(nullptr, __bucket_list_deleter()),
- __p1_(),
- __p2_(0, __hf),
- __p3_(1.0f, __eql)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const hasher& __hf,
- const key_equal& __eql,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__default_init_tag(), __node_allocator(__a)),
- __p2_(0, __hf),
- __p3_(1.0f, __eql)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__default_init_tag(), __node_allocator(__a)),
- __p2_(0, __default_init_tag()),
- __p3_(1.0f, __default_init_tag())
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u)
- : __bucket_list_(nullptr,
- __bucket_list_deleter(allocator_traits<__pointer_allocator>::
- select_on_container_copy_construction(
- __u.__bucket_list_.get_deleter().__alloc()), 0)),
- __p1_(__default_init_tag(), allocator_traits<__node_allocator>::
- select_on_container_copy_construction(__u.__node_alloc())),
- __p2_(0, __u.hash_function()),
- __p3_(__u.__p3_)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(const __hash_table& __u,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__default_init_tag(), __node_allocator(__a)),
- __p2_(0, __u.hash_function()),
- __p3_(__u.__p3_)
-{
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u)
- _NOEXCEPT_(
- is_nothrow_move_constructible<__bucket_list>::value &&
- is_nothrow_move_constructible<__first_node>::value &&
- is_nothrow_move_constructible<__node_allocator>::value &&
- is_nothrow_move_constructible<hasher>::value &&
- is_nothrow_move_constructible<key_equal>::value)
- : __bucket_list_(_VSTD::move(__u.__bucket_list_)),
- __p1_(_VSTD::move(__u.__p1_)),
- __p2_(_VSTD::move(__u.__p2_)),
- __p3_(_VSTD::move(__u.__p3_))
-{
- if (size() > 0)
- {
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- __u.__p1_.first().__next_ = nullptr;
- __u.size() = 0;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__hash_table(__hash_table&& __u,
- const allocator_type& __a)
- : __bucket_list_(nullptr, __bucket_list_deleter(__pointer_allocator(__a), 0)),
- __p1_(__default_init_tag(), __node_allocator(__a)),
- __p2_(0, _VSTD::move(__u.hash_function())),
- __p3_(_VSTD::move(__u.__p3_))
-{
- if (__a == allocator_type(__u.__node_alloc()))
- {
- __bucket_list_.reset(__u.__bucket_list_.release());
- __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
- __u.__bucket_list_.get_deleter().size() = 0;
- if (__u.size() > 0)
- {
- __p1_.first().__next_ = __u.__p1_.first().__next_;
- __u.__p1_.first().__next_ = nullptr;
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- size() = __u.size();
- __u.size() = 0;
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::~__hash_table()
-{
-#if defined(_LIBCPP_CXX03_LANG)
- static_assert((is_copy_constructible<key_equal>::value),
- "Predicate must be copy-constructible.");
- static_assert((is_copy_constructible<hasher>::value),
- "Hasher must be copy-constructible.");
-#endif
-
- __deallocate_node(__p1_.first().__next_);
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__erase_c(this);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__copy_assign_alloc(
- const __hash_table& __u, true_type)
-{
- if (__node_alloc() != __u.__node_alloc())
- {
- clear();
- __bucket_list_.reset();
- __bucket_list_.get_deleter().size() = 0;
- }
- __bucket_list_.get_deleter().__alloc() = __u.__bucket_list_.get_deleter().__alloc();
- __node_alloc() = __u.__node_alloc();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>&
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(const __hash_table& __u)
-{
- if (this != &__u)
- {
- __copy_assign_alloc(__u);
- hash_function() = __u.hash_function();
- key_eq() = __u.key_eq();
- max_load_factor() = __u.max_load_factor();
- __assign_multi(__u.begin(), __u.end());
- }
- return *this;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__deallocate_node(__next_pointer __np)
- _NOEXCEPT
-{
- __node_allocator& __na = __node_alloc();
- while (__np != nullptr)
- {
- __next_pointer __next = __np->__next_;
-#if _LIBCPP_DEBUG_LEVEL == 2
- __c_node* __c = __get_db()->__find_c_and_lock(this);
- for (__i_node** __p = __c->end_; __p != __c->beg_; )
- {
- --__p;
- iterator* __i = static_cast<iterator*>((*__p)->__i_);
- if (__i->__node_ == __np)
- {
- (*__p)->__c_ = nullptr;
- if (--__c->end_ != __p)
- _VSTD::memmove(__p, __p+1, (__c->end_ - __p)*sizeof(__i_node*));
- }
- }
- __get_db()->unlock();
-#endif
- __node_pointer __real_np = __np->__upcast();
- __node_traits::destroy(__na, _NodeTypes::__get_ptr(__real_np->__value_));
- __node_traits::deallocate(__na, __real_np, 1);
- __np = __next;
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__detach() _NOEXCEPT
-{
- size_type __bc = bucket_count();
- for (size_type __i = 0; __i < __bc; ++__i)
- __bucket_list_[__i] = nullptr;
- size() = 0;
- __next_pointer __cache = __p1_.first().__next_;
- __p1_.first().__next_ = nullptr;
- return __cache;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
- __hash_table& __u, true_type)
- _NOEXCEPT_(
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value)
-{
- clear();
- __bucket_list_.reset(__u.__bucket_list_.release());
- __bucket_list_.get_deleter().size() = __u.__bucket_list_.get_deleter().size();
- __u.__bucket_list_.get_deleter().size() = 0;
- __move_assign_alloc(__u);
- size() = __u.size();
- hash_function() = _VSTD::move(__u.hash_function());
- max_load_factor() = __u.max_load_factor();
- key_eq() = _VSTD::move(__u.key_eq());
- __p1_.first().__next_ = __u.__p1_.first().__next_;
- if (size() > 0)
- {
- __bucket_list_[__constrain_hash(__p1_.first().__next_->__hash(), bucket_count())] =
- __p1_.first().__ptr();
- __u.__p1_.first().__next_ = nullptr;
- __u.size() = 0;
- }
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->swap(this, &__u);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__move_assign(
- __hash_table& __u, false_type)
-{
- if (__node_alloc() == __u.__node_alloc())
- __move_assign(__u, true_type());
- else
- {
- hash_function() = _VSTD::move(__u.hash_function());
- key_eq() = _VSTD::move(__u.key_eq());
- max_load_factor() = __u.max_load_factor();
- if (bucket_count() != 0)
- {
- __next_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- const_iterator __i = __u.begin();
- while (__cache != nullptr && __u.size() != 0)
- {
- __cache->__upcast()->__value_ =
- _VSTD::move(__u.remove(__i++)->__value_);
- __next_pointer __next = __cache->__next_;
- __node_insert_multi(__cache->__upcast());
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate_node(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate_node(__cache);
- }
- const_iterator __i = __u.begin();
- while (__u.size() != 0)
- {
- __node_holder __h = __construct_node(_NodeTypes::__move(__u.remove(__i++)->__value_));
- __node_insert_multi(__h.get());
- __h.release();
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-__hash_table<_Tp, _Hash, _Equal, _Alloc>&
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::operator=(__hash_table&& __u)
- _NOEXCEPT_(
- __node_traits::propagate_on_container_move_assignment::value &&
- is_nothrow_move_assignable<__node_allocator>::value &&
- is_nothrow_move_assignable<hasher>::value &&
- is_nothrow_move_assignable<key_equal>::value)
-{
- __move_assign(__u, integral_constant<bool,
- __node_traits::propagate_on_container_move_assignment::value>());
- return *this;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _InputIterator>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_unique(_InputIterator __first,
- _InputIterator __last)
-{
- typedef iterator_traits<_InputIterator> _ITraits;
- typedef typename _ITraits::value_type _ItValueType;
- static_assert((is_same<_ItValueType, __container_value_type>::value),
- "__assign_unique may only be called with the containers value type");
-
- if (bucket_count() != 0)
- {
- __next_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __cache != nullptr && __first != __last; ++__first)
- {
- __cache->__upcast()->__value_ = *__first;
- __next_pointer __next = __cache->__next_;
- __node_insert_unique(__cache->__upcast());
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate_node(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate_node(__cache);
- }
- for (; __first != __last; ++__first)
- __insert_unique(*__first);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _InputIterator>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__assign_multi(_InputIterator __first,
- _InputIterator __last)
-{
- typedef iterator_traits<_InputIterator> _ITraits;
- typedef typename _ITraits::value_type _ItValueType;
- static_assert((is_same<_ItValueType, __container_value_type>::value ||
- is_same<_ItValueType, __node_value_type>::value),
- "__assign_multi may only be called with the containers value type"
- " or the nodes value type");
- if (bucket_count() != 0)
- {
- __next_pointer __cache = __detach();
-#ifndef _LIBCPP_NO_EXCEPTIONS
- try
- {
-#endif // _LIBCPP_NO_EXCEPTIONS
- for (; __cache != nullptr && __first != __last; ++__first)
- {
- __cache->__upcast()->__value_ = *__first;
- __next_pointer __next = __cache->__next_;
- __node_insert_multi(__cache->__upcast());
- __cache = __next;
- }
-#ifndef _LIBCPP_NO_EXCEPTIONS
- }
- catch (...)
- {
- __deallocate_node(__cache);
- throw;
- }
-#endif // _LIBCPP_NO_EXCEPTIONS
- __deallocate_node(__cache);
- }
- for (; __first != __last; ++__first)
- __insert_multi(_NodeTypes::__get_value(*__first));
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- return iterator(__p1_.first().__next_, this);
-#else
- return iterator(__p1_.first().__next_);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- return iterator(nullptr, this);
-#else
- return iterator(nullptr);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::begin() const _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- return const_iterator(__p1_.first().__next_, this);
-#else
- return const_iterator(__p1_.first().__next_);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-inline
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::end() const _NOEXCEPT
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- return const_iterator(nullptr, this);
-#else
- return const_iterator(nullptr);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::clear() _NOEXCEPT
-{
- if (size() > 0)
- {
- __deallocate_node(__p1_.first().__next_);
- __p1_.first().__next_ = nullptr;
- size_type __bc = bucket_count();
- for (size_type __i = 0; __i < __bc; ++__i)
- __bucket_list_[__i] = nullptr;
- size() = 0;
- }
-}
-
-
-// Prepare the container for an insertion of the value __value with the hash
-// __hash. This does a lookup into the container to see if __value is already
-// present, and performs a rehash if necessary. Returns a pointer to the
-// existing element if it exists, otherwise nullptr.
-//
-// Note that this function does forward exceptions if key_eq() throws, and never
-// mutates __value or actually inserts into the map.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique_prepare(
- size_t __hash, value_type& __value)
-{
- size_type __bc = bucket_count();
-
- if (__bc != 0)
- {
- size_t __chash = __constrain_hash(__hash, __bc);
- __next_pointer __ndptr = __bucket_list_[__chash];
- if (__ndptr != nullptr)
- {
- for (__ndptr = __ndptr->__next_; __ndptr != nullptr &&
- __constrain_hash(__ndptr->__hash(), __bc) == __chash;
- __ndptr = __ndptr->__next_)
- {
- if (key_eq()(__ndptr->__upcast()->__value_, __value))
- return __ndptr;
- }
- }
- }
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- }
- return nullptr;
-}
-
-// Insert the node __nd into the container by pushing it into the right bucket,
-// and updating size(). Assumes that __nd->__hash is up-to-date, and that
-// rehashing has already occurred and that no element with the same key exists
-// in the map.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-_LIBCPP_INLINE_VISIBILITY
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique_perform(
- __node_pointer __nd) _NOEXCEPT
-{
- size_type __bc = bucket_count();
- size_t __chash = __constrain_hash(__nd->__hash(), __bc);
- // insert_after __bucket_list_[__chash], or __first_node if bucket is null
- __next_pointer __pn = __bucket_list_[__chash];
- if (__pn == nullptr)
- {
- __pn =__p1_.first().__ptr();
- __nd->__next_ = __pn->__next_;
- __pn->__next_ = __nd->__ptr();
- // fix up __bucket_list_
- __bucket_list_[__chash] = __pn;
- if (__nd->__next_ != nullptr)
- __bucket_list_[__constrain_hash(__nd->__next_->__hash(), __bc)] = __nd->__ptr();
- }
- else
- {
- __nd->__next_ = __pn->__next_;
- __pn->__next_ = __nd->__ptr();
- }
- ++size();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_unique(__node_pointer __nd)
-{
- __nd->__hash_ = hash_function()(__nd->__value_);
- __next_pointer __existing_node =
- __node_insert_unique_prepare(__nd->__hash(), __nd->__value_);
-
- // Insert the node, unless it already exists in the container.
- bool __inserted = false;
- if (__existing_node == nullptr)
- {
- __node_insert_unique_perform(__nd);
- __existing_node = __nd->__ptr();
- __inserted = true;
- }
-#if _LIBCPP_DEBUG_LEVEL == 2
- return pair<iterator, bool>(iterator(__existing_node, this), __inserted);
-#else
- return pair<iterator, bool>(iterator(__existing_node), __inserted);
-#endif
-}
-
-// Prepare the container for an insertion of the value __cp_val with the hash
-// __cp_hash. This does a lookup into the container to see if __cp_value is
-// already present, and performs a rehash if necessary. Returns a pointer to the
-// last occurrence of __cp_val in the map.
-//
-// Note that this function does forward exceptions if key_eq() throws, and never
-// mutates __value or actually inserts into the map.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__next_pointer
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi_prepare(
- size_t __cp_hash, value_type& __cp_val)
-{
- size_type __bc = bucket_count();
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- __bc = bucket_count();
- }
- size_t __chash = __constrain_hash(__cp_hash, __bc);
- __next_pointer __pn = __bucket_list_[__chash];
- if (__pn != nullptr)
- {
- for (bool __found = false; __pn->__next_ != nullptr &&
- __constrain_hash(__pn->__next_->__hash(), __bc) == __chash;
- __pn = __pn->__next_)
- {
- // __found key_eq() action
- // false false loop
- // true true loop
- // false true set __found to true
- // true false break
- if (__found != (__pn->__next_->__hash() == __cp_hash &&
- key_eq()(__pn->__next_->__upcast()->__value_, __cp_val)))
- {
- if (!__found)
- __found = true;
- else
- break;
- }
- }
- }
- return __pn;
-}
-
-// Insert the node __cp into the container after __pn (which is the last node in
-// the bucket that compares equal to __cp). Rehashing, and checking for
-// uniqueness has already been performed (in __node_insert_multi_prepare), so
-// all we need to do is update the bucket and size(). Assumes that __cp->__hash
-// is up-to-date.
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi_perform(
- __node_pointer __cp, __next_pointer __pn) _NOEXCEPT
-{
- size_type __bc = bucket_count();
- size_t __chash = __constrain_hash(__cp->__hash_, __bc);
- if (__pn == nullptr)
- {
- __pn =__p1_.first().__ptr();
- __cp->__next_ = __pn->__next_;
- __pn->__next_ = __cp->__ptr();
- // fix up __bucket_list_
- __bucket_list_[__chash] = __pn;
- if (__cp->__next_ != nullptr)
- __bucket_list_[__constrain_hash(__cp->__next_->__hash(), __bc)]
- = __cp->__ptr();
- }
- else
- {
- __cp->__next_ = __pn->__next_;
- __pn->__next_ = __cp->__ptr();
- if (__cp->__next_ != nullptr)
- {
- size_t __nhash = __constrain_hash(__cp->__next_->__hash(), __bc);
- if (__nhash != __chash)
- __bucket_list_[__nhash] = __cp->__ptr();
- }
- }
- ++size();
-}
-
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(__node_pointer __cp)
-{
- __cp->__hash_ = hash_function()(__cp->__value_);
- __next_pointer __pn = __node_insert_multi_prepare(__cp->__hash(), __cp->__value_);
- __node_insert_multi_perform(__cp, __pn);
-
-#if _LIBCPP_DEBUG_LEVEL == 2
- return iterator(__cp->__ptr(), this);
-#else
- return iterator(__cp->__ptr());
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_insert_multi(
- const_iterator __p, __node_pointer __cp)
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container::emplace_hint(const_iterator, args...) called with an iterator not"
- " referring to this unordered container");
-#endif
- if (__p != end() && key_eq()(*__p, __cp->__value_))
- {
- __next_pointer __np = __p.__node_;
- __cp->__hash_ = __np->__hash();
- size_type __bc = bucket_count();
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- __bc = bucket_count();
- }
- size_t __chash = __constrain_hash(__cp->__hash_, __bc);
- __next_pointer __pp = __bucket_list_[__chash];
- while (__pp->__next_ != __np)
- __pp = __pp->__next_;
- __cp->__next_ = __np;
- __pp->__next_ = static_cast<__next_pointer>(__cp);
- ++size();
-#if _LIBCPP_DEBUG_LEVEL == 2
- return iterator(static_cast<__next_pointer>(__cp), this);
-#else
- return iterator(static_cast<__next_pointer>(__cp));
-#endif
- }
- return __node_insert_multi(__cp);
-}
-
-
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key, class ..._Args>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_key_args(_Key const& __k, _Args&&... __args)
-{
-
- size_t __hash = hash_function()(__k);
- size_type __bc = bucket_count();
- bool __inserted = false;
- __next_pointer __nd;
- size_t __chash;
- if (__bc != 0)
- {
- __chash = __constrain_hash(__hash, __bc);
- __nd = __bucket_list_[__chash];
- if (__nd != nullptr)
- {
- for (__nd = __nd->__next_; __nd != nullptr &&
- (__nd->__hash() == __hash || __constrain_hash(__nd->__hash(), __bc) == __chash);
- __nd = __nd->__next_)
- {
- if (key_eq()(__nd->__upcast()->__value_, __k))
- goto __done;
- }
- }
- }
- {
- __node_holder __h = __construct_node_hash(__hash, _VSTD::forward<_Args>(__args)...);
- if (size()+1 > __bc * max_load_factor() || __bc == 0)
- {
- rehash(_VSTD::max<size_type>(2 * __bc + !__is_hash_power2(__bc),
- size_type(ceil(float(size() + 1) / max_load_factor()))));
- __bc = bucket_count();
- __chash = __constrain_hash(__hash, __bc);
- }
- // insert_after __bucket_list_[__chash], or __first_node if bucket is null
- __next_pointer __pn = __bucket_list_[__chash];
- if (__pn == nullptr)
- {
- __pn = __p1_.first().__ptr();
- __h->__next_ = __pn->__next_;
- __pn->__next_ = __h.get()->__ptr();
- // fix up __bucket_list_
- __bucket_list_[__chash] = __pn;
- if (__h->__next_ != nullptr)
- __bucket_list_[__constrain_hash(__h->__next_->__hash(), __bc)]
- = __h.get()->__ptr();
- }
- else
- {
- __h->__next_ = __pn->__next_;
- __pn->__next_ = static_cast<__next_pointer>(__h.get());
- }
- __nd = static_cast<__next_pointer>(__h.release());
- // increment size
- ++size();
- __inserted = true;
- }
-__done:
-#if _LIBCPP_DEBUG_LEVEL == 2
- return pair<iterator, bool>(iterator(__nd, this), __inserted);
-#else
- return pair<iterator, bool>(iterator(__nd), __inserted);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class... _Args>
-pair<typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator, bool>
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_unique_impl(_Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- pair<iterator, bool> __r = __node_insert_unique(__h.get());
- if (__r.second)
- __h.release();
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class... _Args>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_multi(_Args&&... __args)
-{
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- iterator __r = __node_insert_multi(__h.get());
- __h.release();
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class... _Args>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__emplace_hint_multi(
- const_iterator __p, _Args&&... __args)
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container::emplace_hint(const_iterator, args...) called with an iterator not"
- " referring to this unordered container");
-#endif
- __node_holder __h = __construct_node(_VSTD::forward<_Args>(__args)...);
- iterator __r = __node_insert_multi(__p, __h.get());
- __h.release();
- return __r;
-}
-
-#if _LIBCPP_STD_VER > 14
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle, class _InsertReturnType>
-_LIBCPP_INLINE_VISIBILITY
-_InsertReturnType
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_unique(
- _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return _InsertReturnType{end(), false, _NodeHandle()};
- pair<iterator, bool> __result = __node_insert_unique(__nh.__ptr_);
- if (__result.second)
- __nh.__release_ptr();
- return _InsertReturnType{__result.first, __result.second, _VSTD::move(__nh)};
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_unique(
- const_iterator, _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- pair<iterator, bool> __result = __node_insert_unique(__nh.__ptr_);
- if (__result.second)
- __nh.__release_ptr();
- return __result.first;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-_NodeHandle
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_extract(
- key_type const& __key)
-{
- iterator __i = find(__key);
- if (__i == end())
- return _NodeHandle();
- return __node_handle_extract<_NodeHandle>(__i);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-_NodeHandle
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_extract(
- const_iterator __p)
-{
- allocator_type __alloc(__node_alloc());
- return _NodeHandle(remove(__p).release(), __alloc);
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Table>
-_LIBCPP_INLINE_VISIBILITY
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_merge_unique(
- _Table& __source)
-{
- static_assert(is_same<__node, typename _Table::__node>::value, "");
-
- for (typename _Table::iterator __it = __source.begin();
- __it != __source.end();)
- {
- __node_pointer __src_ptr = __it.__node_->__upcast();
- size_t __hash = hash_function()(__src_ptr->__value_);
- __next_pointer __existing_node =
- __node_insert_unique_prepare(__hash, __src_ptr->__value_);
- auto __prev_iter = __it++;
- if (__existing_node == nullptr)
- {
- (void)__source.remove(__prev_iter).release();
- __src_ptr->__hash_ = __hash;
- __node_insert_unique_perform(__src_ptr);
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_multi(
- _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- iterator __result = __node_insert_multi(__nh.__ptr_);
- __nh.__release_ptr();
- return __result;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _NodeHandle>
-_LIBCPP_INLINE_VISIBILITY
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_insert_multi(
- const_iterator __hint, _NodeHandle&& __nh)
-{
- if (__nh.empty())
- return end();
- iterator __result = __node_insert_multi(__hint, __nh.__ptr_);
- __nh.__release_ptr();
- return __result;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Table>
-_LIBCPP_INLINE_VISIBILITY
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_handle_merge_multi(
- _Table& __source)
-{
- static_assert(is_same<typename _Table::__node, __node>::value, "");
-
- for (typename _Table::iterator __it = __source.begin();
- __it != __source.end();)
- {
- __node_pointer __src_ptr = __it.__node_->__upcast();
- size_t __src_hash = hash_function()(__src_ptr->__value_);
- __next_pointer __pn =
- __node_insert_multi_prepare(__src_hash, __src_ptr->__value_);
- (void)__source.remove(__it++).release();
- __src_ptr->__hash_ = __src_hash;
- __node_insert_multi_perform(__src_ptr, __pn);
- }
-}
-#endif // _LIBCPP_STD_VER > 14
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::rehash(size_type __n)
-_LIBCPP_DISABLE_UBSAN_UNSIGNED_INTEGER_CHECK
-{
- if (__n == 1)
- __n = 2;
- else if (__n & (__n - 1))
- __n = __next_prime(__n);
- size_type __bc = bucket_count();
- if (__n > __bc)
- __rehash(__n);
- else if (__n < __bc)
- {
- __n = _VSTD::max<size_type>
- (
- __n,
- __is_hash_power2(__bc) ? __next_hash_pow2(size_t(ceil(float(size()) / max_load_factor()))) :
- __next_prime(size_t(ceil(float(size()) / max_load_factor())))
- );
- if (__n < __bc)
- __rehash(__n);
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-void
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__rehash(size_type __nbc)
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- __get_db()->__invalidate_all(this);
-#endif
- __pointer_allocator& __npa = __bucket_list_.get_deleter().__alloc();
- __bucket_list_.reset(__nbc > 0 ?
- __pointer_alloc_traits::allocate(__npa, __nbc) : nullptr);
- __bucket_list_.get_deleter().size() = __nbc;
- if (__nbc > 0)
- {
- for (size_type __i = 0; __i < __nbc; ++__i)
- __bucket_list_[__i] = nullptr;
- __next_pointer __pp = __p1_.first().__ptr();
- __next_pointer __cp = __pp->__next_;
- if (__cp != nullptr)
- {
- size_type __chash = __constrain_hash(__cp->__hash(), __nbc);
- __bucket_list_[__chash] = __pp;
- size_type __phash = __chash;
- for (__pp = __cp, __cp = __cp->__next_; __cp != nullptr;
- __cp = __pp->__next_)
- {
- __chash = __constrain_hash(__cp->__hash(), __nbc);
- if (__chash == __phash)
- __pp = __cp;
- else
- {
- if (__bucket_list_[__chash] == nullptr)
- {
- __bucket_list_[__chash] = __pp;
- __pp = __cp;
- __phash = __chash;
- }
- else
- {
- __next_pointer __np = __cp;
- for (; __np->__next_ != nullptr &&
- key_eq()(__cp->__upcast()->__value_,
- __np->__next_->__upcast()->__value_);
- __np = __np->__next_)
- ;
- __pp->__next_ = __np->__next_;
- __np->__next_ = __bucket_list_[__chash]->__next_;
- __bucket_list_[__chash]->__next_ = __cp;
-
- }
- }
- }
- }
- }
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k)
-{
- size_t __hash = hash_function()(__k);
- size_type __bc = bucket_count();
- if (__bc != 0)
- {
- size_t __chash = __constrain_hash(__hash, __bc);
- __next_pointer __nd = __bucket_list_[__chash];
- if (__nd != nullptr)
- {
- for (__nd = __nd->__next_; __nd != nullptr &&
- (__nd->__hash() == __hash
- || __constrain_hash(__nd->__hash(), __bc) == __chash);
- __nd = __nd->__next_)
- {
- if ((__nd->__hash() == __hash)
- && key_eq()(__nd->__upcast()->__value_, __k))
-#if _LIBCPP_DEBUG_LEVEL == 2
- return iterator(__nd, this);
-#else
- return iterator(__nd);
-#endif
- }
- }
- }
- return end();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::const_iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::find(const _Key& __k) const
-{
- size_t __hash = hash_function()(__k);
- size_type __bc = bucket_count();
- if (__bc != 0)
- {
- size_t __chash = __constrain_hash(__hash, __bc);
- __next_pointer __nd = __bucket_list_[__chash];
- if (__nd != nullptr)
- {
- for (__nd = __nd->__next_; __nd != nullptr &&
- (__hash == __nd->__hash()
- || __constrain_hash(__nd->__hash(), __bc) == __chash);
- __nd = __nd->__next_)
- {
- if ((__nd->__hash() == __hash)
- && key_eq()(__nd->__upcast()->__value_, __k))
-#if _LIBCPP_DEBUG_LEVEL == 2
- return const_iterator(__nd, this);
-#else
- return const_iterator(__nd);
-#endif
- }
- }
-
- }
- return end();
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class ..._Args>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node(_Args&& ...__args)
-{
- static_assert(!__is_hash_value_type<_Args...>::value,
- "Construct cannot be called with a hash value type");
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_), _VSTD::forward<_Args>(__args)...);
- __h.get_deleter().__value_constructed = true;
- __h->__hash_ = hash_function()(__h->__value_);
- __h->__next_ = nullptr;
- return __h;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _First, class ..._Rest>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::__node_holder
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__construct_node_hash(
- size_t __hash, _First&& __f, _Rest&& ...__rest)
-{
- static_assert(!__is_hash_value_type<_First, _Rest...>::value,
- "Construct cannot be called with a hash value type");
- __node_allocator& __na = __node_alloc();
- __node_holder __h(__node_traits::allocate(__na, 1), _Dp(__na));
- __node_traits::construct(__na, _NodeTypes::__get_ptr(__h->__value_),
- _VSTD::forward<_First>(__f),
- _VSTD::forward<_Rest>(__rest)...);
- __h.get_deleter().__value_constructed = true;
- __h->__hash_ = __hash;
- __h->__next_ = nullptr;
- return __h;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __p)
-{
- __next_pointer __np = __p.__node_;
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__p) == this,
- "unordered container erase(iterator) called with an iterator not"
- " referring to this container");
- _LIBCPP_ASSERT(__p != end(),
- "unordered container erase(iterator) called with a non-dereferenceable iterator");
- iterator __r(__np, this);
-#else
- iterator __r(__np);
-#endif
- ++__r;
- remove(__p);
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::iterator
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::erase(const_iterator __first,
- const_iterator __last)
-{
-#if _LIBCPP_DEBUG_LEVEL == 2
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__first) == this,
- "unodered container::erase(iterator, iterator) called with an iterator not"
- " referring to this unodered container");
- _LIBCPP_ASSERT(__get_const_db()->__find_c_from_i(&__last) == this,
- "unodered container::erase(iterator, iterator) called with an iterator not"
- " referring to this unodered container");
-#endif
- for (const_iterator __p = __first; __first != __last; __p = __first)
- {
- ++__first;
- erase(__p);
- }
- __next_pointer __np = __last.__node_;
-#if _LIBCPP_DEBUG_LEVEL == 2
- return iterator (__np, this);
-#else
- return iterator (__np);
-#endif
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_unique(const _Key& __k)
-{
- iterator __i = find(__k);
- if (__i == end())
- return 0;
- erase(__i);
- return 1;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-template <class _Key>
-typename __hash_table<_Tp, _Hash, _Equal, _Alloc>::size_type
-__hash_table<_Tp, _Hash, _Equal, _Alloc>::__erase_multi(const _Key& __k)
-{
- size_type __r = 0;
- iterator __i = find(__k);
- if (__i != end())
- {
- iterator __e = end();
- do
- {
- erase(__i++);
- ++__r;
- } while (__i != __e && key_eq()(*__i, __k));
- }
- return __r;
-}
-
-template <class _Tp, class _Hash, class _Equal, class _Alloc>
-typename __hash_table<_Tp