Compare commits

..

2 Commits

Author SHA1 Message Date
aleos
ff700c2815 Cleans up check overall 2022-06-06 09:47:15 -04:00
aleos
bbb417dab0 Fixes an item comparison check when loading chars
* Fixes #4933.
* Adds a missing card slot check when validating items during character loading.
* Also adds the random options to the check.
Thanks to @lukasrmattos!
2022-06-03 15:03:21 -04:00
856 changed files with 83287 additions and 549009 deletions

View File

@ -1,9 +0,0 @@
# Massive EOL normalization & 'svn:eol-style native' flag setting for all txt/conf/h/c files.
# https://github.com/rathena/rathena/commit/637ae9a4dcde0d5885a18841d2f3875e06893c30
637ae9a4dcde0d5885a18841d2f3875e06893c30
# Applied AStyle code formating as discussed on tid:74602.
# https://github.com/rathena/rathena/commit/a7c32653f70bd420bdf5a621acdf3aea5c6e6002
a7c32653f70bd420bdf5a621acdf3aea5c6e6002
# Undid r16968: SVN Replaced with source:/trunk/src/@16966 (tid:74924).
# https://github.com/rathena/rathena/commit/a2bdc47dafb32f6d18ed350d8bbe79b8f679a049
a2bdc47dafb32f6d18ed350d8bbe79b8f679a049

38
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View File

@ -0,0 +1,38 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: type:bug
assignees: ''
---
<!-- NOTE: Anything within these brackets will be hidden on the preview of the Issue. -->
* **rAthena Hash**:
<!-- Please specify the rAthena [GitHub hash](https://help.github.com/articles/autolinked-references-and-urls/#commit-shas) on which you encountered this issue.
How to get your GitHub Hash:
1. cd your/rAthena/directory/
2. git rev-parse --short HEAD
3. Copy the resulting hash.
-->
* **Client Date**:
<!-- Please specify the client date you used. -->
* **Server Mode**:
<!-- Which mode does your server use: Pre-Renewal or Renewal? -->
* **Description of Issue**:
* Result: <!-- Describe the issue that you experienced in detail. -->
* Expected Result: <!-- Describe what you would expect to happen in detail. -->
* How to Reproduce: <!-- If you have not stated in the description of the result already, please give us a short guide how we can reproduce your issue. -->
* Official Information: <!-- If possible, provide information from official servers (kRO or other sources) which prove that the result is wrong. Please take into account that iRO (especially iRO Wiki) is not always the same as kRO. -->
<!-- * _NOTE: Make sure you quote ``` `@atcommands` ``` just like this so that you do not tag uninvolved GitHub users!_ -->
* **Modifications that may affect results**:
<!-- * Please provide any information that could influence the expected result. -->
<!-- * This can be either configurations you changed, database values you changed, or even external source modifications. -->

View File

@ -1,81 +0,0 @@
name: Bug Report
description: Create an Issue that details broken or unexpected behaviour
labels: ["type:bug"]
body:
- type: input
id: hash
attributes:
label: rAthena Hash
description: |
Please specify the rAthena [GitHub hash](https://help.github.com/articles/autolinked-references-and-urls/#commit-shas) on which you encountered this issue.
One way to get your hash is to type `git rev-parse --short HEAD` on your console.
validations:
required: true
- type: input
id: date
attributes:
label: Client Date
description: Specify the client date you are using when this Issue occured.
placeholder: YYYY-MM-DD
validations:
required: true
- type: dropdown
id: mode
attributes:
label: Server Mode
description: Specify the server-mode you are using when this Issue occured.
multiple: true
options:
- Pre-Renewal
- Renewal
validations:
required: true
- type: textarea
id: result
attributes:
label: Result
description: Describe the issue that you experienced in detail.
placeholder: |
1. In this environment...
2. With this config...
3. Trigger event '...'
4. See error...
validations:
required: true
- type: textarea
id: logs
attributes:
label: Relevant Log Output
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
render: Shell
validations:
required: false
- type: textarea
id: expected
attributes:
label: Expected Result
description: Describe what you would expect to happen in detail.
validations:
required: true
- type: textarea
id: howto
attributes:
label: How to Reproduce
description: If you have not stated in the description of the result already, please give us a short guide how we can reproduce your issue.
validations:
required: true
- type: textarea
id: info
attributes:
label: Official Information
description: If possible, provide information from official servers (kRO or other sources) which prove that the result is wrong. Please take into account that iRO (especially iRO Wiki) is not always the same as kRO.
validations:
required: true
- type: textarea
id: modifications
attributes:
label: Modifications that may affect results
description: |
If you are using any modifications, especially in /src/, you must type them here.
Even the smallest changes can cause things to break. We need to know what you have customized.
This can be either configurations you changed, database values you changed, or even external source modifications.

View File

@ -1,8 +0,0 @@
blank_issues_enabled: false
contact_links:
- name: rAthena Community Support
url: https://rathena.org/board/forum/3-support-releases/
about: Please ask and answer questions here in our forum.
- name: rAthena Discord
url: https://rathena.org/board/discord/
about: Chat with us in the Discord support channel.

View File

@ -0,0 +1,35 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: type:enhancement
assignees: ''
---
<!-- NOTE: Anything within these brackets will be hidden on the preview of the Feature Request. -->
**Is your request related to a missing feature?**
<!--
Provide a clear and concise description of what the feature pertains to.
-->
**Describe the solution you'd like**
<!--
Provide a clear and concise description of what you want to happen.
-->
**Describe alternatives you've considered**
<!--
Let us know about other solutions you've tried or researched.
-->
**Additional context**
<!--
Is there anything else you can add about the proposal?
You might want to link to related issues here if you haven't already.
-->

View File

@ -1,32 +0,0 @@
name: Feature Request
description: Suggest an idea for this project
labels: ["type:enhancement"]
body:
- type: dropdown
id: missing
attributes:
label: Is your request related to a missing official feature?
options:
- "Yes"
- "No"
validations:
required: true
- type: textarea
id: solution
attributes:
label: Describe the solution you'd like
description: Provide a clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: alternatives
attributes:
label: Describe alternatives you've considered
description: Let us know about other solutions you've tried or researched.
- type: textarea
id: context
attributes:
label: Additional context
description: |
Is there anything else you can add about the proposal?
You might want to link to related issues here if you haven't already.

View File

@ -1,92 +0,0 @@
name: Analyse servers with CodeQL
# analysis_codeql.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on:
workflow_dispatch:
push:
branches:
- master
pull_request:
paths:
# Always trigger all Github Actions if an action or something CI related was changed
- '.github/workflows/**'
- 'tools/ci/**'
# This workflow should run when a file in a source directory has been modified.
- 'src/**'
- '3rdparty/**'
jobs:
analyze:
# Github Actions checks for '[ci skip]', '[skip ci]', '[no ci]', '[skip actions]', or '[actions skip]' but not a hyphenated version.
# It's a catch-all incase a Pull Request has been opened and someone is on auto-pilot.
if: "!contains(github.event.head_commit.message, 'ci-skip')"
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
# The ubuntu-latest label currently points to ubuntu-20.04.
# Available: ubuntu-22.04, ubuntu-20.04
os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE']
steps:
- name: Checkout repository
uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v3
with:
# CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
# Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support
languages: cpp
# Trigger security and quality findings
# https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
# TODO: Resolve the issues and then enable it again
#queries: +security-and-quality
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE
if: ${{ matrix.mode == 'PRE' }}
run: |
echo "PRERE=yes" >> $GITHUB_ENV
- name: Variable Parsing - RE
if: ${{ matrix.mode == 'RE' }}
run: |
echo "PRERE=no" >> $GITHUB_ENV
- name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build.
# https://github.com/actions/virtual-environments/blob/main/images/linux/Ubuntu2004-Readme.md
run: |
sudo apt update
sudo apt install zlib1g-dev libpcre3-dev gcc-${{ matrix.gcc }} g++-${{ matrix.gcc }}
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
#- name: Autobuild
# uses: github/codeql-action/autobuild@v2
# ?? If the Autobuild fails above, remove it and uncomment the following
# three lines and modify them (or add more) to build your code if your
# project uses a compiled language
- name: Command - configure
env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-prere=${{ env.PRERE }} --enable-buildbot=yes'
run: ./configure $CONFIGURE_FLAGS
- name: Command - make clean
run: make clean
- name: Command - make server
run: make server
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v3

View File

@ -1,12 +1,7 @@
name: Build servers with Clang name: Build servers with Clang
# build_servers_clang.yml # build_servers_clang.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -27,14 +22,14 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-20.04] os: [ubuntu-18.04]
# Version list can be found on https://github.com/marketplace/actions/install-clang # Version list can be found on https://github.com/marketplace/actions/install-clang
clang: ['6.0', '7', '8', '9', '10', '11'] #, '12', '13'] clang: ['3.9', '4.0', '5.0', '6.0', '7', '8', '9', '10', '11'] #, '12', '13']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- name: Set up Clang - name: Set up Clang
uses: egor-tensin/setup-clang@v1 uses: egor-tensin/setup-clang@v1

View File

@ -1,12 +1,7 @@
name: Build servers with CMake name: Build servers with CMake
# build_servers_cmake.yml # build_servers_cmake.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -18,8 +13,6 @@ on:
# This workflow should run when a file in a source directory has been modified. # This workflow should run when a file in a source directory has been modified.
- 'src/**' - 'src/**'
- '3rdparty/**' - '3rdparty/**'
# This workflow should run whenever a CMake related file has been modified
- '**/CMakeLists.txt'
jobs: jobs:
build: build:
@ -29,12 +22,12 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-latest] os: [ubuntu-latest]
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
# Install latest CMake. # Install latest CMake.
- uses: lukka/get-cmake@latest - uses: lukka/get-cmake@latest

View File

@ -1,12 +1,7 @@
name: Build servers with GCC name: Build servers with GCC
# build_servers_gcc.yml # build_servers_gcc.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -27,18 +22,14 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-latest] os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists. # Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['9', '10', '11', '12'] gcc: ['7', '8', '9', '10']
# GCC 13 was removed from 22.04, include it as a separate job
include:
- os: ubuntu-24.04
gcc: 13
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- name: Update & Install packages - name: Update & Install packages
# Ubuntu runners already have most of the packages rAthena requires to build. # Ubuntu runners already have most of the packages rAthena requires to build.
@ -49,10 +40,8 @@ jobs:
- name: Command - configure - name: Command - configure
env: env:
CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }}' CONFIGURE_FLAGS: 'CC=gcc-${{ matrix.gcc }} CXX=g++-${{ matrix.gcc }} --enable-buildbot=yes'
# -Werror: to treat all warnings as errors run: ./configure $CONFIGURE_FLAGS
# -Wno-error=builtin-declaration-mismatch: otherwise ./configure checks fail
run: ./configure $CONFIGURE_FLAGS --enable-buildbot=yes CXXFLAGS='-Werror -Wno-error=builtin-declaration-mismatch'
- name: Command - make clean - name: Command - make clean
run: make clean run: make clean

View File

@ -1,12 +1,7 @@
name: Build servers in Pre-Renewal and Renewal name: Build servers in Pre-Renewal and Renewal
# build_servers_modes.yml # build_servers_modes.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -27,16 +22,16 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-latest] os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists. # Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['11'] gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal # We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE'] mode: ['PRE','RE']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler. # A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE - name: Variable Parsing - PRE

View File

@ -1,12 +1,7 @@
name: Build servers with MSVS name: Build servers with MSVS
# build_servers_msbuild.yml # build_servers_msbuild.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -34,15 +29,15 @@ jobs:
mode: ['PRE', 'RE'] mode: ['PRE', 'RE']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
- name: Add msbuild to PATH - name: Add msbuild to PATH
uses: microsoft/setup-msbuild@v2 uses: microsoft/setup-msbuild@v1.1
- name: Build solution in Debug - name: Build solution in Debug
if: ${{ matrix.mode == 'PRE' }} if: ${{ matrix.mode == 'PRE' }}
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT%3BPRERE" /warnaserror run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT%3BPRERE"
- name: Build solution in Debug - name: Build solution in Debug
if: ${{ matrix.mode == 'RE' }} if: ${{ matrix.mode == 'RE' }}
run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT" /warnaserror run: msbuild rAthena.sln -t:rebuild -property:Configuration=Debug /p:DefineConstants="BUILDBOT"

View File

@ -1,12 +1,7 @@
name: Build servers with different packet versions name: Build servers with different packet versions
# build_servers_packetversions.yml # build_servers_packetversions.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -27,18 +22,18 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-latest] os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists. # Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['11'] gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal # We run build checks for both Renewal and PRE-Renewal
mode: ['PRE','RE'] mode: ['PRE','RE']
# Check build success for different packet-versions # Check build success for different packet-versions
packetver: ['20211103', '20200902', '20200401', '20180620', '20151104'] packetver: ['20211103', '20200902', '20200401', '20180620', '20151104']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler. # A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE - name: Variable Parsing - PRE

View File

@ -1,12 +1,7 @@
name: Build servers in VIP mode name: Build servers in VIP mode
# build_servers_vip.yml # build_servers_vip.yml
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -27,16 +22,16 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-latest] os: [ubuntu-latest]
# Older versions of GCC are not available via unaltered aptitude repo lists. # Older versions of GCC are not available via unaltered aptitude repo lists.
gcc: ['11'] gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal # We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE'] mode: ['PRE', 'RE']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler. # A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE - name: Variable Parsing - PRE

View File

@ -4,12 +4,7 @@ name: Validate NPC Scripts and DB Changes
# For NPC and DB validation we only need two builds: one of Renewal and one for Pre-Renewal checks. # For NPC and DB validation we only need two builds: one of Renewal and one for Pre-Renewal checks.
# NPC scripts and database files are not platform dependent, so we can achieve this validation using only a simple linux setup. # NPC scripts and database files are not platform dependent, so we can achieve this validation using only a simple linux setup.
concurrency:
group: ${{ github.repository }}-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.ref != 'refs/heads/master' }}
on: on:
workflow_dispatch:
push: push:
branches: branches:
- master - master
@ -30,16 +25,16 @@ jobs:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
strategy: strategy:
matrix: matrix:
# The ubuntu-latest label currently points to ubuntu-22.04. # The ubuntu-latest label currently points to ubuntu-18.04.
# Available: ubuntu-22.04, ubuntu-20.04 # Available: ubuntu-20.04, ubuntu-18.04
os: [ubuntu-latest] os: [ubuntu-latest]
# Only a single version of GCC is required for validating NPC scripts and database changes. # Only a single version of GCC is required for validating NPC scripts and database changes.
gcc: ['11'] gcc: ['10']
# We run build checks for both Renewal and PRE-Renewal # We run build checks for both Renewal and PRE-Renewal
mode: ['PRE', 'RE'] mode: ['PRE', 'RE']
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v2
# A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler. # A simple 'yes' and 'no' can be confusing, so we use names to display in the current job then convert them for use in the compiler.
- name: Variable Parsing - PRE - name: Variable Parsing - PRE

20
.gitignore vendored
View File

@ -1,5 +1,6 @@
autom4te.cache/ /autom4te.cache/output.0
/autom4te.cache/requests
/autom4te.cache/traces.0
#Global #Global
.vscode .vscode
.Apple* .Apple*
@ -39,10 +40,8 @@ Thumbs.db
/Makefile /Makefile
/Makefile.cache /Makefile.cache
/map-server /map-server
/map-server-generator
/mapcache /mapcache
/nbproject /nbproject
/web-server
/yaml2sql /yaml2sql
/yamlupgrade /yamlupgrade
@ -57,10 +56,6 @@ Thumbs.db
# /3rdparty/yaml-cpp/ # /3rdparty/yaml-cpp/
/3rdparty/yaml-cpp/Makefile /3rdparty/yaml-cpp/Makefile
# /3rdparty/httplib/
/3rdparty/httplib/Makefile
/3rdparty/httplib/obj
# /db/ # /db/
/db/import /db/import
@ -97,10 +92,6 @@ Thumbs.db
/src/map/obj_sql /src/map/obj_sql
/src/map/pcre.hpp /src/map/pcre.hpp
# /src/web
/src/web/Makefile
/src/web/obj
# /src/tool/ # /src/tool/
/src/tool/Makefile /src/tool/Makefile
/src/tool/obj_all /src/tool/obj_all
@ -134,10 +125,8 @@ Thumbs.db
/mapserv.bat /mapserv.bat
/runserver.bat /runserver.bat
/serv.bat /serv.bat
/webserv.bat
/yaml2sql.bat /yaml2sql.bat
/yamlupgrade.bat /yamlupgrade.bat
/navigenerator.bat
# dlls # dlls
/libmysql.dll /libmysql.dll
@ -146,6 +135,3 @@ Thumbs.db
# CMakeFiles # CMakeFiles
/CMakeFiles/ /CMakeFiles/
# generated files
generated

View File

@ -47,8 +47,6 @@ macro( CONFIGURE_WITH_LOCAL_OR_SYSTEM name )
endmacro( CONFIGURE_WITH_LOCAL_OR_SYSTEM ) endmacro( CONFIGURE_WITH_LOCAL_OR_SYSTEM )
add_subdirectory( httplib )
add_subdirectory( json )
add_subdirectory( libconfig ) add_subdirectory( libconfig )
add_subdirectory( mysql ) add_subdirectory( mysql )
add_subdirectory( pcre ) add_subdirectory( pcre )

3
3rdparty/README.txt vendored
View File

@ -1,10 +1,7 @@
This folder contains everything related to 3rdparty code or tools. This folder contains everything related to 3rdparty code or tools.
cmake - scripts for the cmake build system (http://www.cmake.org) cmake - scripts for the cmake build system (http://www.cmake.org)
httplib - library for http web service (https://github.com/yhirose/cpp-httplib/commit/a9cf09795170a72372cbeb3feef3851b859c0e33)
libconfig - library for processing structured configuration files (http://www.hyperrealm.com/libconfig/) libconfig - library for processing structured configuration files (http://www.hyperrealm.com/libconfig/)
mysql - library for MySQL Community Server (http://www.mysql.com) mysql - library for MySQL Community Server (http://www.mysql.com)
pcre - library for Perl Compatible Regular Expressions (http://www.pcre.org) pcre - library for Perl Compatible Regular Expressions (http://www.pcre.org)
zlib - library for DEFLATE lossless compression algorithm (http://www.zlib.net) zlib - library for DEFLATE lossless compression algorithm (http://www.zlib.net)
json - library for nlohmann json (https://github.com/nlohmann/json/tree/4b2c8ce6bcfe7f39f2bb9e680c1e7a4d67c2dd48)
yaml-cpp - library for yaml (https://github.com/jbeder/yaml-cpp/tree/0e6e28d1a38224fc8172fae0109ea7f673c096db)

View File

@ -1,38 +0,0 @@
cmake_minimum_required(VERSION 2.8)
if ( NOT ENABLE_WEB_SERVER )
return()
endif( NOT ENABLE_WEB_SERVER )
SET (this_target httplib)
PROJECT(${this_target})
find_path ( HTTPLIB_INCLUDE_DIRS "httplib.h"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}"
NO_DEFAULT_PATH )
find_path ( HTTPLIB_SOURCE_DIR "httplib.cc"
PATHS "${CMAKE_CURRENT_SOURCE_DIR}"
NO_DEFAULT_PATH )
mark_as_advanced( HTTPLIB_INCLUDE_DIRS )
mark_as_advanced( HTTPLIB_SOURCE_DIR )
set ( HTTPLIB_HEADERS
"${HTTPLIB_INCLUDE_DIRS}/httplib.h"
CACHE INTERNAL "httplib headers" )
set ( HTTPLIB_SOURCES
"${HTTPLIB_SOURCE_DIR}/httplib.cc"
CACHE INTERNAL "httplib sources" )
set ( HTTPLIB_DEFINITIONS
"-std=c++11"
CACHE INTERNAL "http definitions" )
include_directories( ${HTTPLIB_INCLUDE_DIRS} ${HTTPLIB_SOURCE_DIR} )
ADD_LIBRARY( ${this_target} STATIC ${HTTPLIB_SOURCES} )
if (NOT WIN32)
target_compile_definitions(${this_target} PUBLIC "CPPHTTPLIB_SEND_FLAGS=MSG_NOSIGNAL")
endif()

View File

@ -1,43 +0,0 @@
HTTPLIB_OBJ = $(shell find * -type f -name "*.cc" | sed -e "s/\.cc/\.o/g")
HTTPLIB_DIR_OBJ = $(HTTPLIB_OBJ:%=obj/%)
HTTPLIB_H = $(shell find * -type f -name "*.h")
HTTPLIB_AR = obj/httplib.a
CXXFLAG =-std=c++11
HTTPLIB_DEPENDS=httplib
@SET_MAKE@
#####################################################################
.PHONY : all clean help httplib
all: $(HTTPLIB_DEPENDS)
clean:
@echo " CLEAN httplib"
@rm -rf obj *.o
help:
@echo "possible targets are 'all' 'clean' 'help'"
@echo "'httplib' - build $(HTTPLIB_AR)
@echo "'all' - builds $(HTTPLIB_DIR_OBJ)"
@echo "'clean' - deletes $(HTTPLIB_DIR_OBJ)"
@echo "'help' - outputs this message"
#####################################################################
obj:
@echo " MKDIR obj"
@mkdir -p obj
obj/%.o: %.cc $(HTTPLIB_H)
@echo " CXX $<"
@@CXX@ $(CXXFLAG) @CFLAGS_AR@ @CPPFLAGS@ -DCPPHTTPLIB_SEND_FLAGS=MSG_NOSIGNAL -g -c $(OUTPUT_OPTION) $<
httplib: obj $(HTTPLIB_DIR_OBJ) $(HTTPLIB_AR)
$(HTTPLIB_AR): $(HTTPLIB_DIR_OBJ)
@echo " AR $@"
@@AR@ rcs obj/httplib.a $(HTTPLIB_DIR_OBJ)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,164 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<ItemGroup>
<ClInclude Include="httplib.h" />
</ItemGroup>
<ItemGroup>
<ClCompile Include="httplib.cc" />
</ItemGroup>
<PropertyGroup Label="Globals">
<Keyword>Win32Proj</Keyword>
<RootNamespace>libconfig</RootNamespace>
<ProjectGuid>{7A1A25BC-2CF7-44B2-8CAF-B4273B510FC6}</ProjectGuid>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>StaticLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>$(DefaultPlatformToolset)</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<OutDir>$(SolutionDir).vs\build\</OutDir>
<IntDir>$(SolutionDir).vs\build\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<OutDir>$(SolutionDir).vs\build\</OutDir>
<IntDir>$(SolutionDir).vs\build\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<OutDir>$(SolutionDir).vs\build\</OutDir>
<IntDir>$(SolutionDir).vs\build\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<OutDir>$(SolutionDir).vs\build\</OutDir>
<IntDir>$(SolutionDir).vs\build\$(ProjectName)\$(Platform)\$(Configuration)\</IntDir>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>
</PrecompiledHeader>
<WarningLevel>Level3</WarningLevel>
<Optimization>Disabled</Optimization>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>
</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile>
<Link>
<SubSystem>Windows</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
</Link>
</ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View File

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<Extensions>h;hh;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="httplib.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="httplib.cc">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

View File

@ -1,7 +0,0 @@
cmake_minimum_required(VERSION 2.8)
set (JSON_INCLUDE_DIRS
"${CMAKE_CURRENT_SOURCE_DIR}/include"
CACHE INTERNAL "json include dir" )
mark_as_advanced( JSON_INCLUDE_DIRS )

View File

@ -1,21 +0,0 @@
MIT License
Copyright (c) 2013-2022 Niels Lohmann
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.

File diff suppressed because it is too large Load Diff

View File

@ -1,177 +0,0 @@
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
// | | |__ | | | | | | version 3.11.2
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT
#ifndef INCLUDE_NLOHMANN_JSON_FWD_HPP_
#define INCLUDE_NLOHMANN_JSON_FWD_HPP_
#include <cstdint> // int64_t, uint64_t
#include <map> // map
#include <memory> // allocator
#include <string> // string
#include <vector> // vector
// #include <nlohmann/detail/abi_macros.hpp>
// __ _____ _____ _____
// __| | __| | | | JSON for Modern C++
// | | |__ | | | | | | version 3.11.2
// |_____|_____|_____|_|___| https://github.com/nlohmann/json
//
// SPDX-FileCopyrightText: 2013-2022 Niels Lohmann <https://nlohmann.me>
// SPDX-License-Identifier: MIT
// This file contains all macro definitions affecting or depending on the ABI
#ifndef JSON_SKIP_LIBRARY_VERSION_CHECK
#if defined(NLOHMANN_JSON_VERSION_MAJOR) && defined(NLOHMANN_JSON_VERSION_MINOR) && defined(NLOHMANN_JSON_VERSION_PATCH)
#if NLOHMANN_JSON_VERSION_MAJOR != 3 || NLOHMANN_JSON_VERSION_MINOR != 11 || NLOHMANN_JSON_VERSION_PATCH != 2
#warning "Already included a different version of the library!"
#endif
#endif
#endif
#define NLOHMANN_JSON_VERSION_MAJOR 3 // NOLINT(modernize-macro-to-enum)
#define NLOHMANN_JSON_VERSION_MINOR 11 // NOLINT(modernize-macro-to-enum)
#define NLOHMANN_JSON_VERSION_PATCH 2 // NOLINT(modernize-macro-to-enum)
#ifndef JSON_DIAGNOSTICS
#define JSON_DIAGNOSTICS 0
#endif
#ifndef JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON 0
#endif
#if JSON_DIAGNOSTICS
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS _diag
#else
#define NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS
#endif
#if JSON_USE_LEGACY_DISCARDED_VALUE_COMPARISON
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON _ldvcmp
#else
#define NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON
#endif
#ifndef NLOHMANN_JSON_NAMESPACE_NO_VERSION
#define NLOHMANN_JSON_NAMESPACE_NO_VERSION 0
#endif
// Construct the namespace ABI tags component
#define NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b) json_abi ## a ## b
#define NLOHMANN_JSON_ABI_TAGS_CONCAT(a, b) \
NLOHMANN_JSON_ABI_TAGS_CONCAT_EX(a, b)
#define NLOHMANN_JSON_ABI_TAGS \
NLOHMANN_JSON_ABI_TAGS_CONCAT( \
NLOHMANN_JSON_ABI_TAG_DIAGNOSTICS, \
NLOHMANN_JSON_ABI_TAG_LEGACY_DISCARDED_VALUE_COMPARISON)
// Construct the namespace version component
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch) \
_v ## major ## _ ## minor ## _ ## patch
#define NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(major, minor, patch) \
NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT_EX(major, minor, patch)
#if NLOHMANN_JSON_NAMESPACE_NO_VERSION
#define NLOHMANN_JSON_NAMESPACE_VERSION
#else
#define NLOHMANN_JSON_NAMESPACE_VERSION \
NLOHMANN_JSON_NAMESPACE_VERSION_CONCAT(NLOHMANN_JSON_VERSION_MAJOR, \
NLOHMANN_JSON_VERSION_MINOR, \
NLOHMANN_JSON_VERSION_PATCH)
#endif
// Combine namespace components
#define NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b) a ## b
#define NLOHMANN_JSON_NAMESPACE_CONCAT(a, b) \
NLOHMANN_JSON_NAMESPACE_CONCAT_EX(a, b)
#ifndef NLOHMANN_JSON_NAMESPACE
#define NLOHMANN_JSON_NAMESPACE \
nlohmann::NLOHMANN_JSON_NAMESPACE_CONCAT( \
NLOHMANN_JSON_ABI_TAGS, \
NLOHMANN_JSON_NAMESPACE_VERSION)
#endif
#ifndef NLOHMANN_JSON_NAMESPACE_BEGIN
#define NLOHMANN_JSON_NAMESPACE_BEGIN \
namespace nlohmann \
{ \
inline namespace NLOHMANN_JSON_NAMESPACE_CONCAT( \
NLOHMANN_JSON_ABI_TAGS, \
NLOHMANN_JSON_NAMESPACE_VERSION) \
{
#endif
#ifndef NLOHMANN_JSON_NAMESPACE_END
#define NLOHMANN_JSON_NAMESPACE_END \
} /* namespace (inline namespace) NOLINT(readability/namespace) */ \
} // namespace nlohmann
#endif
/*!
@brief namespace for Niels Lohmann
@see https://github.com/nlohmann
@since version 1.0.0
*/
NLOHMANN_JSON_NAMESPACE_BEGIN
/*!
@brief default JSONSerializer template argument
This serializer ignores the template arguments and uses ADL
([argument-dependent lookup](https://en.cppreference.com/w/cpp/language/adl))
for serialization.
*/
template<typename T = void, typename SFINAE = void>
struct adl_serializer;
/// a class to store JSON values
/// @sa https://json.nlohmann.me/api/basic_json/
template<template<typename U, typename V, typename... Args> class ObjectType =
std::map,
template<typename U, typename... Args> class ArrayType = std::vector,
class StringType = std::string, class BooleanType = bool,
class NumberIntegerType = std::int64_t,
class NumberUnsignedType = std::uint64_t,
class NumberFloatType = double,
template<typename U> class AllocatorType = std::allocator,
template<typename T, typename SFINAE = void> class JSONSerializer =
adl_serializer,
class BinaryType = std::vector<std::uint8_t>, // cppcheck-suppress syntaxError
class CustomBaseClass = void>
class basic_json;
/// @brief JSON Pointer defines a string syntax for identifying a specific value within a JSON document
/// @sa https://json.nlohmann.me/api/json_pointer/
template<typename RefStringType>
class json_pointer;
/*!
@brief default specialization
@sa https://json.nlohmann.me/api/json/
*/
using json = basic_json<>;
/// @brief a minimal map-like container that preserves insertion order
/// @sa https://json.nlohmann.me/api/ordered_map/
template<class Key, class T, class IgnoredLess, class Allocator>
struct ordered_map;
/// @brief specialization that maintains the insertion order of object keys
/// @sa https://json.nlohmann.me/api/ordered_json/
using ordered_json = basic_json<nlohmann::ordered_map>;
NLOHMANN_JSON_NAMESPACE_END
#endif // INCLUDE_NLOHMANN_JSON_FWD_HPP_

View File

@ -108,7 +108,6 @@
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -123,7 +122,6 @@
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;_DEBUG;_LIB;_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -140,7 +138,6 @@
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>
@ -159,7 +156,6 @@
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>YY_USE_CONST;LIBCONFIG_STATIC;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<Link> <Link>
<SubSystem>Windows</SubSystem> <SubSystem>Windows</SubSystem>

View File

@ -2,11 +2,6 @@
#line 4 "scanner.c" #line 4 "scanner.c"
#ifdef _MSC_VER
#pragma warning( push )
#pragma warning( disable : 4267 )
#endif
#define YY_INT_ALIGNED short int #define YY_INT_ALIGNED short int
/* A lexical scanner generated by flex */ /* A lexical scanner generated by flex */
@ -2370,7 +2365,3 @@ void libconfig_yyfree (void * ptr , yyscan_t yyscanner)
#define YYTABLES_NAME "yytables" #define YYTABLES_NAME "yytables"
#line 192 "scanner.l" #line 192 "scanner.l"
#ifdef _MSC_VER
#pragma warning( pop )
#endif

View File

@ -103,7 +103,6 @@
<PreprocessorDefinitions>WIN32;_WINDOWS;CMAKE_INTDIR="Debug";_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_WINDOWS;CMAKE_INTDIR="Debug";_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ObjectFileName>$(IntDir)</ObjectFileName> <ObjectFileName>$(IntDir)</ObjectFileName>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;CMAKE_INTDIR=\"Debug\";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;CMAKE_INTDIR=\"Debug\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -139,7 +138,6 @@
<PreprocessorDefinitions>WIN32;_WINDOWS;CMAKE_INTDIR="Debug";_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_WINDOWS;CMAKE_INTDIR="Debug";_ITERATOR_DEBUG_LEVEL=0;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ObjectFileName>$(IntDir)</ObjectFileName> <ObjectFileName>$(IntDir)</ObjectFileName>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;CMAKE_INTDIR=\"Debug\";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;CMAKE_INTDIR=\"Debug\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -175,7 +173,6 @@
<DebugInformationFormat> <DebugInformationFormat>
</DebugInformationFormat> </DebugInformationFormat>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions)</PreprocessorDefinitions>
@ -211,7 +208,6 @@
<DebugInformationFormat> <DebugInformationFormat>
</DebugInformationFormat> </DebugInformationFormat>
<LanguageStandard>stdcpp17</LanguageStandard> <LanguageStandard>stdcpp17</LanguageStandard>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
</ClCompile> </ClCompile>
<ResourceCompile> <ResourceCompile>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions)</PreprocessorDefinitions> <PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;CMAKE_INTDIR=\"Release\";%(PreprocessorDefinitions)</PreprocessorDefinitions>

View File

@ -21,7 +21,6 @@ set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/ostream_wrapper.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/ostream_wrapper.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/null.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/null.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noncopyable.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/noncopyable.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/noexcept.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/mark.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/mark.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/exceptions.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/exceptions.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/eventhandler.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/eventhandler.h"
@ -31,7 +30,6 @@ set( YAML_HEADERS
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitterdef.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/emitterdef.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/emitfromevents.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/emitfromevents.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/dll.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/dll.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/depthguard.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/binary.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/binary.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/anchor.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/anchor.h"
"${YAML_INCLUDE_DIRS}/yaml-cpp/node/type.h" "${YAML_INCLUDE_DIRS}/yaml-cpp/node/type.h"
@ -48,7 +46,6 @@ set( YAML_HEADERS
set( YAML_SOURCES set( YAML_SOURCES
"${YAML_SOURCE_DIR}/binary.cpp" "${YAML_SOURCE_DIR}/binary.cpp"
"${YAML_SOURCE_DIR}/convert.cpp" "${YAML_SOURCE_DIR}/convert.cpp"
"${YAML_SOURCE_DIR}/depthguard.cpp"
"${YAML_SOURCE_DIR}/directives.cpp" "${YAML_SOURCE_DIR}/directives.cpp"
"${YAML_SOURCE_DIR}/emit.cpp" "${YAML_SOURCE_DIR}/emit.cpp"
"${YAML_SOURCE_DIR}/emitfromevents.cpp" "${YAML_SOURCE_DIR}/emitfromevents.cpp"
@ -84,4 +81,3 @@ set( YAML_DEFINITIONS
include_directories(${YAML_INCLUDE_DIRS} ${YAML_SOURCE_DIR}) include_directories(${YAML_INCLUDE_DIRS} ${YAML_SOURCE_DIR})
#message(STATUS "YAML_INCLUDE_DIRS : ${YAML_INCLUDE_DIRS}, YAML_SOURCE_DIR=${YAML_SOURCE_DIR}") #message(STATUS "YAML_INCLUDE_DIRS : ${YAML_INCLUDE_DIRS}, YAML_SOURCE_DIR=${YAML_SOURCE_DIR}")
ADD_LIBRARY(${this_target} STATIC ${YAML_SOURCES} ) ADD_LIBRARY(${this_target} STATIC ${YAML_SOURCES} )
target_compile_definitions(${this_target} PUBLIC "-DYAML_CPP_STATIC_DEFINE")

View File

@ -4,7 +4,7 @@ YAML_CPP_DIR_OBJ = $(YAML_CPP_OBJ:%=obj/%)
YAML_CPP_H = $(shell find * -type f -name "*.h") YAML_CPP_H = $(shell find * -type f -name "*.h")
YAML_CPP_AR = obj/yaml-cpp.a YAML_CPP_AR = obj/yaml-cpp.a
CXXFLAG =-std=c++17 -DYAML_CPP_STATIC_DEFINE CXXFLAG =-std=c++11
INC=-Iinclude INC=-Iinclude
@SET_MAKE@ @SET_MAKE@

View File

@ -10,7 +10,7 @@
#include <cstddef> #include <cstddef>
namespace YAML { namespace YAML {
using anchor_t = std::size_t; typedef std::size_t anchor_t;
const anchor_t NullAnchor = 0; const anchor_t NullAnchor = 0;
} }

View File

@ -19,13 +19,9 @@ YAML_CPP_API std::vector<unsigned char> DecodeBase64(const std::string &input);
class YAML_CPP_API Binary { class YAML_CPP_API Binary {
public: public:
Binary() : m_unownedData(0), m_unownedSize(0) {}
Binary(const unsigned char *data_, std::size_t size_) Binary(const unsigned char *data_, std::size_t size_)
: m_data{}, m_unownedData(data_), m_unownedSize(size_) {} : m_unownedData(data_), m_unownedSize(size_) {}
Binary() : Binary(nullptr, 0) {}
Binary(const Binary &) = default;
Binary(Binary &&) = default;
Binary &operator=(const Binary &) = default;
Binary &operator=(Binary &&) = default;
bool owned() const { return !m_unownedData; } bool owned() const { return !m_unownedData; }
std::size_t size() const { return owned() ? m_data.size() : m_unownedSize; } std::size_t size() const { return owned() ? m_data.size() : m_unownedSize; }
@ -39,7 +35,7 @@ class YAML_CPP_API Binary {
rhs.clear(); rhs.clear();
rhs.resize(m_unownedSize); rhs.resize(m_unownedSize);
std::copy(m_unownedData, m_unownedData + m_unownedSize, rhs.begin()); std::copy(m_unownedData, m_unownedData + m_unownedSize, rhs.begin());
m_unownedData = nullptr; m_unownedData = 0;
m_unownedSize = 0; m_unownedSize = 0;
} else { } else {
m_data.swap(rhs); m_data.swap(rhs);
@ -66,6 +62,6 @@ class YAML_CPP_API Binary {
const unsigned char *m_unownedData; const unsigned char *m_unownedData;
std::size_t m_unownedSize; std::size_t m_unownedSize;
}; };
} // namespace YAML }
#endif // BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // BASE64_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -22,7 +22,6 @@ namespace YAML {
template <class T> template <class T>
class AnchorDict { class AnchorDict {
public: public:
AnchorDict() : m_data{} {}
void Register(anchor_t anchor, T value) { void Register(anchor_t anchor, T value) {
if (anchor > m_data.size()) { if (anchor > m_data.size()) {
m_data.resize(anchor); m_data.resize(anchor);
@ -35,6 +34,6 @@ class AnchorDict {
private: private:
std::vector<T> m_data; std::vector<T> m_data;
}; };
} // namespace YAML }
#endif // ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // ANCHORDICT_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -15,12 +15,10 @@ class Parser;
// GraphBuilderInterface // GraphBuilderInterface
// . Abstraction of node creation // . Abstraction of node creation
// . pParentNode is always nullptr or the return value of one of the NewXXX() // . pParentNode is always NULL or the return value of one of the NewXXX()
// functions. // functions.
class GraphBuilderInterface { class GraphBuilderInterface {
public: public:
virtual ~GraphBuilderInterface() = 0;
// Create and return a new node with a null value. // Create and return a new node with a null value.
virtual void *NewNull(const Mark &mark, void *pParentNode) = 0; virtual void *NewNull(const Mark &mark, void *pParentNode) = 0;
@ -73,9 +71,9 @@ class GraphBuilder : public GraphBuilderInterface {
typedef typename Impl::Map Map; typedef typename Impl::Map Map;
GraphBuilder(Impl &impl) : m_impl(impl) { GraphBuilder(Impl &impl) : m_impl(impl) {
Map *pMap = nullptr; Map *pMap = NULL;
Sequence *pSeq = nullptr; Sequence *pSeq = NULL;
Node *pNode = nullptr; Node *pNode = NULL;
// Type consistency checks // Type consistency checks
pNode = pMap; pNode = pMap;

View File

@ -1,77 +0,0 @@
#ifndef DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000
#define DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
#endif
#include "exceptions.h"
namespace YAML {
/**
* @brief The DeepRecursion class
* An exception class which is thrown by DepthGuard. Ideally it should be
* a member of DepthGuard. However, DepthGuard is a templated class which means
* that any catch points would then need to know the template parameters. It is
* simpler for clients to not have to know at the catch point what was the
* maximum depth.
*/
class DeepRecursion : public ParserException {
public:
virtual ~DeepRecursion() = default;
DeepRecursion(int depth, const Mark& mark_, const std::string& msg_);
// Returns the recursion depth when the exception was thrown
int depth() const {
return m_depth;
}
private:
int m_depth = 0;
};
/**
* @brief The DepthGuard class
* DepthGuard takes a reference to an integer. It increments the integer upon
* construction of DepthGuard and decrements the integer upon destruction.
*
* If the integer would be incremented past max_depth, then an exception is
* thrown. This is ideally geared toward guarding against deep recursion.
*
* @param max_depth
* compile-time configurable maximum depth.
*/
template <int max_depth = 2000>
class DepthGuard final {
public:
DepthGuard(int & depth_, const Mark& mark_, const std::string& msg_) : m_depth(depth_) {
++m_depth;
if ( max_depth <= m_depth ) {
throw DeepRecursion{m_depth, mark_, msg_};
}
}
DepthGuard(const DepthGuard & copy_ctor) = delete;
DepthGuard(DepthGuard && move_ctor) = delete;
DepthGuard & operator=(const DepthGuard & copy_assign) = delete;
DepthGuard & operator=(DepthGuard && move_assign) = delete;
~DepthGuard() {
--m_depth;
}
int current_depth() const {
return m_depth;
}
private:
int & m_depth;
};
} // namespace YAML
#endif // DEPTH_GUARD_H_00000000000000000000000000000000000000000000000000000000

View File

@ -1,61 +1,33 @@
#ifndef DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #ifndef DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#define DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #define DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66
// Definition YAML_CPP_STATIC_DEFINE using to building YAML-CPP as static #if defined(_MSC_VER) || \
// library (definition created by CMake or defined manually) (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
// Definition yaml_cpp_EXPORTS using to building YAML-CPP as dll/so library #pragma once
// (definition created by CMake or defined manually)
#ifdef YAML_CPP_STATIC_DEFINE
# define YAML_CPP_API
# define YAML_CPP_NO_EXPORT
#else
# if defined(_MSC_VER) || defined(__MINGW32__) || defined(__MINGW64__)
# ifndef YAML_CPP_API
# ifdef yaml_cpp_EXPORTS
/* We are building this library */
# pragma message( "Defining YAML_CPP_API for DLL export" )
# define YAML_CPP_API __declspec(dllexport)
# else
/* We are using this library */
# pragma message( "Defining YAML_CPP_API for DLL import" )
# define YAML_CPP_API __declspec(dllimport)
# endif
# endif
# ifndef YAML_CPP_NO_EXPORT
# define YAML_CPP_NO_EXPORT
# endif
# else /* No _MSC_VER */
# ifndef YAML_CPP_API
# ifdef yaml_cpp_EXPORTS
/* We are building this library */
# define YAML_CPP_API __attribute__((visibility("default")))
# else
/* We are using this library */
# define YAML_CPP_API __attribute__((visibility("default")))
# endif
# endif
# ifndef YAML_CPP_NO_EXPORT
# define YAML_CPP_NO_EXPORT __attribute__((visibility("hidden")))
# endif
# endif /* _MSC_VER */
#endif /* YAML_CPP_STATIC_DEFINE */
#ifndef YAML_CPP_DEPRECATED
# ifdef _MSC_VER
# define YAML_CPP_DEPRECATED __declspec(deprecated)
# else
# define YAML_CPP_DEPRECATED __attribute__ ((__deprecated__))
# endif
#endif #endif
#ifndef YAML_CPP_DEPRECATED_EXPORT // The following ifdef block is the standard way of creating macros which make
# define YAML_CPP_DEPRECATED_EXPORT YAML_CPP_API YAML_CPP_DEPRECATED // exporting from a DLL simpler. All files within this DLL are compiled with the
#endif // yaml_cpp_EXPORTS symbol defined on the command line. This symbol should not
// be defined on any project that uses this DLL. This way any other project
// whose source files include this file see YAML_CPP_API functions as being
// imported from a DLL, whereas this DLL sees symbols defined with this macro as
// being exported.
#undef YAML_CPP_API
#ifndef YAML_CPP_DEPRECATED_NO_EXPORT #ifdef YAML_CPP_DLL // Using or Building YAML-CPP DLL (definition defined
# define YAML_CPP_DEPRECATED_NO_EXPORT YAML_CPP_NO_EXPORT YAML_CPP_DEPRECATED // manually)
#endif #ifdef yaml_cpp_EXPORTS // Building YAML-CPP DLL (definition created by CMake
// or defined manually)
// #pragma message( "Defining YAML_CPP_API for DLL export" )
#define YAML_CPP_API __declspec(dllexport)
#else // yaml_cpp_EXPORTS
// #pragma message( "Defining YAML_CPP_API for DLL import" )
#define YAML_CPP_API __declspec(dllimport)
#endif // yaml_cpp_EXPORTS
#else // YAML_CPP_DLL
#define YAML_CPP_API
#endif // YAML_CPP_DLL
#endif /* DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 */ #endif // DLL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -24,21 +24,21 @@ class EmitFromEvents : public EventHandler {
public: public:
EmitFromEvents(Emitter& emitter); EmitFromEvents(Emitter& emitter);
void OnDocumentStart(const Mark& mark) override; virtual void OnDocumentStart(const Mark& mark);
void OnDocumentEnd() override; virtual void OnDocumentEnd();
void OnNull(const Mark& mark, anchor_t anchor) override; virtual void OnNull(const Mark& mark, anchor_t anchor);
void OnAlias(const Mark& mark, anchor_t anchor) override; virtual void OnAlias(const Mark& mark, anchor_t anchor);
void OnScalar(const Mark& mark, const std::string& tag, virtual void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value) override; anchor_t anchor, const std::string& value);
void OnSequenceStart(const Mark& mark, const std::string& tag, virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override; anchor_t anchor, EmitterStyle::value style);
void OnSequenceEnd() override; virtual void OnSequenceEnd();
void OnMapStart(const Mark& mark, const std::string& tag, virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override; anchor_t anchor, EmitterStyle::value style);
void OnMapEnd() override; virtual void OnMapEnd();
private: private:
void BeginNode(); void BeginNode();

View File

@ -7,18 +7,16 @@
#pragma once #pragma once
#endif #endif
#include <cmath>
#include <cstddef> #include <cstddef>
#include <limits>
#include <memory> #include <memory>
#include <sstream> #include <sstream>
#include <string> #include <string>
#include <type_traits>
#include "yaml-cpp/binary.h" #include "yaml-cpp/binary.h"
#include "yaml-cpp/dll.h" #include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterdef.h" #include "yaml-cpp/emitterdef.h"
#include "yaml-cpp/emittermanip.h" #include "yaml-cpp/emittermanip.h"
#include "yaml-cpp/noncopyable.h"
#include "yaml-cpp/null.h" #include "yaml-cpp/null.h"
#include "yaml-cpp/ostream_wrapper.h" #include "yaml-cpp/ostream_wrapper.h"
@ -30,12 +28,10 @@ struct _Null;
namespace YAML { namespace YAML {
class EmitterState; class EmitterState;
class YAML_CPP_API Emitter { class YAML_CPP_API Emitter : private noncopyable {
public: public:
Emitter(); Emitter();
explicit Emitter(std::ostream& stream); explicit Emitter(std::ostream& stream);
Emitter(const Emitter&) = delete;
Emitter& operator=(const Emitter&) = delete;
~Emitter(); ~Emitter();
// output // output
@ -59,7 +55,6 @@ class YAML_CPP_API Emitter {
bool SetPostCommentIndent(std::size_t n); bool SetPostCommentIndent(std::size_t n);
bool SetFloatPrecision(std::size_t n); bool SetFloatPrecision(std::size_t n);
bool SetDoublePrecision(std::size_t n); bool SetDoublePrecision(std::size_t n);
void RestoreGlobalModifiedSettings();
// local setters // local setters
Emitter& SetLocalValue(EMITTER_MANIP value); Emitter& SetLocalValue(EMITTER_MANIP value);
@ -125,7 +120,6 @@ class YAML_CPP_API Emitter {
void SpaceOrIndentTo(bool requireSpace, std::size_t indent); void SpaceOrIndentTo(bool requireSpace, std::size_t indent);
const char* ComputeFullBoolName(bool b) const; const char* ComputeFullBoolName(bool b) const;
const char* ComputeNullName() const;
bool CanEmitNewline() const; bool CanEmitNewline() const;
private: private:
@ -159,27 +153,7 @@ inline Emitter& Emitter::WriteStreamable(T value) {
std::stringstream stream; std::stringstream stream;
SetStreamablePrecision<T>(stream); SetStreamablePrecision<T>(stream);
stream << value;
bool special = false;
if (std::is_floating_point<T>::value) {
if ((std::numeric_limits<T>::has_quiet_NaN ||
std::numeric_limits<T>::has_signaling_NaN) &&
std::isnan(value)) {
special = true;
stream << ".nan";
} else if (std::numeric_limits<T>::has_infinity && std::isinf(value)) {
special = true;
if (std::signbit(value)) {
stream << "-.inf";
} else {
stream << ".inf";
}
}
}
if (!special) {
stream << value;
}
m_stream << stream.str(); m_stream << stream.str();
StartedScalar(); StartedScalar();
@ -276,6 +250,6 @@ inline Emitter& operator<<(Emitter& emitter, _Indent indent) {
inline Emitter& operator<<(Emitter& emitter, _Precision precision) { inline Emitter& operator<<(Emitter& emitter, _Precision precision) {
return emitter.SetLocalPrecision(precision); return emitter.SetLocalPrecision(precision);
} }
} // namespace YAML }
#endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // EMITTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -27,12 +27,6 @@ enum EMITTER_MANIP {
DoubleQuoted, DoubleQuoted,
Literal, Literal,
// null manipulators
LowerNull,
UpperNull,
CamelNull,
TildeNull,
// bool manipulators // bool manipulators
YesNoBool, // yes, no YesNoBool, // yes, no
TrueFalseBool, // true, false TrueFalseBool, // true, false
@ -43,6 +37,10 @@ enum EMITTER_MANIP {
LongBool, // yes, On LongBool, // yes, On
ShortBool, // y, t ShortBool, // y, t
// null manipulators
NullAsTilde, // ~
NullAsNull, // null
// int manipulators // int manipulators
Dec, Dec,
Hex, Hex,
@ -81,14 +79,14 @@ struct _Alias {
std::string content; std::string content;
}; };
inline _Alias Alias(const std::string& content) { return _Alias(content); } inline _Alias Alias(const std::string content) { return _Alias(content); }
struct _Anchor { struct _Anchor {
_Anchor(const std::string& content_) : content(content_) {} _Anchor(const std::string& content_) : content(content_) {}
std::string content; std::string content;
}; };
inline _Anchor Anchor(const std::string& content) { return _Anchor(content); } inline _Anchor Anchor(const std::string content) { return _Anchor(content); }
struct _Tag { struct _Tag {
struct Type { struct Type {
@ -103,11 +101,11 @@ struct _Tag {
Type::value type; Type::value type;
}; };
inline _Tag VerbatimTag(const std::string& content) { inline _Tag VerbatimTag(const std::string content) {
return _Tag("", content, _Tag::Type::Verbatim); return _Tag("", content, _Tag::Type::Verbatim);
} }
inline _Tag LocalTag(const std::string& content) { inline _Tag LocalTag(const std::string content) {
return _Tag("", content, _Tag::Type::PrimaryHandle); return _Tag("", content, _Tag::Type::PrimaryHandle);
} }
@ -115,7 +113,7 @@ inline _Tag LocalTag(const std::string& prefix, const std::string content) {
return _Tag(prefix, content, _Tag::Type::NamedHandle); return _Tag(prefix, content, _Tag::Type::NamedHandle);
} }
inline _Tag SecondaryTag(const std::string& content) { inline _Tag SecondaryTag(const std::string content) {
return _Tag("", content, _Tag::Type::NamedHandle); return _Tag("", content, _Tag::Type::NamedHandle);
} }
@ -124,7 +122,7 @@ struct _Comment {
std::string content; std::string content;
}; };
inline _Comment Comment(const std::string& content) { return _Comment(content); } inline _Comment Comment(const std::string content) { return _Comment(content); }
struct _Precision { struct _Precision {
_Precision(int floatPrecision_, int doublePrecision_) _Precision(int floatPrecision_, int doublePrecision_)

View File

@ -17,7 +17,7 @@ struct Mark;
class EventHandler { class EventHandler {
public: public:
virtual ~EventHandler() = default; virtual ~EventHandler() {}
virtual void OnDocumentStart(const Mark& mark) = 0; virtual void OnDocumentStart(const Mark& mark) = 0;
virtual void OnDocumentEnd() = 0; virtual void OnDocumentEnd() = 0;
@ -34,12 +34,7 @@ class EventHandler {
virtual void OnMapStart(const Mark& mark, const std::string& tag, virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) = 0; anchor_t anchor, EmitterStyle::value style) = 0;
virtual void OnMapEnd() = 0; virtual void OnMapEnd() = 0;
virtual void OnAnchor(const Mark& /*mark*/,
const std::string& /*anchor_name*/) {
// empty default implementation for compatibility
}
}; };
} // namespace YAML }
#endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // EVENTHANDLER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,8 +7,19 @@
#pragma once #pragma once
#endif #endif
#ifndef NOEXCEPT
#ifdef _MSC_VER
#ifdef _NOEXCEPT
#define NOEXCEPT _NOEXCEPT
#else
#define NOEXCEPT
#endif // ifdef _NOEXCEPT
#else
#define NOEXCEPT noexcept
#endif // ifdef _MSC_VER
#endif // ifdef NOEXCEPT
#include "yaml-cpp/mark.h" #include "yaml-cpp/mark.h"
#include "yaml-cpp/noexcept.h"
#include "yaml-cpp/traits.h" #include "yaml-cpp/traits.h"
#include <sstream> #include <sstream>
#include <stdexcept> #include <stdexcept>
@ -65,7 +76,7 @@ const char* const ZERO_INDENT_IN_BLOCK =
const char* const CHAR_IN_BLOCK = "unexpected character in block scalar"; const char* const CHAR_IN_BLOCK = "unexpected character in block scalar";
const char* const AMBIGUOUS_ANCHOR = const char* const AMBIGUOUS_ANCHOR =
"cannot assign the same alias to multiple nodes"; "cannot assign the same alias to multiple nodes";
const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined: "; const char* const UNKNOWN_ANCHOR = "the referenced anchor is not defined";
const char* const INVALID_NODE = const char* const INVALID_NODE =
"invalid node; this may result from using a map iterator as a sequence " "invalid node; this may result from using a map iterator as a sequence "
@ -100,12 +111,6 @@ inline const std::string KEY_NOT_FOUND_WITH_KEY(const std::string& key) {
return stream.str(); return stream.str();
} }
inline const std::string KEY_NOT_FOUND_WITH_KEY(const char* key) {
std::stringstream stream;
stream << KEY_NOT_FOUND << ": " << key;
return stream.str();
}
template <typename T> template <typename T>
inline const std::string KEY_NOT_FOUND_WITH_KEY( inline const std::string KEY_NOT_FOUND_WITH_KEY(
const T& key, typename enable_if<is_numeric<T>>::type* = 0) { const T& key, typename enable_if<is_numeric<T>>::type* = 0) {
@ -113,48 +118,13 @@ inline const std::string KEY_NOT_FOUND_WITH_KEY(
stream << KEY_NOT_FOUND << ": " << key; stream << KEY_NOT_FOUND << ": " << key;
return stream.str(); return stream.str();
} }
template <typename T>
inline const std::string BAD_SUBSCRIPT_WITH_KEY(
const T&, typename disable_if<is_numeric<T>>::type* = nullptr) {
return BAD_SUBSCRIPT;
} }
inline const std::string BAD_SUBSCRIPT_WITH_KEY(const std::string& key) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
inline const std::string BAD_SUBSCRIPT_WITH_KEY(const char* key) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
template <typename T>
inline const std::string BAD_SUBSCRIPT_WITH_KEY(
const T& key, typename enable_if<is_numeric<T>>::type* = nullptr) {
std::stringstream stream;
stream << BAD_SUBSCRIPT << " (key: \"" << key << "\")";
return stream.str();
}
inline const std::string INVALID_NODE_WITH_KEY(const std::string& key) {
std::stringstream stream;
if (key.empty()) {
return INVALID_NODE;
}
stream << "invalid node; first invalid key: \"" << key << "\"";
return stream.str();
}
} // namespace ErrorMsg
class YAML_CPP_API Exception : public std::runtime_error { class YAML_CPP_API Exception : public std::runtime_error {
public: public:
Exception(const Mark& mark_, const std::string& msg_) Exception(const Mark& mark_, const std::string& msg_)
: std::runtime_error(build_what(mark_, msg_)), mark(mark_), msg(msg_) {} : std::runtime_error(build_what(mark_, msg_)), mark(mark_), msg(msg_) {}
~Exception() YAML_CPP_NOEXCEPT override; virtual ~Exception() NOEXCEPT;
Exception(const Exception&) = default; Exception(const Exception&) = default;
@ -165,7 +135,7 @@ class YAML_CPP_API Exception : public std::runtime_error {
static const std::string build_what(const Mark& mark, static const std::string build_what(const Mark& mark,
const std::string& msg) { const std::string& msg) {
if (mark.is_null()) { if (mark.is_null()) {
return msg; return msg.c_str();
} }
std::stringstream output; std::stringstream output;
@ -180,7 +150,7 @@ class YAML_CPP_API ParserException : public Exception {
ParserException(const Mark& mark_, const std::string& msg_) ParserException(const Mark& mark_, const std::string& msg_)
: Exception(mark_, msg_) {} : Exception(mark_, msg_) {}
ParserException(const ParserException&) = default; ParserException(const ParserException&) = default;
~ParserException() YAML_CPP_NOEXCEPT override; virtual ~ParserException() NOEXCEPT;
}; };
class YAML_CPP_API RepresentationException : public Exception { class YAML_CPP_API RepresentationException : public Exception {
@ -188,7 +158,7 @@ class YAML_CPP_API RepresentationException : public Exception {
RepresentationException(const Mark& mark_, const std::string& msg_) RepresentationException(const Mark& mark_, const std::string& msg_)
: Exception(mark_, msg_) {} : Exception(mark_, msg_) {}
RepresentationException(const RepresentationException&) = default; RepresentationException(const RepresentationException&) = default;
~RepresentationException() YAML_CPP_NOEXCEPT override; virtual ~RepresentationException() NOEXCEPT;
}; };
// representation exceptions // representation exceptions
@ -197,7 +167,7 @@ class YAML_CPP_API InvalidScalar : public RepresentationException {
InvalidScalar(const Mark& mark_) InvalidScalar(const Mark& mark_)
: RepresentationException(mark_, ErrorMsg::INVALID_SCALAR) {} : RepresentationException(mark_, ErrorMsg::INVALID_SCALAR) {}
InvalidScalar(const InvalidScalar&) = default; InvalidScalar(const InvalidScalar&) = default;
~InvalidScalar() YAML_CPP_NOEXCEPT override; virtual ~InvalidScalar() NOEXCEPT;
}; };
class YAML_CPP_API KeyNotFound : public RepresentationException { class YAML_CPP_API KeyNotFound : public RepresentationException {
@ -207,7 +177,7 @@ class YAML_CPP_API KeyNotFound : public RepresentationException {
: RepresentationException(mark_, ErrorMsg::KEY_NOT_FOUND_WITH_KEY(key_)) { : RepresentationException(mark_, ErrorMsg::KEY_NOT_FOUND_WITH_KEY(key_)) {
} }
KeyNotFound(const KeyNotFound&) = default; KeyNotFound(const KeyNotFound&) = default;
~KeyNotFound() YAML_CPP_NOEXCEPT override; virtual ~KeyNotFound() NOEXCEPT;
}; };
template <typename T> template <typename T>
@ -215,7 +185,7 @@ class YAML_CPP_API TypedKeyNotFound : public KeyNotFound {
public: public:
TypedKeyNotFound(const Mark& mark_, const T& key_) TypedKeyNotFound(const Mark& mark_, const T& key_)
: KeyNotFound(mark_, key_), key(key_) {} : KeyNotFound(mark_, key_), key(key_) {}
~TypedKeyNotFound() YAML_CPP_NOEXCEPT override = default; virtual ~TypedKeyNotFound() NOEXCEPT {}
T key; T key;
}; };
@ -228,11 +198,10 @@ inline TypedKeyNotFound<T> MakeTypedKeyNotFound(const Mark& mark,
class YAML_CPP_API InvalidNode : public RepresentationException { class YAML_CPP_API InvalidNode : public RepresentationException {
public: public:
InvalidNode(const std::string& key) InvalidNode()
: RepresentationException(Mark::null_mark(), : RepresentationException(Mark::null_mark(), ErrorMsg::INVALID_NODE) {}
ErrorMsg::INVALID_NODE_WITH_KEY(key)) {}
InvalidNode(const InvalidNode&) = default; InvalidNode(const InvalidNode&) = default;
~InvalidNode() YAML_CPP_NOEXCEPT override; virtual ~InvalidNode() NOEXCEPT;
}; };
class YAML_CPP_API BadConversion : public RepresentationException { class YAML_CPP_API BadConversion : public RepresentationException {
@ -240,7 +209,7 @@ class YAML_CPP_API BadConversion : public RepresentationException {
explicit BadConversion(const Mark& mark_) explicit BadConversion(const Mark& mark_)
: RepresentationException(mark_, ErrorMsg::BAD_CONVERSION) {} : RepresentationException(mark_, ErrorMsg::BAD_CONVERSION) {}
BadConversion(const BadConversion&) = default; BadConversion(const BadConversion&) = default;
~BadConversion() YAML_CPP_NOEXCEPT override; virtual ~BadConversion() NOEXCEPT;
}; };
template <typename T> template <typename T>
@ -254,16 +223,15 @@ class YAML_CPP_API BadDereference : public RepresentationException {
BadDereference() BadDereference()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_DEREFERENCE) {} : RepresentationException(Mark::null_mark(), ErrorMsg::BAD_DEREFERENCE) {}
BadDereference(const BadDereference&) = default; BadDereference(const BadDereference&) = default;
~BadDereference() YAML_CPP_NOEXCEPT override; virtual ~BadDereference() NOEXCEPT;
}; };
class YAML_CPP_API BadSubscript : public RepresentationException { class YAML_CPP_API BadSubscript : public RepresentationException {
public: public:
template <typename Key> BadSubscript()
BadSubscript(const Mark& mark_, const Key& key) : RepresentationException(Mark::null_mark(), ErrorMsg::BAD_SUBSCRIPT) {}
: RepresentationException(mark_, ErrorMsg::BAD_SUBSCRIPT_WITH_KEY(key)) {}
BadSubscript(const BadSubscript&) = default; BadSubscript(const BadSubscript&) = default;
~BadSubscript() YAML_CPP_NOEXCEPT override; virtual ~BadSubscript() NOEXCEPT;
}; };
class YAML_CPP_API BadPushback : public RepresentationException { class YAML_CPP_API BadPushback : public RepresentationException {
@ -271,7 +239,7 @@ class YAML_CPP_API BadPushback : public RepresentationException {
BadPushback() BadPushback()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_PUSHBACK) {} : RepresentationException(Mark::null_mark(), ErrorMsg::BAD_PUSHBACK) {}
BadPushback(const BadPushback&) = default; BadPushback(const BadPushback&) = default;
~BadPushback() YAML_CPP_NOEXCEPT override; virtual ~BadPushback() NOEXCEPT;
}; };
class YAML_CPP_API BadInsert : public RepresentationException { class YAML_CPP_API BadInsert : public RepresentationException {
@ -279,7 +247,7 @@ class YAML_CPP_API BadInsert : public RepresentationException {
BadInsert() BadInsert()
: RepresentationException(Mark::null_mark(), ErrorMsg::BAD_INSERT) {} : RepresentationException(Mark::null_mark(), ErrorMsg::BAD_INSERT) {}
BadInsert(const BadInsert&) = default; BadInsert(const BadInsert&) = default;
~BadInsert() YAML_CPP_NOEXCEPT override; virtual ~BadInsert() NOEXCEPT;
}; };
class YAML_CPP_API EmitterException : public Exception { class YAML_CPP_API EmitterException : public Exception {
@ -287,17 +255,15 @@ class YAML_CPP_API EmitterException : public Exception {
EmitterException(const std::string& msg_) EmitterException(const std::string& msg_)
: Exception(Mark::null_mark(), msg_) {} : Exception(Mark::null_mark(), msg_) {}
EmitterException(const EmitterException&) = default; EmitterException(const EmitterException&) = default;
~EmitterException() YAML_CPP_NOEXCEPT override; virtual ~EmitterException() NOEXCEPT;
}; };
class YAML_CPP_API BadFile : public Exception { class YAML_CPP_API BadFile : public Exception {
public: public:
explicit BadFile(const std::string& filename) BadFile() : Exception(Mark::null_mark(), ErrorMsg::BAD_FILE) {}
: Exception(Mark::null_mark(),
std::string(ErrorMsg::BAD_FILE) + ": " + filename) {}
BadFile(const BadFile&) = default; BadFile(const BadFile&) = default;
~BadFile() YAML_CPP_NOEXCEPT override; virtual ~BadFile() NOEXCEPT;
}; };
} // namespace YAML }
#endif // EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // EXCEPTIONS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -8,14 +8,10 @@
#endif #endif
#include <array> #include <array>
#include <cmath>
#include <limits> #include <limits>
#include <list> #include <list>
#include <map> #include <map>
#include <unordered_map>
#include <sstream> #include <sstream>
#include <type_traits>
#include <valarray>
#include <vector> #include <vector>
#include "yaml-cpp/binary.h" #include "yaml-cpp/binary.h"
@ -25,7 +21,6 @@
#include "yaml-cpp/node/type.h" #include "yaml-cpp/node/type.h"
#include "yaml-cpp/null.h" #include "yaml-cpp/null.h"
namespace YAML { namespace YAML {
class Binary; class Binary;
struct _Null; struct _Null;
@ -76,17 +71,12 @@ struct convert<std::string> {
// C-strings can only be encoded // C-strings can only be encoded
template <> template <>
struct convert<const char*> { struct convert<const char*> {
static Node encode(const char* rhs) { return Node(rhs); } static Node encode(const char*& rhs) { return Node(rhs); }
};
template <>
struct convert<char*> {
static Node encode(const char* rhs) { return Node(rhs); }
}; };
template <std::size_t N> template <std::size_t N>
struct convert<char[N]> { struct convert<const char[N]> {
static Node encode(const char* rhs) { return Node(rhs); } static Node encode(const char(&rhs)[N]) { return Node(rhs); }
}; };
template <> template <>
@ -98,98 +88,42 @@ struct convert<_Null> {
} }
}; };
namespace conversion { #define YAML_DEFINE_CONVERT_STREAMABLE(type, negative_op) \
template <typename T> template <> \
typename std::enable_if< std::is_floating_point<T>::value, void>::type struct convert<type> { \
inner_encode(const T& rhs, std::stringstream& stream){ static Node encode(const type& rhs) { \
if (std::isnan(rhs)) { std::stringstream stream; \
stream << ".nan"; stream.precision(std::numeric_limits<type>::digits10 + 1); \
} else if (std::isinf(rhs)) { stream << rhs; \
if (std::signbit(rhs)) { return Node(stream.str()); \
stream << "-.inf"; } \
} else { \
stream << ".inf"; static bool decode(const Node& node, type& rhs) { \
} if (node.Type() != NodeType::Scalar) \
} else { return false; \
stream << rhs; const std::string& input = node.Scalar(); \
} std::stringstream stream(input); \
} stream.unsetf(std::ios::dec); \
if ((stream >> std::noskipws >> rhs) && (stream >> std::ws).eof()) \
template <typename T> return true; \
typename std::enable_if<!std::is_floating_point<T>::value, void>::type if (std::numeric_limits<type>::has_infinity) { \
inner_encode(const T& rhs, std::stringstream& stream){ if (conversion::IsInfinity(input)) { \
stream << rhs; rhs = std::numeric_limits<type>::infinity(); \
} return true; \
} else if (conversion::IsNegativeInfinity(input)) { \
template <typename T> rhs = negative_op std::numeric_limits<type>::infinity(); \
typename std::enable_if<(std::is_same<T, unsigned char>::value || return true; \
std::is_same<T, signed char>::value), bool>::type } \
ConvertStreamTo(std::stringstream& stream, T& rhs) { } \
int num; \
if ((stream >> std::noskipws >> num) && (stream >> std::ws).eof()) { if (std::numeric_limits<type>::has_quiet_NaN && \
if (num >= (std::numeric_limits<T>::min)() && conversion::IsNaN(input)) { \
num <= (std::numeric_limits<T>::max)()) { rhs = std::numeric_limits<type>::quiet_NaN(); \
rhs = static_cast<T>(num); return true; \
return true; } \
} \
} return false; \
return false; } \
}
template <typename T>
typename std::enable_if<!(std::is_same<T, unsigned char>::value ||
std::is_same<T, signed char>::value), bool>::type
ConvertStreamTo(std::stringstream& stream, T& rhs) {
if ((stream >> std::noskipws >> rhs) && (stream >> std::ws).eof()) {
return true;
}
return false;
}
}
#define YAML_DEFINE_CONVERT_STREAMABLE(type, negative_op) \
template <> \
struct convert<type> { \
\
static Node encode(const type& rhs) { \
std::stringstream stream; \
stream.precision(std::numeric_limits<type>::max_digits10); \
conversion::inner_encode(rhs, stream); \
return Node(stream.str()); \
} \
\
static bool decode(const Node& node, type& rhs) { \
if (node.Type() != NodeType::Scalar) { \
return false; \
} \
const std::string& input = node.Scalar(); \
std::stringstream stream(input); \
stream.unsetf(std::ios::dec); \
if ((stream.peek() == '-') && std::is_unsigned<type>::value) { \
return false; \
} \
if (conversion::ConvertStreamTo(stream, rhs)) { \
return true; \
} \
if (std::numeric_limits<type>::has_infinity) { \
if (conversion::IsInfinity(input)) { \
rhs = std::numeric_limits<type>::infinity(); \
return true; \
} else if (conversion::IsNegativeInfinity(input)) { \
rhs = negative_op std::numeric_limits<type>::infinity(); \
return true; \
} \
} \
\
if (std::numeric_limits<type>::has_quiet_NaN) { \
if (conversion::IsNaN(input)) { \
rhs = std::numeric_limits<type>::quiet_NaN(); \
return true; \
} \
} \
\
return false; \
} \
} }
#define YAML_DEFINE_CONVERT_STREAMABLE_SIGNED(type) \ #define YAML_DEFINE_CONVERT_STREAMABLE_SIGNED(type) \
@ -228,104 +162,81 @@ struct convert<bool> {
}; };
// std::map // std::map
template <typename K, typename V, typename C, typename A> template <typename K, typename V>
struct convert<std::map<K, V, C, A>> { struct convert<std::map<K, V>> {
static Node encode(const std::map<K, V, C, A>& rhs) { static Node encode(const std::map<K, V>& rhs) {
Node node(NodeType::Map); Node node(NodeType::Map);
for (const auto& element : rhs) for (typename std::map<K, V>::const_iterator it = rhs.begin();
node.force_insert(element.first, element.second); it != rhs.end(); ++it)
node.force_insert(it->first, it->second);
return node; return node;
} }
static bool decode(const Node& node, std::map<K, V, C, A>& rhs) { static bool decode(const Node& node, std::map<K, V>& rhs) {
if (!node.IsMap()) if (!node.IsMap())
return false; return false;
rhs.clear(); rhs.clear();
for (const auto& element : node) for (const_iterator it = node.begin(); it != node.end(); ++it)
#if defined(__GNUC__) && __GNUC__ < 4 #if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3: // workaround for GCC 3:
rhs[element.first.template as<K>()] = element.second.template as<V>(); rhs[it->first.template as<K>()] = it->second.template as<V>();
#else #else
rhs[element.first.as<K>()] = element.second.as<V>(); rhs[it->first.as<K>()] = it->second.as<V>();
#endif
return true;
}
};
// std::unordered_map
template <typename K, typename V, typename H, typename P, typename A>
struct convert<std::unordered_map<K, V, H, P, A>> {
static Node encode(const std::unordered_map<K, V, H, P, A>& rhs) {
Node node(NodeType::Map);
for (const auto& element : rhs)
node.force_insert(element.first, element.second);
return node;
}
static bool decode(const Node& node, std::unordered_map<K, V, H, P, A>& rhs) {
if (!node.IsMap())
return false;
rhs.clear();
for (const auto& element : node)
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[element.first.template as<K>()] = element.second.template as<V>();
#else
rhs[element.first.as<K>()] = element.second.as<V>();
#endif #endif
return true; return true;
} }
}; };
// std::vector // std::vector
template <typename T, typename A> template <typename T>
struct convert<std::vector<T, A>> { struct convert<std::vector<T>> {
static Node encode(const std::vector<T, A>& rhs) { static Node encode(const std::vector<T>& rhs) {
Node node(NodeType::Sequence); Node node(NodeType::Sequence);
for (const auto& element : rhs) for (typename std::vector<T>::const_iterator it = rhs.begin();
node.push_back(element); it != rhs.end(); ++it)
node.push_back(*it);
return node; return node;
} }
static bool decode(const Node& node, std::vector<T, A>& rhs) { static bool decode(const Node& node, std::vector<T>& rhs) {
if (!node.IsSequence()) if (!node.IsSequence())
return false; return false;
rhs.clear(); rhs.clear();
for (const auto& element : node) for (const_iterator it = node.begin(); it != node.end(); ++it)
#if defined(__GNUC__) && __GNUC__ < 4 #if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3: // workaround for GCC 3:
rhs.push_back(element.template as<T>()); rhs.push_back(it->template as<T>());
#else #else
rhs.push_back(element.as<T>()); rhs.push_back(it->as<T>());
#endif #endif
return true; return true;
} }
}; };
// std::list // std::list
template <typename T, typename A> template <typename T>
struct convert<std::list<T,A>> { struct convert<std::list<T>> {
static Node encode(const std::list<T,A>& rhs) { static Node encode(const std::list<T>& rhs) {
Node node(NodeType::Sequence); Node node(NodeType::Sequence);
for (const auto& element : rhs) for (typename std::list<T>::const_iterator it = rhs.begin();
node.push_back(element); it != rhs.end(); ++it)
node.push_back(*it);
return node; return node;
} }
static bool decode(const Node& node, std::list<T,A>& rhs) { static bool decode(const Node& node, std::list<T>& rhs) {
if (!node.IsSequence()) if (!node.IsSequence())
return false; return false;
rhs.clear(); rhs.clear();
for (const auto& element : node) for (const_iterator it = node.begin(); it != node.end(); ++it)
#if defined(__GNUC__) && __GNUC__ < 4 #if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3: // workaround for GCC 3:
rhs.push_back(element.template as<T>()); rhs.push_back(it->template as<T>());
#else #else
rhs.push_back(element.as<T>()); rhs.push_back(it->as<T>());
#endif #endif
return true; return true;
} }
@ -364,37 +275,6 @@ struct convert<std::array<T, N>> {
} }
}; };
// std::valarray
template <typename T>
struct convert<std::valarray<T>> {
static Node encode(const std::valarray<T>& rhs) {
Node node(NodeType::Sequence);
for (const auto& element : rhs) {
node.push_back(element);
}
return node;
}
static bool decode(const Node& node, std::valarray<T>& rhs) {
if (!node.IsSequence()) {
return false;
}
rhs.resize(node.size());
for (auto i = 0u; i < node.size(); ++i) {
#if defined(__GNUC__) && __GNUC__ < 4
// workaround for GCC 3:
rhs[i] = node[i].template as<T>();
#else
rhs[i] = node[i].as<T>();
#endif
}
return true;
}
};
// std::pair // std::pair
template <typename T, typename U> template <typename T, typename U>
struct convert<std::pair<T, U>> { struct convert<std::pair<T, U>> {

View File

@ -9,8 +9,6 @@
#include "yaml-cpp/node/detail/node.h" #include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/node/detail/node_data.h" #include "yaml-cpp/node/detail/node_data.h"
#include <algorithm>
#include <type_traits> #include <type_traits>
namespace YAML { namespace YAML {
@ -19,7 +17,7 @@ template <typename Key, typename Enable = void>
struct get_idx { struct get_idx {
static node* get(const std::vector<node*>& /* sequence */, static node* get(const std::vector<node*>& /* sequence */,
const Key& /* key */, shared_memory_holder /* pMemory */) { const Key& /* key */, shared_memory_holder /* pMemory */) {
return nullptr; return 0;
} }
}; };
@ -29,13 +27,13 @@ struct get_idx<Key,
!std::is_same<Key, bool>::value>::type> { !std::is_same<Key, bool>::value>::type> {
static node* get(const std::vector<node*>& sequence, const Key& key, static node* get(const std::vector<node*>& sequence, const Key& key,
shared_memory_holder /* pMemory */) { shared_memory_holder /* pMemory */) {
return key < sequence.size() ? sequence[key] : nullptr; return key < sequence.size() ? sequence[key] : 0;
} }
static node* get(std::vector<node*>& sequence, const Key& key, static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) { shared_memory_holder pMemory) {
if (key > sequence.size() || (key > 0 && !sequence[key - 1]->is_defined())) if (key > sequence.size() || (key > 0 && !sequence[key-1]->is_defined()))
return nullptr; return 0;
if (key == sequence.size()) if (key == sequence.size())
sequence.push_back(&pMemory->create_node()); sequence.push_back(&pMemory->create_node());
return sequence[key]; return sequence[key];
@ -48,51 +46,13 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
shared_memory_holder pMemory) { shared_memory_holder pMemory) {
return key >= 0 ? get_idx<std::size_t>::get( return key >= 0 ? get_idx<std::size_t>::get(
sequence, static_cast<std::size_t>(key), pMemory) sequence, static_cast<std::size_t>(key), pMemory)
: nullptr; : 0;
} }
static node* get(std::vector<node*>& sequence, const Key& key, static node* get(std::vector<node*>& sequence, const Key& key,
shared_memory_holder pMemory) { shared_memory_holder pMemory) {
return key >= 0 ? get_idx<std::size_t>::get( return key >= 0 ? get_idx<std::size_t>::get(
sequence, static_cast<std::size_t>(key), pMemory) sequence, static_cast<std::size_t>(key), pMemory)
: nullptr; : 0;
}
};
template <typename Key, typename Enable = void>
struct remove_idx {
static bool remove(std::vector<node*>&, const Key&, std::size_t&) {
return false;
}
};
template <typename Key>
struct remove_idx<
Key, typename std::enable_if<std::is_unsigned<Key>::value &&
!std::is_same<Key, bool>::value>::type> {
static bool remove(std::vector<node*>& sequence, const Key& key,
std::size_t& seqSize) {
if (key >= sequence.size()) {
return false;
} else {
sequence.erase(sequence.begin() + key);
if (seqSize > key) {
--seqSize;
}
return true;
}
}
};
template <typename Key>
struct remove_idx<Key,
typename std::enable_if<std::is_signed<Key>::value>::type> {
static bool remove(std::vector<node*>& sequence, const Key& key,
std::size_t& seqSize) {
return key >= 0 ? remove_idx<std::size_t>::remove(
sequence, static_cast<std::size_t>(key), seqSize)
: false;
} }
}; };
@ -106,11 +66,7 @@ inline bool node::equals(const T& rhs, shared_memory_holder pMemory) {
} }
inline bool node::equals(const char* rhs, shared_memory_holder pMemory) { inline bool node::equals(const char* rhs, shared_memory_holder pMemory) {
std::string lhs; return equals<std::string>(rhs, pMemory);
if (convert<std::string>::decode(Node(*this, std::move(pMemory)), lhs)) {
return lhs == rhs;
}
return false;
} }
// indexing // indexing
@ -122,20 +78,22 @@ inline node* node_data::get(const Key& key,
break; break;
case NodeType::Undefined: case NodeType::Undefined:
case NodeType::Null: case NodeType::Null:
return nullptr; return NULL;
case NodeType::Sequence: case NodeType::Sequence:
if (node* pNode = get_idx<Key>::get(m_sequence, key, pMemory)) if (node* pNode = get_idx<Key>::get(m_sequence, key, pMemory))
return pNode; return pNode;
return nullptr; return NULL;
case NodeType::Scalar: case NodeType::Scalar:
throw BadSubscript(m_mark, key); throw BadSubscript();
} }
auto it = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) { for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
return m.first->equals(key, pMemory); if (it->first->equals(key, pMemory)) {
}); return it->second;
}
}
return it != m_map.end() ? it->second : nullptr; return NULL;
} }
template <typename Key> template <typename Key>
@ -154,15 +112,13 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
convert_to_map(pMemory); convert_to_map(pMemory);
break; break;
case NodeType::Scalar: case NodeType::Scalar:
throw BadSubscript(m_mark, key); throw BadSubscript();
} }
auto it = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) { for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
return m.first->equals(key, pMemory); if (it->first->equals(key, pMemory)) {
}); return *it->second;
}
if (it != m_map.end()) {
return *it->second;
} }
node& k = convert_to_node(key, pMemory); node& k = convert_to_node(key, pMemory);
@ -173,26 +129,20 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
template <typename Key> template <typename Key>
inline bool node_data::remove(const Key& key, shared_memory_holder pMemory) { inline bool node_data::remove(const Key& key, shared_memory_holder pMemory) {
if (m_type == NodeType::Sequence) { if (m_type != NodeType::Map)
return remove_idx<Key>::remove(m_sequence, key, m_seqSize); return false;
for (kv_pairs::iterator it = m_undefinedPairs.begin();
it != m_undefinedPairs.end();) {
kv_pairs::iterator jt = std::next(it);
if (it->first->equals(key, pMemory))
m_undefinedPairs.erase(it);
it = jt;
} }
if (m_type == NodeType::Map) { for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
kv_pairs::iterator it = m_undefinedPairs.begin(); if (it->first->equals(key, pMemory)) {
while (it != m_undefinedPairs.end()) { m_map.erase(it);
kv_pairs::iterator jt = std::next(it);
if (it->first->equals(key, pMemory)) {
m_undefinedPairs.erase(it);
}
it = jt;
}
auto iter = std::find_if(m_map.begin(), m_map.end(), [&](const kv_pair m) {
return m.first->equals(key, pMemory);
});
if (iter != m_map.end()) {
m_map.erase(iter);
return true; return true;
} }
} }

View File

@ -8,25 +8,24 @@
#endif #endif
#include "yaml-cpp/dll.h" #include "yaml-cpp/dll.h"
#include "yaml-cpp/node/detail/node_iterator.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/ptr.h" #include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/detail/node_iterator.h"
#include <cstddef> #include <cstddef>
#include <iterator> #include <iterator>
namespace YAML { namespace YAML {
namespace detail { namespace detail {
struct iterator_value; struct iterator_value;
template <typename V> template <typename V>
class iterator_base { class iterator_base : public std::iterator<std::forward_iterator_tag, V,
std::ptrdiff_t, V*, V> {
private: private:
template <typename> template <typename>
friend class iterator_base; friend class iterator_base;
struct enabler {}; struct enabler {};
using base_type = node_iterator; typedef node_iterator base_type;
struct proxy { struct proxy {
explicit proxy(const V& x) : m_ref(x) {} explicit proxy(const V& x) : m_ref(x) {}
@ -37,11 +36,7 @@ class iterator_base {
}; };
public: public:
using iterator_category = std::forward_iterator_tag; typedef typename iterator_base::value_type value_type;
using value_type = V;
using difference_type = std::ptrdiff_t;
using pointer = V*;
using reference = V;
public: public:
iterator_base() : m_iterator(), m_pMemory() {} iterator_base() : m_iterator(), m_pMemory() {}
@ -90,7 +85,7 @@ class iterator_base {
base_type m_iterator; base_type m_iterator;
shared_memory_holder m_pMemory; shared_memory_holder m_pMemory;
}; };
} // namespace detail }
} // namespace YAML }
#endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // VALUE_DETAIL_ITERATOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -20,8 +20,8 @@ template <typename V>
class iterator_base; class iterator_base;
} }
using iterator = detail::iterator_base<detail::iterator_value>; typedef detail::iterator_base<detail::iterator_value> iterator;
using const_iterator = detail::iterator_base<const detail::iterator_value>; typedef detail::iterator_base<const detail::iterator_value> const_iterator;
} }
#endif // VALUE_DETAIL_ITERATOR_FWD_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // VALUE_DETAIL_ITERATOR_FWD_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -22,12 +22,11 @@ namespace YAML {
namespace detail { namespace detail {
class YAML_CPP_API memory { class YAML_CPP_API memory {
public: public:
memory() : m_nodes{} {}
node& create_node(); node& create_node();
void merge(const memory& rhs); void merge(const memory& rhs);
private: private:
using Nodes = std::set<shared_node>; typedef std::set<shared_node> Nodes;
Nodes m_nodes; Nodes m_nodes;
}; };
@ -41,7 +40,7 @@ class YAML_CPP_API memory_holder {
private: private:
shared_memory m_pMemory; shared_memory m_pMemory;
}; };
} // namespace detail }
} // namespace YAML }
#endif // VALUE_DETAIL_MEMORY_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // VALUE_DETAIL_MEMORY_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,24 +7,18 @@
#pragma once #pragma once
#endif #endif
#include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterstyle.h" #include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/node/detail/node_ref.h" #include "yaml-cpp/dll.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/type.h" #include "yaml-cpp/node/type.h"
#include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/detail/node_ref.h"
#include <set> #include <set>
#include <atomic>
namespace YAML { namespace YAML {
namespace detail { namespace detail {
class node { class node {
private:
struct less {
bool operator ()(const node* l, const node* r) const {return l->m_index < r->m_index;}
};
public: public:
node() : m_pRef(new node_ref), m_dependencies{}, m_index{} {} node() : m_pRef(new node_ref) {}
node(const node&) = delete; node(const node&) = delete;
node& operator=(const node&) = delete; node& operator=(const node&) = delete;
@ -48,8 +42,9 @@ class node {
return; return;
m_pRef->mark_defined(); m_pRef->mark_defined();
for (node* dependency : m_dependencies) for (nodes::iterator it = m_dependencies.begin();
dependency->mark_defined(); it != m_dependencies.end(); ++it)
(*it)->mark_defined();
m_dependencies.clear(); m_dependencies.clear();
} }
@ -114,7 +109,6 @@ class node {
void push_back(node& input, shared_memory_holder pMemory) { void push_back(node& input, shared_memory_holder pMemory) {
m_pRef->push_back(input, pMemory); m_pRef->push_back(input, pMemory);
input.add_dependency(*this); input.add_dependency(*this);
m_index = m_amount.fetch_add(1);
} }
void insert(node& key, node& value, shared_memory_holder pMemory) { void insert(node& key, node& value, shared_memory_holder pMemory) {
m_pRef->insert(key, value, pMemory); m_pRef->insert(key, value, pMemory);
@ -126,7 +120,7 @@ class node {
template <typename Key> template <typename Key>
node* get(const Key& key, shared_memory_holder pMemory) const { node* get(const Key& key, shared_memory_holder pMemory) const {
// NOTE: this returns a non-const node so that the top-level Node can wrap // NOTE: this returns a non-const node so that the top-level Node can wrap
// it, and returns a pointer so that it can be nullptr (if there is no such // it, and returns a pointer so that it can be NULL (if there is no such
// key). // key).
return static_cast<const node_ref&>(*m_pRef).get(key, pMemory); return static_cast<const node_ref&>(*m_pRef).get(key, pMemory);
} }
@ -143,7 +137,7 @@ class node {
node* get(node& key, shared_memory_holder pMemory) const { node* get(node& key, shared_memory_holder pMemory) const {
// NOTE: this returns a non-const node so that the top-level Node can wrap // NOTE: this returns a non-const node so that the top-level Node can wrap
// it, and returns a pointer so that it can be nullptr (if there is no such // it, and returns a pointer so that it can be NULL (if there is no such
// key). // key).
return static_cast<const node_ref&>(*m_pRef).get(key, pMemory); return static_cast<const node_ref&>(*m_pRef).get(key, pMemory);
} }
@ -166,12 +160,10 @@ class node {
private: private:
shared_node_ref m_pRef; shared_node_ref m_pRef;
using nodes = std::set<node*, less>; typedef std::set<node*> nodes;
nodes m_dependencies; nodes m_dependencies;
size_t m_index;
static YAML_CPP_API std::atomic<size_t> m_amount;
}; };
} // namespace detail }
} // namespace YAML }
#endif // NODE_DETAIL_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // NODE_DETAIL_NODE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -60,8 +60,8 @@ class YAML_CPP_API node_data {
node_iterator end(); node_iterator end();
// sequence // sequence
void push_back(node& node, const shared_memory_holder& pMemory); void push_back(node& node, shared_memory_holder pMemory);
void insert(node& key, node& value, const shared_memory_holder& pMemory); void insert(node& key, node& value, shared_memory_holder pMemory);
// indexing // indexing
template <typename Key> template <typename Key>
@ -71,9 +71,9 @@ class YAML_CPP_API node_data {
template <typename Key> template <typename Key>
bool remove(const Key& key, shared_memory_holder pMemory); bool remove(const Key& key, shared_memory_holder pMemory);
node* get(node& key, const shared_memory_holder& pMemory) const; node* get(node& key, shared_memory_holder pMemory) const;
node& get(node& key, const shared_memory_holder& pMemory); node& get(node& key, shared_memory_holder pMemory);
bool remove(node& key, const shared_memory_holder& pMemory); bool remove(node& key, shared_memory_holder pMemory);
// map // map
template <typename Key, typename Value> template <typename Key, typename Value>
@ -81,7 +81,7 @@ class YAML_CPP_API node_data {
shared_memory_holder pMemory); shared_memory_holder pMemory);
public: public:
static const std::string& empty_scalar(); static std::string empty_scalar;
private: private:
void compute_seq_size() const; void compute_seq_size() const;
@ -91,8 +91,8 @@ class YAML_CPP_API node_data {
void reset_map(); void reset_map();
void insert_map_pair(node& key, node& value); void insert_map_pair(node& key, node& value);
void convert_to_map(const shared_memory_holder& pMemory); void convert_to_map(shared_memory_holder pMemory);
void convert_sequence_to_map(const shared_memory_holder& pMemory); void convert_sequence_to_map(shared_memory_holder pMemory);
template <typename T> template <typename T>
static node& convert_to_node(const T& rhs, shared_memory_holder pMemory); static node& convert_to_node(const T& rhs, shared_memory_holder pMemory);
@ -108,17 +108,17 @@ class YAML_CPP_API node_data {
std::string m_scalar; std::string m_scalar;
// sequence // sequence
using node_seq = std::vector<node *>; typedef std::vector<node*> node_seq;
node_seq m_sequence; node_seq m_sequence;
mutable std::size_t m_seqSize; mutable std::size_t m_seqSize;
// map // map
using node_map = std::vector<std::pair<node*, node*>>; typedef std::vector<std::pair<node*, node*>> node_map;
node_map m_map; node_map m_map;
using kv_pair = std::pair<node*, node*>; typedef std::pair<node*, node*> kv_pair;
using kv_pairs = std::list<kv_pair>; typedef std::list<kv_pair> kv_pairs;
mutable kv_pairs m_undefinedPairs; mutable kv_pairs m_undefinedPairs;
}; };
} }

View File

@ -19,16 +19,16 @@
namespace YAML { namespace YAML {
namespace detail { namespace detail {
struct iterator_type { struct iterator_type {
enum value { NoneType, Sequence, Map }; enum value { None, Sequence, Map };
}; };
template <typename V> template <typename V>
struct node_iterator_value : public std::pair<V*, V*> { struct node_iterator_value : public std::pair<V*, V*> {
using kv = std::pair<V*, V*>; typedef std::pair<V*, V*> kv;
node_iterator_value() : kv(), pNode(nullptr) {} node_iterator_value() : kv(), pNode(0) {}
explicit node_iterator_value(V& rhs) : kv(), pNode(&rhs) {} explicit node_iterator_value(V& rhs) : kv(), pNode(&rhs) {}
explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(nullptr) {} explicit node_iterator_value(V& key, V& value) : kv(&key, &value), pNode(0) {}
V& operator*() const { return *pNode; } V& operator*() const { return *pNode; }
V& operator->() const { return *pNode; } V& operator->() const { return *pNode; }
@ -36,23 +36,26 @@ struct node_iterator_value : public std::pair<V*, V*> {
V* pNode; V* pNode;
}; };
using node_seq = std::vector<node *>; typedef std::vector<node*> node_seq;
using node_map = std::vector<std::pair<node*, node*>>; typedef std::vector<std::pair<node*, node*>> node_map;
template <typename V> template <typename V>
struct node_iterator_type { struct node_iterator_type {
using seq = node_seq::iterator; typedef node_seq::iterator seq;
using map = node_map::iterator; typedef node_map::iterator map;
}; };
template <typename V> template <typename V>
struct node_iterator_type<const V> { struct node_iterator_type<const V> {
using seq = node_seq::const_iterator; typedef node_seq::const_iterator seq;
using map = node_map::const_iterator; typedef node_map::const_iterator map;
}; };
template <typename V> template <typename V>
class node_iterator_base { class node_iterator_base
: public std::iterator<std::forward_iterator_tag, node_iterator_value<V>,
std::ptrdiff_t, node_iterator_value<V>*,
node_iterator_value<V>> {
private: private:
struct enabler {}; struct enabler {};
@ -65,16 +68,12 @@ class node_iterator_base {
}; };
public: public:
using iterator_category = std::forward_iterator_tag; typedef typename node_iterator_type<V>::seq SeqIter;
using value_type = node_iterator_value<V>; typedef typename node_iterator_type<V>::map MapIter;
using difference_type = std::ptrdiff_t; typedef node_iterator_value<V> value_type;
using pointer = node_iterator_value<V>*;
using reference = node_iterator_value<V>;
using SeqIter = typename node_iterator_type<V>::seq;
using MapIter = typename node_iterator_type<V>::map;
node_iterator_base() node_iterator_base()
: m_type(iterator_type::NoneType), m_seqIt(), m_mapIt(), m_mapEnd() {} : m_type(iterator_type::None), m_seqIt(), m_mapIt(), m_mapEnd() {}
explicit node_iterator_base(SeqIter seqIt) explicit node_iterator_base(SeqIter seqIt)
: m_type(iterator_type::Sequence), : m_type(iterator_type::Sequence),
m_seqIt(seqIt), m_seqIt(seqIt),
@ -106,7 +105,7 @@ class node_iterator_base {
return false; return false;
switch (m_type) { switch (m_type) {
case iterator_type::NoneType: case iterator_type::None:
return true; return true;
case iterator_type::Sequence: case iterator_type::Sequence:
return m_seqIt == rhs.m_seqIt; return m_seqIt == rhs.m_seqIt;
@ -123,7 +122,7 @@ class node_iterator_base {
node_iterator_base<V>& operator++() { node_iterator_base<V>& operator++() {
switch (m_type) { switch (m_type) {
case iterator_type::NoneType: case iterator_type::None:
break; break;
case iterator_type::Sequence: case iterator_type::Sequence:
++m_seqIt; ++m_seqIt;
@ -144,7 +143,7 @@ class node_iterator_base {
value_type operator*() const { value_type operator*() const {
switch (m_type) { switch (m_type) {
case iterator_type::NoneType: case iterator_type::None:
return value_type(); return value_type();
case iterator_type::Sequence: case iterator_type::Sequence:
return value_type(**m_seqIt); return value_type(**m_seqIt);
@ -173,8 +172,8 @@ class node_iterator_base {
MapIter m_mapIt, m_mapEnd; MapIter m_mapIt, m_mapEnd;
}; };
using node_iterator = node_iterator_base<node>; typedef node_iterator_base<node> node_iterator;
using const_node_iterator = node_iterator_base<const node>; typedef node_iterator_base<const node> const_node_iterator;
} }
} }

View File

@ -7,21 +7,18 @@
#pragma once #pragma once
#endif #endif
#include "yaml-cpp/exceptions.h" #include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/node/detail/memory.h" #include "yaml-cpp/node/detail/memory.h"
#include "yaml-cpp/node/detail/node.h" #include "yaml-cpp/node/detail/node.h"
#include "yaml-cpp/node/iterator.h" #include "yaml-cpp/exceptions.h"
#include "yaml-cpp/node/node.h"
#include <sstream>
#include <string> #include <string>
namespace YAML { namespace YAML {
inline Node::Node() inline Node::Node() : m_isValid(true), m_pNode(NULL) {}
: m_isValid(true), m_invalidKey{}, m_pMemory(nullptr), m_pNode(nullptr) {}
inline Node::Node(NodeType::value type) inline Node::Node(NodeType::value type)
: m_isValid(true), : m_isValid(true),
m_invalidKey{},
m_pMemory(new detail::memory_holder), m_pMemory(new detail::memory_holder),
m_pNode(&m_pMemory->create_node()) { m_pNode(&m_pMemory->create_node()) {
m_pNode->set_type(type); m_pNode->set_type(type);
@ -30,7 +27,6 @@ inline Node::Node(NodeType::value type)
template <typename T> template <typename T>
inline Node::Node(const T& rhs) inline Node::Node(const T& rhs)
: m_isValid(true), : m_isValid(true),
m_invalidKey{},
m_pMemory(new detail::memory_holder), m_pMemory(new detail::memory_holder),
m_pNode(&m_pMemory->create_node()) { m_pNode(&m_pMemory->create_node()) {
Assign(rhs); Assign(rhs);
@ -38,26 +34,24 @@ inline Node::Node(const T& rhs)
inline Node::Node(const detail::iterator_value& rhs) inline Node::Node(const detail::iterator_value& rhs)
: m_isValid(rhs.m_isValid), : m_isValid(rhs.m_isValid),
m_invalidKey(rhs.m_invalidKey),
m_pMemory(rhs.m_pMemory), m_pMemory(rhs.m_pMemory),
m_pNode(rhs.m_pNode) {} m_pNode(rhs.m_pNode) {}
inline Node::Node(const Node&) = default; inline Node::Node(const Node& rhs)
: m_isValid(rhs.m_isValid),
m_pMemory(rhs.m_pMemory),
m_pNode(rhs.m_pNode) {}
inline Node::Node(Zombie) inline Node::Node(Zombie) : m_isValid(false), m_pNode(NULL) {}
: m_isValid(false), m_invalidKey{}, m_pMemory{}, m_pNode(nullptr) {}
inline Node::Node(Zombie, const std::string& key)
: m_isValid(false), m_invalidKey(key), m_pMemory{}, m_pNode(nullptr) {}
inline Node::Node(detail::node& node, detail::shared_memory_holder pMemory) inline Node::Node(detail::node& node, detail::shared_memory_holder pMemory)
: m_isValid(true), m_invalidKey{}, m_pMemory(pMemory), m_pNode(&node) {} : m_isValid(true), m_pMemory(pMemory), m_pNode(&node) {}
inline Node::~Node() = default; inline Node::~Node() {}
inline void Node::EnsureNodeExists() const { inline void Node::EnsureNodeExists() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
if (!m_pNode) { if (!m_pNode) {
m_pMemory.reset(new detail::memory_holder); m_pMemory.reset(new detail::memory_holder);
m_pNode = &m_pMemory->create_node(); m_pNode = &m_pMemory->create_node();
@ -74,14 +68,14 @@ inline bool Node::IsDefined() const {
inline Mark Node::Mark() const { inline Mark Node::Mark() const {
if (!m_isValid) { if (!m_isValid) {
throw InvalidNode(m_invalidKey); throw InvalidNode();
} }
return m_pNode ? m_pNode->mark() : Mark::null_mark(); return m_pNode ? m_pNode->mark() : Mark::null_mark();
} }
inline NodeType::value Node::Type() const { inline NodeType::value Node::Type() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
return m_pNode ? m_pNode->type() : NodeType::Null; return m_pNode ? m_pNode->type() : NodeType::Null;
} }
@ -110,8 +104,6 @@ struct as_if<std::string, S> {
const Node& node; const Node& node;
std::string operator()(const S& fallback) const { std::string operator()(const S& fallback) const {
if (node.Type() == NodeType::Null)
return "null";
if (node.Type() != NodeType::Scalar) if (node.Type() != NodeType::Scalar)
return fallback; return fallback;
return node.Scalar(); return node.Scalar();
@ -140,8 +132,6 @@ struct as_if<std::string, void> {
const Node& node; const Node& node;
std::string operator()() const { std::string operator()() const {
if (node.Type() == NodeType::Null)
return "null";
if (node.Type() != NodeType::Scalar) if (node.Type() != NodeType::Scalar)
throw TypedBadConversion<std::string>(node.Mark()); throw TypedBadConversion<std::string>(node.Mark());
return node.Scalar(); return node.Scalar();
@ -152,7 +142,7 @@ struct as_if<std::string, void> {
template <typename T> template <typename T>
inline T Node::as() const { inline T Node::as() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
return as_if<T, void>(*this)(); return as_if<T, void>(*this)();
} }
@ -165,28 +155,32 @@ inline T Node::as(const S& fallback) const {
inline const std::string& Node::Scalar() const { inline const std::string& Node::Scalar() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar(); return m_pNode ? m_pNode->scalar() : detail::node_data::empty_scalar;
} }
inline const std::string& Node::Tag() const { inline const std::string& Node::Tag() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar(); return m_pNode ? m_pNode->tag() : detail::node_data::empty_scalar;
} }
inline void Node::SetTag(const std::string& tag) { inline void Node::SetTag(const std::string& tag) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
m_pNode->set_tag(tag); m_pNode->set_tag(tag);
} }
inline EmitterStyle::value Node::Style() const { inline EmitterStyle::value Node::Style() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
return m_pNode ? m_pNode->style() : EmitterStyle::Default; return m_pNode ? m_pNode->style() : EmitterStyle::Default;
} }
inline void Node::SetStyle(EmitterStyle::value style) { inline void Node::SetStyle(EmitterStyle::value style) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
m_pNode->set_style(style); m_pNode->set_style(style);
} }
@ -194,7 +188,7 @@ inline void Node::SetStyle(EmitterStyle::value style) {
// assignment // assignment
inline bool Node::is(const Node& rhs) const { inline bool Node::is(const Node& rhs) const {
if (!m_isValid || !rhs.m_isValid) if (!m_isValid || !rhs.m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
if (!m_pNode || !rhs.m_pNode) if (!m_pNode || !rhs.m_pNode)
return false; return false;
return m_pNode->is(*rhs.m_pNode); return m_pNode->is(*rhs.m_pNode);
@ -202,20 +196,15 @@ inline bool Node::is(const Node& rhs) const {
template <typename T> template <typename T>
inline Node& Node::operator=(const T& rhs) { inline Node& Node::operator=(const T& rhs) {
if (!m_isValid)
throw InvalidNode();
Assign(rhs); Assign(rhs);
return *this; return *this;
} }
inline Node& Node::operator=(const Node& rhs) {
if (is(rhs))
return *this;
AssignNode(rhs);
return *this;
}
inline void Node::reset(const YAML::Node& rhs) { inline void Node::reset(const YAML::Node& rhs) {
if (!m_isValid || !rhs.m_isValid) if (!m_isValid || !rhs.m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
m_pMemory = rhs.m_pMemory; m_pMemory = rhs.m_pMemory;
m_pNode = rhs.m_pNode; m_pNode = rhs.m_pNode;
} }
@ -223,27 +212,44 @@ inline void Node::reset(const YAML::Node& rhs) {
template <typename T> template <typename T>
inline void Node::Assign(const T& rhs) { inline void Node::Assign(const T& rhs) {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
AssignData(convert<T>::encode(rhs)); AssignData(convert<T>::encode(rhs));
} }
template <> template <>
inline void Node::Assign(const std::string& rhs) { inline void Node::Assign(const std::string& rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
m_pNode->set_scalar(rhs); m_pNode->set_scalar(rhs);
} }
inline void Node::Assign(const char* rhs) { inline void Node::Assign(const char* rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
m_pNode->set_scalar(rhs); m_pNode->set_scalar(rhs);
} }
inline void Node::Assign(char* rhs) { inline void Node::Assign(char* rhs) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
m_pNode->set_scalar(rhs); m_pNode->set_scalar(rhs);
} }
inline Node& Node::operator=(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
if (is(rhs))
return *this;
AssignNode(rhs);
return *this;
}
inline void Node::AssignData(const Node& rhs) { inline void Node::AssignData(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
rhs.EnsureNodeExists(); rhs.EnsureNodeExists();
@ -252,8 +258,8 @@ inline void Node::AssignData(const Node& rhs) {
} }
inline void Node::AssignNode(const Node& rhs) { inline void Node::AssignNode(const Node& rhs) {
if (!m_isValid) if (!m_isValid || !rhs.m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
rhs.EnsureNodeExists(); rhs.EnsureNodeExists();
if (!m_pNode) { if (!m_pNode) {
@ -270,7 +276,7 @@ inline void Node::AssignNode(const Node& rhs) {
// size/iterator // size/iterator
inline std::size_t Node::size() const { inline std::size_t Node::size() const {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
return m_pNode ? m_pNode->size() : 0; return m_pNode ? m_pNode->size() : 0;
} }
@ -303,11 +309,13 @@ inline iterator Node::end() {
template <typename T> template <typename T>
inline void Node::push_back(const T& rhs) { inline void Node::push_back(const T& rhs) {
if (!m_isValid) if (!m_isValid)
throw InvalidNode(m_invalidKey); throw InvalidNode();
push_back(Node(rhs)); push_back(Node(rhs));
} }
inline void Node::push_back(const Node& rhs) { inline void Node::push_back(const Node& rhs) {
if (!m_isValid || !rhs.m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
rhs.EnsureNodeExists(); rhs.EnsureNodeExists();
@ -315,49 +323,99 @@ inline void Node::push_back(const Node& rhs) {
m_pMemory->merge(*rhs.m_pMemory); m_pMemory->merge(*rhs.m_pMemory);
} }
template<typename Key> // helpers for indexing
std::string key_to_string(const Key& key) { namespace detail {
return streamable_to_string<Key, is_streamable<std::stringstream, Key>::value>().impl(key); template <typename T>
struct to_value_t {
explicit to_value_t(const T& t_) : t(t_) {}
const T& t;
typedef const T& return_type;
const T& operator()() const { return t; }
};
template <>
struct to_value_t<const char*> {
explicit to_value_t(const char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
template <>
struct to_value_t<char*> {
explicit to_value_t(char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
template <std::size_t N>
struct to_value_t<char[N]> {
explicit to_value_t(const char* t_) : t(t_) {}
const char* t;
typedef std::string return_type;
const std::string operator()() const { return t; }
};
// converts C-strings to std::strings so they can be copied
template <typename T>
inline typename to_value_t<T>::return_type to_value(const T& t) {
return to_value_t<T>(t)();
}
} }
// indexing // indexing
template <typename Key> template <typename Key>
inline const Node Node::operator[](const Key& key) const { inline const Node Node::operator[](const Key& key) const {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
detail::node* value = detail::node* value = static_cast<const detail::node&>(*m_pNode)
static_cast<const detail::node&>(*m_pNode).get(key, m_pMemory); .get(detail::to_value(key), m_pMemory);
if (!value) { if (!value) {
return Node(ZombieNode, key_to_string(key)); return Node(ZombieNode);
} }
return Node(*value, m_pMemory); return Node(*value, m_pMemory);
} }
template <typename Key> template <typename Key>
inline Node Node::operator[](const Key& key) { inline Node Node::operator[](const Key& key) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
detail::node& value = m_pNode->get(key, m_pMemory); detail::node& value = m_pNode->get(detail::to_value(key), m_pMemory);
return Node(value, m_pMemory); return Node(value, m_pMemory);
} }
template <typename Key> template <typename Key>
inline bool Node::remove(const Key& key) { inline bool Node::remove(const Key& key) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
return m_pNode->remove(key, m_pMemory); return m_pNode->remove(detail::to_value(key), m_pMemory);
} }
inline const Node Node::operator[](const Node& key) const { inline const Node Node::operator[](const Node& key) const {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
key.EnsureNodeExists(); key.EnsureNodeExists();
m_pMemory->merge(*key.m_pMemory); m_pMemory->merge(*key.m_pMemory);
detail::node* value = detail::node* value =
static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory); static_cast<const detail::node&>(*m_pNode).get(*key.m_pNode, m_pMemory);
if (!value) { if (!value) {
return Node(ZombieNode, key_to_string(key)); return Node(ZombieNode);
} }
return Node(*value, m_pMemory); return Node(*value, m_pMemory);
} }
inline Node Node::operator[](const Node& key) { inline Node Node::operator[](const Node& key) {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
key.EnsureNodeExists(); key.EnsureNodeExists();
m_pMemory->merge(*key.m_pMemory); m_pMemory->merge(*key.m_pMemory);
@ -366,6 +424,8 @@ inline Node Node::operator[](const Node& key) {
} }
inline bool Node::remove(const Node& key) { inline bool Node::remove(const Node& key) {
if (!m_isValid || !key.m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
key.EnsureNodeExists(); key.EnsureNodeExists();
return m_pNode->remove(*key.m_pNode, m_pMemory); return m_pNode->remove(*key.m_pNode, m_pMemory);
@ -374,12 +434,15 @@ inline bool Node::remove(const Node& key) {
// map // map
template <typename Key, typename Value> template <typename Key, typename Value>
inline void Node::force_insert(const Key& key, const Value& value) { inline void Node::force_insert(const Key& key, const Value& value) {
if (!m_isValid)
throw InvalidNode();
EnsureNodeExists(); EnsureNodeExists();
m_pNode->force_insert(key, value, m_pMemory); m_pNode->force_insert(detail::to_value(key), detail::to_value(value),
m_pMemory);
} }
// free functions // free functions
inline bool operator==(const Node& lhs, const Node& rhs) { return lhs.is(rhs); } inline bool operator==(const Node& lhs, const Node& rhs) { return lhs.is(rhs); }
} // namespace YAML }
#endif // NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // NODE_IMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -15,13 +15,10 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
// Assert in place so gcc + libc++ combination properly builds
static_assert(std::is_constructible<YAML::Node, const YAML::Node&>::value, "Node must be copy constructable");
namespace YAML { namespace YAML {
namespace detail { namespace detail {
struct iterator_value : public Node, std::pair<Node, Node> { struct iterator_value : public Node, std::pair<Node, Node> {
iterator_value() = default; iterator_value() {}
explicit iterator_value(const Node& rhs) explicit iterator_value(const Node& rhs)
: Node(rhs), : Node(rhs),
std::pair<Node, Node>(Node(Node::ZombieNode), Node(Node::ZombieNode)) {} std::pair<Node, Node>(Node(Node::ZombieNode), Node(Node::ZombieNode)) {}

View File

@ -8,11 +8,11 @@
#endif #endif
#include <stdexcept> #include <stdexcept>
#include <string>
#include "yaml-cpp/dll.h" #include "yaml-cpp/dll.h"
#include "yaml-cpp/emitterstyle.h" #include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/mark.h" #include "yaml-cpp/mark.h"
#include "yaml-cpp/node/detail/bool_type.h"
#include "yaml-cpp/node/detail/iterator_fwd.h" #include "yaml-cpp/node/detail/iterator_fwd.h"
#include "yaml-cpp/node/ptr.h" #include "yaml-cpp/node/ptr.h"
#include "yaml-cpp/node/type.h" #include "yaml-cpp/node/type.h"
@ -38,8 +38,8 @@ class YAML_CPP_API Node {
template <typename T, typename S> template <typename T, typename S>
friend struct as_if; friend struct as_if;
using iterator = YAML::iterator; typedef YAML::iterator iterator;
using const_iterator = YAML::const_iterator; typedef YAML::const_iterator const_iterator;
Node(); Node();
explicit Node(NodeType::value type); explicit Node(NodeType::value type);
@ -58,7 +58,7 @@ class YAML_CPP_API Node {
bool IsMap() const { return Type() == NodeType::Map; } bool IsMap() const { return Type() == NodeType::Map; }
// bool conversions // bool conversions
explicit operator bool() const { return IsDefined(); } YAML_CPP_OPERATOR_BOOL()
bool operator!() const { return !IsDefined(); } bool operator!() const { return !IsDefined(); }
// access // access
@ -116,7 +116,6 @@ class YAML_CPP_API Node {
private: private:
enum Zombie { ZombieNode }; enum Zombie { ZombieNode };
explicit Node(Zombie); explicit Node(Zombie);
explicit Node(Zombie, const std::string&);
explicit Node(detail::node& node, detail::shared_memory_holder pMemory); explicit Node(detail::node& node, detail::shared_memory_holder pMemory);
void EnsureNodeExists() const; void EnsureNodeExists() const;
@ -131,8 +130,6 @@ class YAML_CPP_API Node {
private: private:
bool m_isValid; bool m_isValid;
// String representation of invalid key, if the node is invalid.
std::string m_invalidKey;
mutable detail::shared_memory_holder m_pMemory; mutable detail::shared_memory_holder m_pMemory;
mutable detail::node* m_pNode; mutable detail::node* m_pNode;
}; };

View File

@ -7,6 +7,7 @@
#pragma once #pragma once
#endif #endif
#include "yaml-cpp/dll.h"
#include <memory> #include <memory>
namespace YAML { namespace YAML {
@ -17,11 +18,11 @@ class node_data;
class memory; class memory;
class memory_holder; class memory_holder;
using shared_node = std::shared_ptr<node>; typedef std::shared_ptr<node> shared_node;
using shared_node_ref = std::shared_ptr<node_ref>; typedef std::shared_ptr<node_ref> shared_node_ref;
using shared_node_data = std::shared_ptr<node_data>; typedef std::shared_ptr<node_data> shared_node_data;
using shared_memory_holder = std::shared_ptr<memory_holder>; typedef std::shared_ptr<memory_holder> shared_memory_holder;
using shared_memory = std::shared_ptr<memory>; typedef std::shared_ptr<memory> shared_memory;
} }
} }

View File

@ -1,18 +0,0 @@
#ifndef NOEXCEPT_H_768872DA_476C_11EA_88B8_90B11C0C0FF8
#define NOEXCEPT_H_768872DA_476C_11EA_88B8_90B11C0C0FF8
#if defined(_MSC_VER) || \
(defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
(__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
#pragma once
#endif
// This is here for compatibility with older versions of Visual Studio
// which don't support noexcept.
#if defined(_MSC_VER) && _MSC_VER < 1900
#define YAML_CPP_NOEXCEPT _NOEXCEPT
#else
#define YAML_CPP_NOEXCEPT noexcept
#endif
#endif

View File

@ -17,10 +17,6 @@ class YAML_CPP_API ostream_wrapper {
public: public:
ostream_wrapper(); ostream_wrapper();
explicit ostream_wrapper(std::ostream& stream); explicit ostream_wrapper(std::ostream& stream);
ostream_wrapper(const ostream_wrapper&) = delete;
ostream_wrapper(ostream_wrapper&&) = delete;
ostream_wrapper& operator=(const ostream_wrapper&) = delete;
ostream_wrapper& operator=(ostream_wrapper&&) = delete;
~ostream_wrapper(); ~ostream_wrapper();
void write(const std::string& str); void write(const std::string& str);
@ -30,7 +26,7 @@ class YAML_CPP_API ostream_wrapper {
const char* str() const { const char* str() const {
if (m_pStream) { if (m_pStream) {
return nullptr; return 0;
} else { } else {
m_buffer[m_pos] = '\0'; m_buffer[m_pos] = '\0';
return &m_buffer[0]; return &m_buffer[0];
@ -56,7 +52,7 @@ class YAML_CPP_API ostream_wrapper {
template <std::size_t N> template <std::size_t N>
inline ostream_wrapper& operator<<(ostream_wrapper& stream, inline ostream_wrapper& operator<<(ostream_wrapper& stream,
const char (&str)[N]) { const char(&str)[N]) {
stream.write(str, N - 1); stream.write(str, N - 1);
return stream; return stream;
} }
@ -71,6 +67,6 @@ inline ostream_wrapper& operator<<(ostream_wrapper& stream, char ch) {
stream.write(&ch, 1); stream.write(&ch, 1);
return stream; return stream;
} }
} // namespace YAML }
#endif // OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // OSTREAM_WRAPPER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -11,6 +11,7 @@
#include <memory> #include <memory>
#include "yaml-cpp/dll.h" #include "yaml-cpp/dll.h"
#include "yaml-cpp/noncopyable.h"
namespace YAML { namespace YAML {
class EventHandler; class EventHandler;
@ -23,16 +24,11 @@ struct Token;
* A parser turns a stream of bytes into one stream of "events" per YAML * A parser turns a stream of bytes into one stream of "events" per YAML
* document in the input stream. * document in the input stream.
*/ */
class YAML_CPP_API Parser { class YAML_CPP_API Parser : private noncopyable {
public: public:
/** Constructs an empty parser (with no input. */ /** Constructs an empty parser (with no input. */
Parser(); Parser();
Parser(const Parser&) = delete;
Parser(Parser&&) = delete;
Parser& operator=(const Parser&) = delete;
Parser& operator=(Parser&&) = delete;
/** /**
* Constructs a parser from the given input stream. The input stream must * Constructs a parser from the given input stream. The input stream must
* live as long as the parser. * live as long as the parser.
@ -85,6 +81,6 @@ class YAML_CPP_API Parser {
std::unique_ptr<Scanner> m_pScanner; std::unique_ptr<Scanner> m_pScanner;
std::unique_ptr<Directives> m_pDirectives; std::unique_ptr<Directives> m_pDirectives;
}; };
} // namespace YAML }
#endif // PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // PARSER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -16,8 +16,8 @@ namespace YAML {
template <typename Seq> template <typename Seq>
inline Emitter& EmitSeq(Emitter& emitter, const Seq& seq) { inline Emitter& EmitSeq(Emitter& emitter, const Seq& seq) {
emitter << BeginSeq; emitter << BeginSeq;
for (const auto& v : seq) for (typename Seq::const_iterator it = seq.begin(); it != seq.end(); ++it)
emitter << v; emitter << *it;
emitter << EndSeq; emitter << EndSeq;
return emitter; return emitter;
} }
@ -39,9 +39,10 @@ inline Emitter& operator<<(Emitter& emitter, const std::set<T>& v) {
template <typename K, typename V> template <typename K, typename V>
inline Emitter& operator<<(Emitter& emitter, const std::map<K, V>& m) { inline Emitter& operator<<(Emitter& emitter, const std::map<K, V>& m) {
typedef typename std::map<K, V> map;
emitter << BeginMap; emitter << BeginMap;
for (const auto& v : m) for (typename map::const_iterator it = m.begin(); it != m.end(); ++it)
emitter << Key << v.first << Value << v.second; emitter << Key << it->first << Value << it->second;
emitter << EndMap; emitter << EndMap;
return emitter; return emitter;
} }

View File

@ -7,11 +7,6 @@
#pragma once #pragma once
#endif #endif
#include <type_traits>
#include <utility>
#include <string>
#include <sstream>
namespace YAML { namespace YAML {
template <typename> template <typename>
struct is_numeric { struct is_numeric {
@ -84,7 +79,7 @@ struct is_numeric<long double> {
template <bool, class T = void> template <bool, class T = void>
struct enable_if_c { struct enable_if_c {
using type = T; typedef T type;
}; };
template <class T> template <class T>
@ -95,7 +90,7 @@ struct enable_if : public enable_if_c<Cond::value, T> {};
template <bool, class T = void> template <bool, class T = void>
struct disable_if_c { struct disable_if_c {
using type = T; typedef T type;
}; };
template <class T> template <class T>
@ -105,31 +100,4 @@ template <class Cond, class T = void>
struct disable_if : public disable_if_c<Cond::value, T> {}; struct disable_if : public disable_if_c<Cond::value, T> {};
} }
template <typename S, typename T>
struct is_streamable {
template <typename StreamT, typename ValueT>
static auto test(int)
-> decltype(std::declval<StreamT&>() << std::declval<ValueT>(), std::true_type());
template <typename, typename>
static auto test(...) -> std::false_type;
static const bool value = decltype(test<S, T>(0))::value;
};
template<typename Key, bool Streamable>
struct streamable_to_string {
static std::string impl(const Key& key) {
std::stringstream ss;
ss << key;
return ss.str();
}
};
template<typename Key>
struct streamable_to_string<Key, false> {
static std::string impl(const Key&) {
return "";
}
};
#endif // TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // TRAITS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -1,7 +1,5 @@
#include "yaml-cpp/binary.h" #include "yaml-cpp/binary.h"
#include <cctype>
namespace YAML { namespace YAML {
static const char encoding[] = static const char encoding[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@ -66,7 +64,7 @@ static const unsigned char decoding[] = {
}; };
std::vector<unsigned char> DecodeBase64(const std::string &input) { std::vector<unsigned char> DecodeBase64(const std::string &input) {
using ret_type = std::vector<unsigned char>; typedef std::vector<unsigned char> ret_type;
if (input.empty()) if (input.empty())
return ret_type(); return ret_type();
@ -74,27 +72,22 @@ std::vector<unsigned char> DecodeBase64(const std::string &input) {
unsigned char *out = &ret[0]; unsigned char *out = &ret[0];
unsigned value = 0; unsigned value = 0;
for (std::size_t i = 0, cnt = 0; i < input.size(); i++) { for (std::size_t i = 0; i < input.size(); i++) {
if (std::isspace(static_cast<unsigned char>(input[i]))) { unsigned char d = decoding[static_cast<unsigned>(input[i])];
// skip newlines
continue;
}
unsigned char d = decoding[static_cast<unsigned char>(input[i])];
if (d == 255) if (d == 255)
return ret_type(); return ret_type();
value = (value << 6) | d; value = (value << 6) | d;
if (cnt % 4 == 3) { if (i % 4 == 3) {
*out++ = value >> 16; *out++ = value >> 16;
if (i > 0 && input[i - 1] != '=') if (i > 0 && input[i - 1] != '=')
*out++ = value >> 8; *out++ = value >> 8;
if (input[i] != '=') if (input[i] != '=')
*out++ = value; *out++ = value;
} }
++cnt;
} }
ret.resize(out - &ret[0]); ret.resize(out - &ret[0]);
return ret; return ret;
} }
} // namespace YAML }

View File

@ -7,8 +7,8 @@
#pragma once #pragma once
#endif #endif
#include <cassert>
#include <stack> #include <stack>
#include <cassert>
namespace YAML { namespace YAML {
struct CollectionType { struct CollectionType {
@ -17,7 +17,6 @@ struct CollectionType {
class CollectionStack { class CollectionStack {
public: public:
CollectionStack() : collectionStack{} {}
CollectionType::value GetCurCollectionType() const { CollectionType::value GetCurCollectionType() const {
if (collectionStack.empty()) if (collectionStack.empty())
return CollectionType::NoCollection; return CollectionType::NoCollection;
@ -29,13 +28,12 @@ class CollectionStack {
} }
void PopCollectionType(CollectionType::value type) { void PopCollectionType(CollectionType::value type) {
assert(type == GetCurCollectionType()); assert(type == GetCurCollectionType());
(void)type;
collectionStack.pop(); collectionStack.pop();
} }
private: private:
std::stack<CollectionType::value> collectionStack; std::stack<CollectionType::value> collectionStack;
}; };
} // namespace YAML }
#endif // COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // COLLECTIONSTACK_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -10,7 +10,8 @@ void* BuildGraphOfNextDocument(Parser& parser,
GraphBuilderAdapter eventHandler(graphBuilder); GraphBuilderAdapter eventHandler(graphBuilder);
if (parser.HandleNextDocument(eventHandler)) { if (parser.HandleNextDocument(eventHandler)) {
return eventHandler.RootNode(); return eventHandler.RootNode();
} else {
return NULL;
} }
return nullptr;
} }
} // namespace YAML }

View File

@ -49,7 +49,7 @@ void GraphBuilderAdapter::OnMapStart(const Mark &mark, const std::string &tag,
EmitterStyle::value /* style */) { EmitterStyle::value /* style */) {
void *pNode = m_builder.NewMap(mark, tag, GetCurrentParent()); void *pNode = m_builder.NewMap(mark, tag, GetCurrentParent());
m_containers.push(ContainerFrame(pNode, m_pKeyNode)); m_containers.push(ContainerFrame(pNode, m_pKeyNode));
m_pKeyNode = nullptr; m_pKeyNode = NULL;
RegisterAnchor(anchor, pNode); RegisterAnchor(anchor, pNode);
} }
@ -62,7 +62,7 @@ void GraphBuilderAdapter::OnMapEnd() {
void *GraphBuilderAdapter::GetCurrentParent() const { void *GraphBuilderAdapter::GetCurrentParent() const {
if (m_containers.empty()) { if (m_containers.empty()) {
return nullptr; return NULL;
} }
return m_containers.top().pContainer; return m_containers.top().pContainer;
} }
@ -83,7 +83,7 @@ void GraphBuilderAdapter::DispositionNode(void *pNode) {
if (m_containers.top().isMap()) { if (m_containers.top().isMap()) {
if (m_pKeyNode) { if (m_pKeyNode) {
m_builder.AssignInMap(pContainer, m_pKeyNode, pNode); m_builder.AssignInMap(pContainer, m_pKeyNode, pNode);
m_pKeyNode = nullptr; m_pKeyNode = NULL;
} else { } else {
m_pKeyNode = pNode; m_pKeyNode = pNode;
} }
@ -91,4 +91,4 @@ void GraphBuilderAdapter::DispositionNode(void *pNode) {
m_builder.AppendToSequence(pContainer, pNode); m_builder.AppendToSequence(pContainer, pNode);
} }
} }
} // namespace YAML }

View File

@ -13,6 +13,7 @@
#include "yaml-cpp/anchor.h" #include "yaml-cpp/anchor.h"
#include "yaml-cpp/contrib/anchordict.h" #include "yaml-cpp/contrib/anchordict.h"
#include "yaml-cpp/contrib/graphbuilder.h"
#include "yaml-cpp/emitterstyle.h" #include "yaml-cpp/emitterstyle.h"
#include "yaml-cpp/eventhandler.h" #include "yaml-cpp/eventhandler.h"
@ -25,15 +26,7 @@ namespace YAML {
class GraphBuilderAdapter : public EventHandler { class GraphBuilderAdapter : public EventHandler {
public: public:
GraphBuilderAdapter(GraphBuilderInterface& builder) GraphBuilderAdapter(GraphBuilderInterface& builder)
: m_builder(builder), : m_builder(builder), m_pRootNode(NULL), m_pKeyNode(NULL) {}
m_containers{},
m_anchors{},
m_pRootNode(nullptr),
m_pKeyNode(nullptr) {}
GraphBuilderAdapter(const GraphBuilderAdapter&) = delete;
GraphBuilderAdapter(GraphBuilderAdapter&&) = delete;
GraphBuilderAdapter& operator=(const GraphBuilderAdapter&) = delete;
GraphBuilderAdapter& operator=(GraphBuilderAdapter&&) = delete;
virtual void OnDocumentStart(const Mark& mark) { (void)mark; } virtual void OnDocumentStart(const Mark& mark) { (void)mark; }
virtual void OnDocumentEnd() {} virtual void OnDocumentEnd() {}
@ -57,8 +50,8 @@ class GraphBuilderAdapter : public EventHandler {
struct ContainerFrame { struct ContainerFrame {
ContainerFrame(void* pSequence) ContainerFrame(void* pSequence)
: pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {} : pContainer(pSequence), pPrevKeyNode(&sequenceMarker) {}
ContainerFrame(void* pMap, void* pPreviousKeyNode) ContainerFrame(void* pMap, void* pPrevKeyNode_)
: pContainer(pMap), pPrevKeyNode(pPreviousKeyNode) {} : pContainer(pMap), pPrevKeyNode(pPrevKeyNode_) {}
void* pContainer; void* pContainer;
void* pPrevKeyNode; void* pPrevKeyNode;
@ -81,6 +74,6 @@ class GraphBuilderAdapter : public EventHandler {
void RegisterAnchor(anchor_t anchor, void* pNode); void RegisterAnchor(anchor_t anchor, void* pNode);
void DispositionNode(void* pNode); void DispositionNode(void* pNode);
}; };
} // namespace YAML }
#endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // GRAPHBUILDERADAPTER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -1,32 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- MSVC Debugger visualization hints for YAML::Node and YAML::detail::node -->
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
<Type Name="YAML::Node">
<DisplayString Condition="!m_isValid">{{invalid}}</DisplayString>
<DisplayString Condition="!m_pNode">{{pNode==nullptr}}</DisplayString>
<DisplayString>{{ {*m_pNode} }}</DisplayString>
<Expand>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar" Name="scalar">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_scalar</Item>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence" Name="sequence">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_sequence</Item>
<Item Condition="m_pNode->m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map" Name="map">m_pNode->m_pRef._Ptr->m_pData._Ptr->m_map</Item>
<Item Name="[details]" >m_pNode->m_pRef._Ptr->m_pData._Ptr</Item>
</Expand>
</Type>
<Type Name="YAML::detail::node">
<DisplayString Condition="!m_pRef._Ptr">{{node:pRef==nullptr}}</DisplayString>
<DisplayString Condition="!m_pRef._Ptr->m_pData._Ptr">{{node:pRef->pData==nullptr}}</DisplayString>
<DisplayString Condition="!m_pRef._Ptr->m_pData._Ptr->m_isDefined">{{undefined}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar">{{{m_pRef._Ptr->m_pData._Ptr->m_scalar}}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map">{{ Map {m_pRef._Ptr->m_pData._Ptr->m_map}}}</DisplayString>
<DisplayString Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence">{{ Seq {m_pRef._Ptr->m_pData._Ptr->m_sequence}}}</DisplayString>
<DisplayString>{{{m_pRef._Ptr->m_pData._Ptr->m_type}}}</DisplayString>
<Expand>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Scalar" Name="scalar">m_pRef._Ptr->m_pData._Ptr->m_scalar</Item>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Sequence" Name="sequence">m_pRef._Ptr->m_pData._Ptr->m_sequence</Item>
<Item Condition="m_pRef._Ptr->m_pData._Ptr->m_type==YAML::NodeType::Map" Name="map">m_pRef._Ptr->m_pData._Ptr->m_map</Item>
<Item Name="[details]" >m_pRef._Ptr->m_pData._Ptr</Item>
</Expand>
</Type>
</AutoVisualizer>

View File

@ -1,9 +0,0 @@
# MSVC debugger visualizer for YAML::Node
## How to use
Add yaml-cpp.natvis to your Visual C++ project like any other source file. It will be included in the debug information, and improve debugger display on YAML::Node and contained types.
## Compatibility and Troubleshooting
This has been tested for MSVC 2017. It is expected to be compatible with VS 2015 and VS 2019. If you have any problems, you can open an issue here: https://github.com/peterchen-cp/yaml-cpp-natvis

View File

@ -16,7 +16,11 @@ std::string tolower(const std::string& str) {
template <typename T> template <typename T>
bool IsEntirely(const std::string& str, T func) { bool IsEntirely(const std::string& str, T func) {
return std::all_of(str.begin(), str.end(), [=](char ch) { return func(ch); }); for (std::size_t i = 0; i < str.size(); i++)
if (!func(str[i]))
return false;
return true;
} }
// IsFlexibleCase // IsFlexibleCase
@ -35,7 +39,7 @@ bool IsFlexibleCase(const std::string& str) {
std::string rest = str.substr(1); std::string rest = str.substr(1);
return firstcaps && (IsEntirely(rest, IsLower) || IsEntirely(rest, IsUpper)); return firstcaps && (IsEntirely(rest, IsLower) || IsEntirely(rest, IsUpper));
} }
} // namespace }
namespace YAML { namespace YAML {
bool convert<bool>::decode(const Node& node, bool& rhs) { bool convert<bool>::decode(const Node& node, bool& rhs) {
@ -48,22 +52,19 @@ bool convert<bool>::decode(const Node& node, bool& rhs) {
static const struct { static const struct {
std::string truename, falsename; std::string truename, falsename;
} names[] = { } names[] = {
{"y", "n"}, {"y", "n"}, {"yes", "no"}, {"true", "false"}, {"on", "off"},
{"yes", "no"},
{"true", "false"},
{"on", "off"},
}; };
if (!IsFlexibleCase(node.Scalar())) if (!IsFlexibleCase(node.Scalar()))
return false; return false;
for (const auto& name : names) { for (unsigned i = 0; i < sizeof(names) / sizeof(names[0]); i++) {
if (name.truename == tolower(node.Scalar())) { if (names[i].truename == tolower(node.Scalar())) {
rhs = true; rhs = true;
return true; return true;
} }
if (name.falsename == tolower(node.Scalar())) { if (names[i].falsename == tolower(node.Scalar())) {
rhs = false; rhs = false;
return true; return true;
} }
@ -71,4 +72,4 @@ bool convert<bool>::decode(const Node& node, bool& rhs) {
return false; return false;
} }
} // namespace YAML }

View File

@ -1,9 +0,0 @@
#include "yaml-cpp/depthguard.h"
namespace YAML {
DeepRecursion::DeepRecursion(int depth, const Mark& mark_,
const std::string& msg_)
: ParserException(mark_, msg_), m_depth(depth) {}
} // namespace YAML

View File

@ -1,11 +1,16 @@
#include "directives.h" #include "directives.h"
namespace YAML { namespace YAML {
Directives::Directives() : version{true, 1, 2}, tags{} {} Directives::Directives() {
// version
version.isDefault = true;
version.major = 1;
version.minor = 2;
}
std::string Directives::TranslateTagHandle( const std::string Directives::TranslateTagHandle(
const std::string& handle) const { const std::string& handle) const {
auto it = tags.find(handle); std::map<std::string, std::string>::const_iterator it = tags.find(handle);
if (it == tags.end()) { if (it == tags.end()) {
if (handle == "!!") if (handle == "!!")
return "tag:yaml.org,2002:"; return "tag:yaml.org,2002:";
@ -14,4 +19,4 @@ std::string Directives::TranslateTagHandle(
return it->second; return it->second;
} }
} // namespace YAML }

View File

@ -19,7 +19,7 @@ struct Version {
struct Directives { struct Directives {
Directives(); Directives();
std::string TranslateTagHandle(const std::string& handle) const; const std::string TranslateTagHandle(const std::string& handle) const;
Version version; Version version;
std::map<std::string, std::string> tags; std::map<std::string, std::string> tags;

View File

@ -1,7 +1,7 @@
#include "yaml-cpp/node/emit.h" #include "yaml-cpp/node/emit.h"
#include "nodeevents.h"
#include "yaml-cpp/emitfromevents.h" #include "yaml-cpp/emitfromevents.h"
#include "yaml-cpp/emitter.h" #include "yaml-cpp/emitter.h"
#include "nodeevents.h"
namespace YAML { namespace YAML {
Emitter& operator<<(Emitter& out, const Node& node) { Emitter& operator<<(Emitter& out, const Node& node) {

View File

@ -16,11 +16,10 @@ std::string ToString(YAML::anchor_t anchor) {
stream << anchor; stream << anchor;
return stream.str(); return stream.str();
} }
} // namespace }
namespace YAML { namespace YAML {
EmitFromEvents::EmitFromEvents(Emitter& emitter) EmitFromEvents::EmitFromEvents(Emitter& emitter) : m_emitter(emitter) {}
: m_emitter(emitter), m_stateStack{} {}
void EmitFromEvents::OnDocumentStart(const Mark&) {} void EmitFromEvents::OnDocumentStart(const Mark&) {}
@ -59,8 +58,6 @@ void EmitFromEvents::OnSequenceStart(const Mark&, const std::string& tag,
default: default:
break; break;
} }
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginSeq; m_emitter << BeginSeq;
m_stateStack.push(State::WaitingForSequenceEntry); m_stateStack.push(State::WaitingForSequenceEntry);
} }
@ -85,8 +82,6 @@ void EmitFromEvents::OnMapStart(const Mark&, const std::string& tag,
default: default:
break; break;
} }
// Restore the global settings to eliminate the override from node style
m_emitter.RestoreGlobalModifiedSettings();
m_emitter << BeginMap; m_emitter << BeginMap;
m_stateStack.push(State::WaitingForKey); m_stateStack.push(State::WaitingForKey);
} }
@ -121,4 +116,4 @@ void EmitFromEvents::EmitProps(const std::string& tag, anchor_t anchor) {
if (anchor) if (anchor)
m_emitter << Anchor(ToString(anchor)); m_emitter << Anchor(ToString(anchor));
} }
} // namespace YAML }

View File

@ -11,12 +11,12 @@ namespace YAML {
class Binary; class Binary;
struct _Null; struct _Null;
Emitter::Emitter() : m_pState(new EmitterState), m_stream{} {} Emitter::Emitter() : m_pState(new EmitterState) {}
Emitter::Emitter(std::ostream& stream) Emitter::Emitter(std::ostream& stream)
: m_pState(new EmitterState), m_stream(stream) {} : m_pState(new EmitterState), m_stream(stream) {}
Emitter::~Emitter() = default; Emitter::~Emitter() {}
const char* Emitter::c_str() const { return m_stream.str(); } const char* Emitter::c_str() const { return m_stream.str(); }
@ -90,10 +90,6 @@ bool Emitter::SetDoublePrecision(std::size_t n) {
return m_pState->SetDoublePrecision(n, FmtScope::Global); return m_pState->SetDoublePrecision(n, FmtScope::Global);
} }
void Emitter::RestoreGlobalModifiedSettings() {
m_pState->RestoreGlobalModifiedSettings();
}
// SetLocalValue // SetLocalValue
// . Either start/end a group, or set a modifier locally // . Either start/end a group, or set a modifier locally
Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) { Emitter& Emitter::SetLocalValue(EMITTER_MANIP value) {
@ -205,7 +201,6 @@ void Emitter::EmitBeginSeq() {
void Emitter::EmitEndSeq() { void Emitter::EmitEndSeq() {
if (!good()) if (!good())
return; return;
FlowType::value originalType = m_pState->CurGroupFlowType();
if (m_pState->CurGroupChildCount() == 0) if (m_pState->CurGroupChildCount() == 0)
m_pState->ForceFlow(); m_pState->ForceFlow();
@ -214,12 +209,8 @@ void Emitter::EmitEndSeq() {
if (m_stream.comment()) if (m_stream.comment())
m_stream << "\n"; m_stream << "\n";
m_stream << IndentTo(m_pState->CurIndent()); m_stream << IndentTo(m_pState->CurIndent());
if (originalType == FlowType::Block) { if (m_pState->CurGroupChildCount() == 0)
m_stream << "["; m_stream << "[";
} else {
if (m_pState->CurGroupChildCount() == 0 && !m_pState->HasBegunNode())
m_stream << "[";
}
m_stream << "]"; m_stream << "]";
} }
@ -240,7 +231,6 @@ void Emitter::EmitBeginMap() {
void Emitter::EmitEndMap() { void Emitter::EmitEndMap() {
if (!good()) if (!good())
return; return;
FlowType::value originalType = m_pState->CurGroupFlowType();
if (m_pState->CurGroupChildCount() == 0) if (m_pState->CurGroupChildCount() == 0)
m_pState->ForceFlow(); m_pState->ForceFlow();
@ -249,12 +239,8 @@ void Emitter::EmitEndMap() {
if (m_stream.comment()) if (m_stream.comment())
m_stream << "\n"; m_stream << "\n";
m_stream << IndentTo(m_pState->CurIndent()); m_stream << IndentTo(m_pState->CurIndent());
if (originalType == FlowType::Block) { if (m_pState->CurGroupChildCount() == 0)
m_stream << "{"; m_stream << "{";
} else {
if (m_pState->CurGroupChildCount() == 0 && !m_pState->HasBegunNode())
m_stream << "{";
}
m_stream << "}"; m_stream << "}";
} }
@ -303,8 +289,10 @@ void Emitter::PrepareTopNode(EmitterNodeType::value child) {
if (child == EmitterNodeType::NoType) if (child == EmitterNodeType::NoType)
return; return;
if (m_pState->CurGroupChildCount() > 0 && m_stream.col() > 0) if (m_pState->CurGroupChildCount() > 0 && m_stream.col() > 0) {
EmitBeginDoc(); if (child != EmitterNodeType::NoType)
EmitBeginDoc();
}
switch (child) { switch (child) {
case EmitterNodeType::NoType: case EmitterNodeType::NoType:
@ -504,9 +492,6 @@ void Emitter::FlowMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
if (m_stream.comment()) if (m_stream.comment())
m_stream << "\n"; m_stream << "\n";
m_stream << IndentTo(lastIndent); m_stream << IndentTo(lastIndent);
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":"; m_stream << ":";
} }
@ -533,8 +518,7 @@ void Emitter::BlockMapPrepareNode(EmitterNodeType::value child) {
if (m_pState->GetMapKeyFormat() == LongKey) if (m_pState->GetMapKeyFormat() == LongKey)
m_pState->SetLongKey(); m_pState->SetLongKey();
if (child == EmitterNodeType::BlockSeq || if (child == EmitterNodeType::BlockSeq ||
child == EmitterNodeType::BlockMap || child == EmitterNodeType::BlockMap)
child == EmitterNodeType::Property)
m_pState->SetLongKey(); m_pState->SetLongKey();
if (m_pState->CurGroupLongKey()) if (m_pState->CurGroupLongKey())
@ -578,8 +562,6 @@ void Emitter::BlockMapPrepareLongKey(EmitterNodeType::value child) {
break; break;
case EmitterNodeType::BlockSeq: case EmitterNodeType::BlockSeq:
case EmitterNodeType::BlockMap: case EmitterNodeType::BlockMap:
if (m_pState->HasBegunContent())
m_stream << "\n";
break; break;
} }
} }
@ -603,12 +585,8 @@ void Emitter::BlockMapPrepareLongKeyValue(EmitterNodeType::value child) {
case EmitterNodeType::Scalar: case EmitterNodeType::Scalar:
case EmitterNodeType::FlowSeq: case EmitterNodeType::FlowSeq:
case EmitterNodeType::FlowMap: case EmitterNodeType::FlowMap:
SpaceOrIndentTo(true, curIndent + 1);
break;
case EmitterNodeType::BlockSeq: case EmitterNodeType::BlockSeq:
case EmitterNodeType::BlockMap: case EmitterNodeType::BlockMap:
if (m_pState->HasBegunContent())
m_stream << "\n";
SpaceOrIndentTo(true, curIndent + 1); SpaceOrIndentTo(true, curIndent + 1);
break; break;
} }
@ -647,9 +625,6 @@ void Emitter::BlockMapPrepareSimpleKeyValue(EmitterNodeType::value child) {
const std::size_t nextIndent = curIndent + m_pState->CurGroupIndent(); const std::size_t nextIndent = curIndent + m_pState->CurGroupIndent();
if (!m_pState->HasBegunNode()) { if (!m_pState->HasBegunNode()) {
if (m_pState->HasAlias()) {
m_stream << " ";
}
m_stream << ":"; m_stream << ":";
} }
@ -703,29 +678,25 @@ void Emitter::StartedScalar() { m_pState->StartedScalar(); }
// ******************************************************************************************* // *******************************************************************************************
// overloads of Write // overloads of Write
StringEscaping::value GetStringEscapingStyle(const EMITTER_MANIP emitterManip) {
switch (emitterManip) {
case EscapeNonAscii:
return StringEscaping::NonAscii;
case EscapeAsJson:
return StringEscaping::JSON;
default:
return StringEscaping::None;
break;
}
}
Emitter& Emitter::Write(const std::string& str) { Emitter& Emitter::Write(const std::string& str) {
if (!good()) if (!good())
return *this; return *this;
StringEscaping::value stringEscaping = GetStringEscapingStyle(m_pState->GetOutputCharset()); StringEscaping::value stringEscaping = StringEscaping::None;
switch (m_pState->GetOutputCharset()) {
case EscapeNonAscii:
stringEscaping = StringEscaping::NonAscii;
break;
case EscapeAsJson:
stringEscaping = StringEscaping::JSON;
break;
}
const StringFormat::value strFormat = const StringFormat::value strFormat =
Utils::ComputeStringFormat(str, m_pState->GetStringFormat(), Utils::ComputeStringFormat(str, m_pState->GetStringFormat(),
m_pState->CurGroupFlowType(), stringEscaping == StringEscaping::NonAscii); m_pState->CurGroupFlowType(), stringEscaping == StringEscaping::NonAscii);
if (strFormat == StringFormat::Literal || str.size() > 1024) if (strFormat == StringFormat::Literal)
m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local); m_pState->SetMapKeyFormat(YAML::LongKey, FmtScope::Local);
PrepareNode(EmitterNodeType::Scalar); PrepareNode(EmitterNodeType::Scalar);
@ -808,21 +779,6 @@ const char* Emitter::ComputeFullBoolName(bool b) const {
// these answers // these answers
} }
const char* Emitter::ComputeNullName() const {
switch (m_pState->GetNullFormat()) {
case LowerNull:
return "null";
case UpperNull:
return "NULL";
case CamelNull:
return "Null";
case TildeNull:
// fallthrough
default:
return "~";
}
}
Emitter& Emitter::Write(bool b) { Emitter& Emitter::Write(bool b) {
if (!good()) if (!good())
return *this; return *this;
@ -844,10 +800,10 @@ Emitter& Emitter::Write(char ch) {
if (!good()) if (!good())
return *this; return *this;
PrepareNode(EmitterNodeType::Scalar); PrepareNode(EmitterNodeType::Scalar);
Utils::WriteChar(m_stream, ch, GetStringEscapingStyle(m_pState->GetOutputCharset())); Utils::WriteChar(m_stream, ch, m_pState->GetOutputCharset() == EscapeAsJson);
StartedScalar(); StartedScalar();
return *this; return *this;
@ -871,8 +827,6 @@ Emitter& Emitter::Write(const _Alias& alias) {
StartedScalar(); StartedScalar();
m_pState->SetAlias();
return *this; return *this;
} }
@ -950,7 +904,10 @@ Emitter& Emitter::Write(const _Null& /*null*/) {
PrepareNode(EmitterNodeType::Scalar); PrepareNode(EmitterNodeType::Scalar);
m_stream << ComputeNullName(); if (m_pState->GetNullFormat() == NullAsNull)
m_stream << "null";
else
m_stream << "~";
StartedScalar(); StartedScalar();
@ -969,4 +926,4 @@ Emitter& Emitter::Write(const Binary& binary) {
return *this; return *this;
} }
} // namespace YAML }

View File

@ -6,35 +6,30 @@
namespace YAML { namespace YAML {
EmitterState::EmitterState() EmitterState::EmitterState()
: m_isGood(true), : m_isGood(true),
m_lastError{},
// default global manipulators
m_charset(EmitNonAscii),
m_strFmt(Auto),
m_boolFmt(TrueFalseBool),
m_boolLengthFmt(LongBool),
m_boolCaseFmt(LowerCase),
m_nullFmt(TildeNull),
m_intFmt(Dec),
m_indent(2),
m_preCommentIndent(2),
m_postCommentIndent(1),
m_seqFmt(Block),
m_mapFmt(Block),
m_mapKeyFmt(Auto),
m_floatPrecision(std::numeric_limits<float>::max_digits10),
m_doublePrecision(std::numeric_limits<double>::max_digits10),
//
m_modifiedSettings{},
m_globalModifiedSettings{},
m_groups{},
m_curIndent(0), m_curIndent(0),
m_hasAnchor(false), m_hasAnchor(false),
m_hasAlias(false),
m_hasTag(false), m_hasTag(false),
m_hasNonContent(false), m_hasNonContent(false),
m_docCount(0) {} m_docCount(0) {
// set default global manipulators
m_charset.set(EmitNonAscii);
m_strFmt.set(Auto);
m_boolFmt.set(TrueFalseBool);
m_nullFmt.set(NullAsTilde);
m_boolLengthFmt.set(LongBool);
m_boolCaseFmt.set(LowerCase);
m_intFmt.set(Dec);
m_indent.set(2);
m_preCommentIndent.set(2);
m_postCommentIndent.set(1);
m_seqFmt.set(Block);
m_mapFmt.set(Block);
m_mapKeyFmt.set(Auto);
m_floatPrecision.set(std::numeric_limits<float>::digits10 + 1);
m_doublePrecision.set(std::numeric_limits<double>::digits10 + 1);
}
EmitterState::~EmitterState() = default; EmitterState::~EmitterState() {}
// SetLocalValue // SetLocalValue
// . We blindly tries to set all possible formatters to this value // . We blindly tries to set all possible formatters to this value
@ -54,8 +49,6 @@ void EmitterState::SetLocalValue(EMITTER_MANIP value) {
void EmitterState::SetAnchor() { m_hasAnchor = true; } void EmitterState::SetAnchor() { m_hasAnchor = true; }
void EmitterState::SetAlias() { m_hasAlias = true; }
void EmitterState::SetTag() { m_hasTag = true; } void EmitterState::SetTag() { m_hasTag = true; }
void EmitterState::SetNonContent() { m_hasNonContent = true; } void EmitterState::SetNonContent() { m_hasNonContent = true; }
@ -90,7 +83,6 @@ void EmitterState::StartedNode() {
} }
m_hasAnchor = false; m_hasAnchor = false;
m_hasAlias = false;
m_hasTag = false; m_hasTag = false;
m_hasNonContent = false; m_hasNonContent = false;
} }
@ -100,13 +92,15 @@ EmitterNodeType::value EmitterState::NextGroupType(
if (type == GroupType::Seq) { if (type == GroupType::Seq) {
if (GetFlowType(type) == Block) if (GetFlowType(type) == Block)
return EmitterNodeType::BlockSeq; return EmitterNodeType::BlockSeq;
return EmitterNodeType::FlowSeq; else
return EmitterNodeType::FlowSeq;
} else {
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockMap;
else
return EmitterNodeType::FlowMap;
} }
if (GetFlowType(type) == Block)
return EmitterNodeType::BlockMap;
return EmitterNodeType::FlowMap;
// can't happen // can't happen
assert(false); assert(false);
return EmitterNodeType::NoType; return EmitterNodeType::NoType;
@ -160,15 +154,9 @@ void EmitterState::EndedGroup(GroupType::value type) {
if (m_groups.empty()) { if (m_groups.empty()) {
if (type == GroupType::Seq) { if (type == GroupType::Seq) {
return SetError(ErrorMsg::UNEXPECTED_END_SEQ); return SetError(ErrorMsg::UNEXPECTED_END_SEQ);
} else {
return SetError(ErrorMsg::UNEXPECTED_END_MAP);
} }
return SetError(ErrorMsg::UNEXPECTED_END_MAP);
}
if (m_hasTag) {
SetError(ErrorMsg::INVALID_TAG);
}
if (m_hasAnchor) {
SetError(ErrorMsg::INVALID_ANCHOR);
} }
// get rid of the current group // get rid of the current group
@ -190,9 +178,6 @@ void EmitterState::EndedGroup(GroupType::value type) {
m_globalModifiedSettings.restore(); m_globalModifiedSettings.restore();
ClearModifiedSettings(); ClearModifiedSettings();
m_hasAnchor = false;
m_hasTag = false;
m_hasNonContent = false;
} }
EmitterNodeType::value EmitterState::CurGroupNodeType() const { EmitterNodeType::value EmitterState::CurGroupNodeType() const {
@ -233,10 +218,6 @@ std::size_t EmitterState::LastIndent() const {
void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); } void EmitterState::ClearModifiedSettings() { m_modifiedSettings.clear(); }
void EmitterState::RestoreGlobalModifiedSettings() {
m_globalModifiedSettings.restore();
}
bool EmitterState::SetOutputCharset(EMITTER_MANIP value, bool EmitterState::SetOutputCharset(EMITTER_MANIP value,
FmtScope::value scope) { FmtScope::value scope) {
switch (value) { switch (value) {
@ -302,14 +283,12 @@ bool EmitterState::SetBoolCaseFormat(EMITTER_MANIP value,
bool EmitterState::SetNullFormat(EMITTER_MANIP value, FmtScope::value scope) { bool EmitterState::SetNullFormat(EMITTER_MANIP value, FmtScope::value scope) {
switch (value) { switch (value) {
case LowerNull: case NullAsTilde:
case UpperNull: case NullAsNull:
case CamelNull: _Set(m_nullFmt, value, scope);
case TildeNull: return true;
_Set(m_nullFmt, value, scope); default:
return true; return false;
default:
return false;
} }
} }
@ -384,7 +363,7 @@ bool EmitterState::SetMapKeyFormat(EMITTER_MANIP value, FmtScope::value scope) {
} }
bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) { bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) {
if (value > std::numeric_limits<float>::max_digits10) if (value > std::numeric_limits<float>::digits10 + 1)
return false; return false;
_Set(m_floatPrecision, value, scope); _Set(m_floatPrecision, value, scope);
return true; return true;
@ -392,9 +371,9 @@ bool EmitterState::SetFloatPrecision(std::size_t value, FmtScope::value scope) {
bool EmitterState::SetDoublePrecision(std::size_t value, bool EmitterState::SetDoublePrecision(std::size_t value,
FmtScope::value scope) { FmtScope::value scope) {
if (value > std::numeric_limits<double>::max_digits10) if (value > std::numeric_limits<double>::digits10 + 1)
return false; return false;
_Set(m_doublePrecision, value, scope); _Set(m_doublePrecision, value, scope);
return true; return true;
} }
} // namespace YAML }

View File

@ -43,7 +43,6 @@ class EmitterState {
// node handling // node handling
void SetAnchor(); void SetAnchor();
void SetAlias();
void SetTag(); void SetTag();
void SetNonContent(); void SetNonContent();
void SetLongKey(); void SetLongKey();
@ -66,7 +65,6 @@ class EmitterState {
std::size_t LastIndent() const; std::size_t LastIndent() const;
std::size_t CurIndent() const { return m_curIndent; } std::size_t CurIndent() const { return m_curIndent; }
bool HasAnchor() const { return m_hasAnchor; } bool HasAnchor() const { return m_hasAnchor; }
bool HasAlias() const { return m_hasAlias; }
bool HasTag() const { return m_hasTag; } bool HasTag() const { return m_hasTag; }
bool HasBegunNode() const { bool HasBegunNode() const {
return m_hasAnchor || m_hasTag || m_hasNonContent; return m_hasAnchor || m_hasTag || m_hasNonContent;
@ -74,7 +72,6 @@ class EmitterState {
bool HasBegunContent() const { return m_hasAnchor || m_hasTag; } bool HasBegunContent() const { return m_hasAnchor || m_hasTag; }
void ClearModifiedSettings(); void ClearModifiedSettings();
void RestoreGlobalModifiedSettings();
// formatters // formatters
void SetLocalValue(EMITTER_MANIP value); void SetLocalValue(EMITTER_MANIP value);
@ -135,9 +132,9 @@ class EmitterState {
Setting<EMITTER_MANIP> m_charset; Setting<EMITTER_MANIP> m_charset;
Setting<EMITTER_MANIP> m_strFmt; Setting<EMITTER_MANIP> m_strFmt;
Setting<EMITTER_MANIP> m_boolFmt; Setting<EMITTER_MANIP> m_boolFmt;
Setting<EMITTER_MANIP> m_nullFmt;
Setting<EMITTER_MANIP> m_boolLengthFmt; Setting<EMITTER_MANIP> m_boolLengthFmt;
Setting<EMITTER_MANIP> m_boolCaseFmt; Setting<EMITTER_MANIP> m_boolCaseFmt;
Setting<EMITTER_MANIP> m_nullFmt;
Setting<EMITTER_MANIP> m_intFmt; Setting<EMITTER_MANIP> m_intFmt;
Setting<std::size_t> m_indent; Setting<std::size_t> m_indent;
Setting<std::size_t> m_preCommentIndent, m_postCommentIndent; Setting<std::size_t> m_preCommentIndent, m_postCommentIndent;
@ -152,12 +149,7 @@ class EmitterState {
struct Group { struct Group {
explicit Group(GroupType::value type_) explicit Group(GroupType::value type_)
: type(type_), : type(type_), indent(0), childCount(0), longKey(false) {}
flowType{},
indent(0),
childCount(0),
longKey(false),
modifiedSettings{} {}
GroupType::value type; GroupType::value type;
FlowType::value flowType; FlowType::value flowType;
@ -189,7 +181,6 @@ class EmitterState {
std::vector<std::unique_ptr<Group>> m_groups; std::vector<std::unique_ptr<Group>> m_groups;
std::size_t m_curIndent; std::size_t m_curIndent;
bool m_hasAnchor; bool m_hasAnchor;
bool m_hasAlias;
bool m_hasTag; bool m_hasTag;
bool m_hasNonContent; bool m_hasNonContent;
std::size_t m_docCount; std::size_t m_docCount;
@ -211,6 +202,6 @@ void EmitterState::_Set(Setting<T>& fmt, T value, FmtScope::value scope) {
assert(false); assert(false);
} }
} }
} // namespace YAML }
#endif // EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // EMITTERSTATE_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -1,4 +1,3 @@
#include <algorithm>
#include <iomanip> #include <iomanip>
#include <sstream> #include <sstream>
@ -9,8 +8,8 @@
#include "regeximpl.h" #include "regeximpl.h"
#include "stringsource.h" #include "stringsource.h"
#include "yaml-cpp/binary.h" // IWYU pragma: keep #include "yaml-cpp/binary.h" // IWYU pragma: keep
#include "yaml-cpp/null.h"
#include "yaml-cpp/ostream_wrapper.h" #include "yaml-cpp/ostream_wrapper.h"
#include "yaml-cpp/null.h"
namespace YAML { namespace YAML {
namespace Utils { namespace Utils {
@ -135,12 +134,12 @@ void WriteCodePoint(ostream_wrapper& out, int codePoint) {
if (codePoint < 0 || codePoint > 0x10FFFF) { if (codePoint < 0 || codePoint > 0x10FFFF) {
codePoint = REPLACEMENT_CHARACTER; codePoint = REPLACEMENT_CHARACTER;
} }
if (codePoint <= 0x7F) { if (codePoint < 0x7F) {
out << static_cast<char>(codePoint); out << static_cast<char>(codePoint);
} else if (codePoint <= 0x7FF) { } else if (codePoint < 0x7FF) {
out << static_cast<char>(0xC0 | (codePoint >> 6)) out << static_cast<char>(0xC0 | (codePoint >> 6))
<< static_cast<char>(0x80 | (codePoint & 0x3F)); << static_cast<char>(0x80 | (codePoint & 0x3F));
} else if (codePoint <= 0xFFFF) { } else if (codePoint < 0xFFFF) {
out << static_cast<char>(0xE0 | (codePoint >> 12)) out << static_cast<char>(0xE0 | (codePoint >> 12))
<< static_cast<char>(0x80 | ((codePoint >> 6) & 0x3F)) << static_cast<char>(0x80 | ((codePoint >> 6) & 0x3F))
<< static_cast<char>(0x80 | (codePoint & 0x3F)); << static_cast<char>(0x80 | (codePoint & 0x3F));
@ -174,13 +173,13 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
// then check until something is disallowed // then check until something is disallowed
static const RegEx& disallowed_flow = static const RegEx& disallowed_flow =
Exp::EndScalarInFlow() | (Exp::BlankOrBreak() + Exp::Comment()) | Exp::EndScalarInFlow() || (Exp::BlankOrBreak() + Exp::Comment()) ||
Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() | Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() ||
Exp::Tab() | Exp::Ampersand(); Exp::Tab();
static const RegEx& disallowed_block = static const RegEx& disallowed_block =
Exp::EndScalar() | (Exp::BlankOrBreak() + Exp::Comment()) | Exp::EndScalar() || (Exp::BlankOrBreak() + Exp::Comment()) ||
Exp::NotPrintable() | Exp::Utf8_ByteOrderMark() | Exp::Break() | Exp::NotPrintable() || Exp::Utf8_ByteOrderMark() || Exp::Break() ||
Exp::Tab() | Exp::Ampersand(); Exp::Tab();
const RegEx& disallowed = const RegEx& disallowed =
flowType == FlowType::Flow ? disallowed_flow : disallowed_block; flowType == FlowType::Flow ? disallowed_flow : disallowed_block;
@ -200,10 +199,15 @@ bool IsValidPlainScalar(const std::string& str, FlowType::value flowType,
bool IsValidSingleQuotedScalar(const std::string& str, bool escapeNonAscii) { bool IsValidSingleQuotedScalar(const std::string& str, bool escapeNonAscii) {
// TODO: check for non-printable characters? // TODO: check for non-printable characters?
return std::none_of(str.begin(), str.end(), [=](char ch) { for (std::size_t i = 0; i < str.size(); i++) {
return (escapeNonAscii && (0x80 <= static_cast<unsigned char>(ch))) || if (escapeNonAscii && (0x80 <= static_cast<unsigned char>(str[i]))) {
(ch == '\n'); return false;
}); }
if (str[i] == '\n') {
return false;
}
}
return true;
} }
bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType, bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType,
@ -213,9 +217,12 @@ bool IsValidLiteralScalar(const std::string& str, FlowType::value flowType,
} }
// TODO: check for non-printable characters? // TODO: check for non-printable characters?
return std::none_of(str.begin(), str.end(), [=](char ch) { for (std::size_t i = 0; i < str.size(); i++) {
return (escapeNonAscii && (0x80 <= static_cast<unsigned char>(ch))); if (escapeNonAscii && (0x80 <= static_cast<unsigned char>(str[i]))) {
}); return false;
}
}
return true;
} }
std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) { std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) {
@ -227,24 +234,24 @@ std::pair<uint16_t, uint16_t> EncodeUTF16SurrogatePair(int codePoint) {
}; };
} }
void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, StringEscaping::value stringEscapingStyle) { void WriteDoubleQuoteEscapeSequence(ostream_wrapper& out, int codePoint, bool escapeAsJson) {
static const char hexDigits[] = "0123456789abcdef"; static const char hexDigits[] = "0123456789abcdef";
out << "\\"; out << "\\";
int digits = 8; int digits = 8;
if (codePoint < 0xFF && stringEscapingStyle != StringEscaping::JSON) { if (codePoint < 0xFF && !escapeAsJson) {
out << "x"; out << "x";
digits = 2; digits = 2;
} else if (codePoint < 0xFFFF) { } else if (codePoint < 0xFFFF) {
out << "u"; out << "u";
digits = 4; digits = 4;
} else if (stringEscapingStyle != StringEscaping::JSON) { } else if (!escapeAsJson) {
out << "U"; out << "U";
digits = 8; digits = 8;
} else { } else {
auto surrogatePair = EncodeUTF16SurrogatePair(codePoint); auto surrogatePair = EncodeUTF16SurrogatePair(codePoint);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.first, stringEscapingStyle); WriteDoubleQuoteEscapeSequence(out, surrogatePair.first, true);
WriteDoubleQuoteEscapeSequence(out, surrogatePair.second, stringEscapingStyle); WriteDoubleQuoteEscapeSequence(out, surrogatePair.second, true);
return; return;
} }
@ -265,7 +272,7 @@ bool WriteAliasName(ostream_wrapper& out, const std::string& str) {
} }
return true; return true;
} }
} // namespace }
StringFormat::value ComputeStringFormat(const std::string& str, StringFormat::value ComputeStringFormat(const std::string& str,
EMITTER_MANIP strFormat, EMITTER_MANIP strFormat,
@ -348,12 +355,12 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
if (codePoint < 0x20 || if (codePoint < 0x20 ||
(codePoint >= 0x80 && (codePoint >= 0x80 &&
codePoint <= 0xA0)) { // Control characters and non-breaking space codePoint <= 0xA0)) { // Control characters and non-breaking space
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping); WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping == StringEscaping::JSON);
} else if (codePoint == 0xFEFF) { // Byte order marks (ZWNS) should be } else if (codePoint == 0xFEFF) { // Byte order marks (ZWNS) should be
// escaped (YAML 1.2, sec. 5.2) // escaped (YAML 1.2, sec. 5.2)
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping); WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping == StringEscaping::JSON);
} else if (stringEscaping == StringEscaping::NonAscii && codePoint > 0x7E) { } else if (stringEscaping == StringEscaping::NonAscii && codePoint > 0x7E) {
WriteDoubleQuoteEscapeSequence(out, codePoint, stringEscaping); WriteDoubleQuoteEscapeSequence(out, codePoint, false);
} else { } else {
WriteCodePoint(out, codePoint); WriteCodePoint(out, codePoint);
} }
@ -366,41 +373,41 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
bool WriteLiteralString(ostream_wrapper& out, const std::string& str, bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent) { std::size_t indent) {
out << "|\n"; out << "|\n";
out << IndentTo(indent);
int codePoint; int codePoint;
for (std::string::const_iterator i = str.begin(); for (std::string::const_iterator i = str.begin();
GetNextCodePointAndAdvance(codePoint, i, str.end());) { GetNextCodePointAndAdvance(codePoint, i, str.end());) {
if (codePoint == '\n') { if (codePoint == '\n') {
out << "\n"; out << "\n" << IndentTo(indent);
} else { } else {
out<< IndentTo(indent);
WriteCodePoint(out, codePoint); WriteCodePoint(out, codePoint);
} }
} }
return true; return true;
} }
bool WriteChar(ostream_wrapper& out, char ch, StringEscaping::value stringEscapingStyle) { bool WriteChar(ostream_wrapper& out, char ch, bool escapeAsJson) {
if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) { if (('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')) {
out << ch; out << ch;
} else if (ch == '\"') { } else if (ch == '\"') {
out << R"("\"")"; out << "\"\\\"\"";
} else if (ch == '\t') { } else if (ch == '\t') {
out << R"("\t")"; out << "\"\\t\"";
} else if (ch == '\n') { } else if (ch == '\n') {
out << R"("\n")"; out << "\"\\n\"";
} else if (ch == '\b') { } else if (ch == '\b') {
out << R"("\b")"; out << "\"\\b\"";
} else if (ch == '\r') { } else if (ch == '\r') {
out << R"("\r")"; out << "\"\\r\"";
} else if (ch == '\f') { } else if (ch == '\f') {
out << R"("\f")"; out << "\"\\f\"";
} else if (ch == '\\') { } else if (ch == '\\') {
out << R"("\\")"; out << "\"\\\\\"";
} else if (0x20 <= ch && ch <= 0x7e) { } else if ((0x20 <= ch && ch <= 0x7e) || ch == ' ') {
out << "\"" << ch << "\""; out << "\"" << ch << "\"";
} else { } else {
out << "\""; out << "\"";
WriteDoubleQuoteEscapeSequence(out, ch, stringEscapingStyle); WriteDoubleQuoteEscapeSequence(out, ch, escapeAsJson);
out << "\""; out << "\"";
} }
return true; return true;
@ -415,8 +422,8 @@ bool WriteComment(ostream_wrapper& out, const std::string& str,
for (std::string::const_iterator i = str.begin(); for (std::string::const_iterator i = str.begin();
GetNextCodePointAndAdvance(codePoint, i, str.end());) { GetNextCodePointAndAdvance(codePoint, i, str.end());) {
if (codePoint == '\n') { if (codePoint == '\n') {
out << "\n" out << "\n" << IndentTo(curIndent) << "#"
<< IndentTo(curIndent) << "#" << Indentation(postCommentIndent); << Indentation(postCommentIndent);
out.set_comment(); out.set_comment();
} else { } else {
WriteCodePoint(out, codePoint); WriteCodePoint(out, codePoint);
@ -493,5 +500,5 @@ bool WriteBinary(ostream_wrapper& out, const Binary& binary) {
StringEscaping::None); StringEscaping::None);
return true; return true;
} }
} // namespace Utils }
} // namespace YAML }

View File

@ -39,8 +39,7 @@ bool WriteDoubleQuotedString(ostream_wrapper& out, const std::string& str,
StringEscaping::value stringEscaping); StringEscaping::value stringEscaping);
bool WriteLiteralString(ostream_wrapper& out, const std::string& str, bool WriteLiteralString(ostream_wrapper& out, const std::string& str,
std::size_t indent); std::size_t indent);
bool WriteChar(ostream_wrapper& out, char ch, bool WriteChar(ostream_wrapper& out, char ch, bool escapeAsJson);
StringEscaping::value stringEscapingStyle);
bool WriteComment(ostream_wrapper& out, const std::string& str, bool WriteComment(ostream_wrapper& out, const std::string& str,
std::size_t postCommentIndent); std::size_t postCommentIndent);
bool WriteAlias(ostream_wrapper& out, const std::string& str); bool WriteAlias(ostream_wrapper& out, const std::string& str);

View File

@ -1,20 +1,19 @@
#include "yaml-cpp/exceptions.h" #include "yaml-cpp/exceptions.h"
#include "yaml-cpp/noexcept.h"
namespace YAML { namespace YAML {
// These destructors are defined out-of-line so the vtable is only emitted once. // These destructors are defined out-of-line so the vtable is only emitted once.
Exception::~Exception() YAML_CPP_NOEXCEPT = default; Exception::~Exception() NOEXCEPT {}
ParserException::~ParserException() YAML_CPP_NOEXCEPT = default; ParserException::~ParserException() NOEXCEPT {}
RepresentationException::~RepresentationException() YAML_CPP_NOEXCEPT = default; RepresentationException::~RepresentationException() NOEXCEPT {}
InvalidScalar::~InvalidScalar() YAML_CPP_NOEXCEPT = default; InvalidScalar::~InvalidScalar() NOEXCEPT {}
KeyNotFound::~KeyNotFound() YAML_CPP_NOEXCEPT = default; KeyNotFound::~KeyNotFound() NOEXCEPT {}
InvalidNode::~InvalidNode() YAML_CPP_NOEXCEPT = default; InvalidNode::~InvalidNode() NOEXCEPT {}
BadConversion::~BadConversion() YAML_CPP_NOEXCEPT = default; BadConversion::~BadConversion() NOEXCEPT {}
BadDereference::~BadDereference() YAML_CPP_NOEXCEPT = default; BadDereference::~BadDereference() NOEXCEPT {}
BadSubscript::~BadSubscript() YAML_CPP_NOEXCEPT = default; BadSubscript::~BadSubscript() NOEXCEPT {}
BadPushback::~BadPushback() YAML_CPP_NOEXCEPT = default; BadPushback::~BadPushback() NOEXCEPT {}
BadInsert::~BadInsert() YAML_CPP_NOEXCEPT = default; BadInsert::~BadInsert() NOEXCEPT {}
EmitterException::~EmitterException() YAML_CPP_NOEXCEPT = default; EmitterException::~EmitterException() NOEXCEPT {}
BadFile::~BadFile() YAML_CPP_NOEXCEPT = default; BadFile::~BadFile() NOEXCEPT {}
} // namespace YAML }

View File

@ -12,7 +12,8 @@ namespace YAML {
namespace Exp { namespace Exp {
unsigned ParseHex(const std::string& str, const Mark& mark) { unsigned ParseHex(const std::string& str, const Mark& mark) {
unsigned value = 0; unsigned value = 0;
for (char ch : str) { for (std::size_t i = 0; i < str.size(); i++) {
char ch = str[i];
int digit = 0; int digit = 0;
if ('a' <= ch && ch <= 'f') if ('a' <= ch && ch <= 'f')
digit = ch - 'a' + 10; digit = ch - 'a' + 10;
@ -54,16 +55,14 @@ std::string Escape(Stream& in, int codeLength) {
// now break it up into chars // now break it up into chars
if (value <= 0x7F) if (value <= 0x7F)
return Str(value); return Str(value);
else if (value <= 0x7FF)
if (value <= 0x7FF)
return Str(0xC0 + (value >> 6)) + Str(0x80 + (value & 0x3F)); return Str(0xC0 + (value >> 6)) + Str(0x80 + (value & 0x3F));
else if (value <= 0xFFFF)
if (value <= 0xFFFF)
return Str(0xE0 + (value >> 12)) + Str(0x80 + ((value >> 6) & 0x3F)) + return Str(0xE0 + (value >> 12)) + Str(0x80 + ((value >> 6) & 0x3F)) +
Str(0x80 + (value & 0x3F)); Str(0x80 + (value & 0x3F));
else
return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) + return Str(0xF0 + (value >> 18)) + Str(0x80 + ((value >> 12) & 0x3F)) +
Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F)); Str(0x80 + ((value >> 6) & 0x3F)) + Str(0x80 + (value & 0x3F));
} }
// Escape // Escape
@ -105,7 +104,7 @@ std::string Escape(Stream& in) {
case 'e': case 'e':
return "\x1B"; return "\x1B";
case ' ': case ' ':
return R"( )"; return "\x20";
case '\"': case '\"':
return "\""; return "\"";
case '\'': case '\'':
@ -133,5 +132,5 @@ std::string Escape(Stream& in) {
std::stringstream msg; std::stringstream msg;
throw ParserException(in.mark(), std::string(ErrorMsg::INVALID_ESCAPE) + ch); throw ParserException(in.mark(), std::string(ErrorMsg::INVALID_ESCAPE) + ch);
} }
} // namespace Exp }
} // namespace YAML }

View File

@ -33,15 +33,15 @@ inline const RegEx& Tab() {
return e; return e;
} }
inline const RegEx& Blank() { inline const RegEx& Blank() {
static const RegEx e = Space() | Tab(); static const RegEx e = Space() || Tab();
return e; return e;
} }
inline const RegEx& Break() { inline const RegEx& Break() {
static const RegEx e = RegEx('\n') | RegEx("\r\n") | RegEx('\r'); static const RegEx e = RegEx('\n') || RegEx("\r\n");
return e; return e;
} }
inline const RegEx& BlankOrBreak() { inline const RegEx& BlankOrBreak() {
static const RegEx e = Blank() | Break(); static const RegEx e = Blank() || Break();
return e; return e;
} }
inline const RegEx& Digit() { inline const RegEx& Digit() {
@ -49,29 +49,29 @@ inline const RegEx& Digit() {
return e; return e;
} }
inline const RegEx& Alpha() { inline const RegEx& Alpha() {
static const RegEx e = RegEx('a', 'z') | RegEx('A', 'Z'); static const RegEx e = RegEx('a', 'z') || RegEx('A', 'Z');
return e; return e;
} }
inline const RegEx& AlphaNumeric() { inline const RegEx& AlphaNumeric() {
static const RegEx e = Alpha() | Digit(); static const RegEx e = Alpha() || Digit();
return e; return e;
} }
inline const RegEx& Word() { inline const RegEx& Word() {
static const RegEx e = AlphaNumeric() | RegEx('-'); static const RegEx e = AlphaNumeric() || RegEx('-');
return e; return e;
} }
inline const RegEx& Hex() { inline const RegEx& Hex() {
static const RegEx e = Digit() | RegEx('A', 'F') | RegEx('a', 'f'); static const RegEx e = Digit() || RegEx('A', 'F') || RegEx('a', 'f');
return e; return e;
} }
// Valid Unicode code points that are not part of c-printable (YAML 1.2, sec. // Valid Unicode code points that are not part of c-printable (YAML 1.2, sec.
// 5.1) // 5.1)
inline const RegEx& NotPrintable() { inline const RegEx& NotPrintable() {
static const RegEx e = static const RegEx e =
RegEx(0) | RegEx(0) ||
RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) | RegEx("\x01\x02\x03\x04\x05\x06\x07\x08\x0B\x0C\x7F", REGEX_OR) ||
RegEx(0x0E, 0x1F) | RegEx(0x0E, 0x1F) ||
(RegEx('\xC2') + (RegEx('\x80', '\x84') | RegEx('\x86', '\x9F'))); (RegEx('\xC2') + (RegEx('\x80', '\x84') || RegEx('\x86', '\x9F')));
return e; return e;
} }
inline const RegEx& Utf8_ByteOrderMark() { inline const RegEx& Utf8_ByteOrderMark() {
@ -82,19 +82,19 @@ inline const RegEx& Utf8_ByteOrderMark() {
// actual tags // actual tags
inline const RegEx& DocStart() { inline const RegEx& DocStart() {
static const RegEx e = RegEx("---") + (BlankOrBreak() | RegEx()); static const RegEx e = RegEx("---") + (BlankOrBreak() || RegEx());
return e; return e;
} }
inline const RegEx& DocEnd() { inline const RegEx& DocEnd() {
static const RegEx e = RegEx("...") + (BlankOrBreak() | RegEx()); static const RegEx e = RegEx("...") + (BlankOrBreak() || RegEx());
return e; return e;
} }
inline const RegEx& DocIndicator() { inline const RegEx& DocIndicator() {
static const RegEx e = DocStart() | DocEnd(); static const RegEx e = DocStart() || DocEnd();
return e; return e;
} }
inline const RegEx& BlockEntry() { inline const RegEx& BlockEntry() {
static const RegEx e = RegEx('-') + (BlankOrBreak() | RegEx()); static const RegEx e = RegEx('-') + (BlankOrBreak() || RegEx());
return e; return e;
} }
inline const RegEx& Key() { inline const RegEx& Key() {
@ -106,40 +106,36 @@ inline const RegEx& KeyInFlow() {
return e; return e;
} }
inline const RegEx& Value() { inline const RegEx& Value() {
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx()); static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx());
return e; return e;
} }
inline const RegEx& ValueInFlow() { inline const RegEx& ValueInFlow() {
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx(",]}", REGEX_OR)); static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx(",}", REGEX_OR));
return e; return e;
} }
inline const RegEx& ValueInJSONFlow() { inline const RegEx& ValueInJSONFlow() {
static const RegEx e = RegEx(':'); static const RegEx e = RegEx(':');
return e; return e;
} }
inline const RegEx& Ampersand() {
static const RegEx e = RegEx('&');
return e;
}
inline const RegEx Comment() { inline const RegEx Comment() {
static const RegEx e = RegEx('#'); static const RegEx e = RegEx('#');
return e; return e;
} }
inline const RegEx& Anchor() { inline const RegEx& Anchor() {
static const RegEx e = !(RegEx("[]{},", REGEX_OR) | BlankOrBreak()); static const RegEx e = !(RegEx("[]{},", REGEX_OR) || BlankOrBreak());
return e; return e;
} }
inline const RegEx& AnchorEnd() { inline const RegEx& AnchorEnd() {
static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) | BlankOrBreak(); static const RegEx e = RegEx("?:,]}%@`", REGEX_OR) || BlankOrBreak();
return e; return e;
} }
inline const RegEx& URI() { inline const RegEx& URI() {
static const RegEx e = Word() | RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) | static const RegEx e = Word() || RegEx("#;/?:@&=+$,_.!~*'()[]", REGEX_OR) ||
(RegEx('%') + Hex() + Hex()); (RegEx('%') + Hex() + Hex());
return e; return e;
} }
inline const RegEx& Tag() { inline const RegEx& Tag() {
static const RegEx e = Word() | RegEx("#;/?:@&=+$_.~*'()", REGEX_OR) | static const RegEx e = Word() || RegEx("#;/?:@&=+$_.~*'", REGEX_OR) ||
(RegEx('%') + Hex() + Hex()); (RegEx('%') + Hex() + Hex());
return e; return e;
} }
@ -152,34 +148,34 @@ inline const RegEx& Tag() {
// space. // space.
inline const RegEx& PlainScalar() { inline const RegEx& PlainScalar() {
static const RegEx e = static const RegEx e =
!(BlankOrBreak() | RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) | !(BlankOrBreak() || RegEx(",[]{}#&*!|>\'\"%@`", REGEX_OR) ||
(RegEx("-?:", REGEX_OR) + (BlankOrBreak() | RegEx()))); (RegEx("-?:", REGEX_OR) + (BlankOrBreak() || RegEx())));
return e; return e;
} }
inline const RegEx& PlainScalarInFlow() { inline const RegEx& PlainScalarInFlow() {
static const RegEx e = static const RegEx e =
!(BlankOrBreak() | RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) | !(BlankOrBreak() || RegEx("?,[]{}#&*!|>\'\"%@`", REGEX_OR) ||
(RegEx("-:", REGEX_OR) + (Blank() | RegEx()))); (RegEx("-:", REGEX_OR) + Blank()));
return e; return e;
} }
inline const RegEx& EndScalar() { inline const RegEx& EndScalar() {
static const RegEx e = RegEx(':') + (BlankOrBreak() | RegEx()); static const RegEx e = RegEx(':') + (BlankOrBreak() || RegEx());
return e; return e;
} }
inline const RegEx& EndScalarInFlow() { inline const RegEx& EndScalarInFlow() {
static const RegEx e = static const RegEx e =
(RegEx(':') + (BlankOrBreak() | RegEx() | RegEx(",]}", REGEX_OR))) | (RegEx(':') + (BlankOrBreak() || RegEx() || RegEx(",]}", REGEX_OR))) ||
RegEx(",?[]{}", REGEX_OR); RegEx(",?[]{}", REGEX_OR);
return e; return e;
} }
inline const RegEx& ScanScalarEndInFlow() { inline const RegEx& ScanScalarEndInFlow() {
static const RegEx e = (EndScalarInFlow() | (BlankOrBreak() + Comment())); static const RegEx e = (EndScalarInFlow() || (BlankOrBreak() + Comment()));
return e; return e;
} }
inline const RegEx& ScanScalarEnd() { inline const RegEx& ScanScalarEnd() {
static const RegEx e = EndScalar() | (BlankOrBreak() + Comment()); static const RegEx e = EndScalar() || (BlankOrBreak() + Comment());
return e; return e;
} }
inline const RegEx& EscSingleQuote() { inline const RegEx& EscSingleQuote() {
@ -196,15 +192,15 @@ inline const RegEx& ChompIndicator() {
return e; return e;
} }
inline const RegEx& Chomp() { inline const RegEx& Chomp() {
static const RegEx e = (ChompIndicator() + Digit()) | static const RegEx e = (ChompIndicator() + Digit()) ||
(Digit() + ChompIndicator()) | ChompIndicator() | (Digit() + ChompIndicator()) || ChompIndicator() ||
Digit(); Digit();
return e; return e;
} }
// and some functions // and some functions
std::string Escape(Stream& in); std::string Escape(Stream& in);
} // namespace Exp }
namespace Keys { namespace Keys {
const char Directive = '%'; const char Directive = '%';
@ -220,7 +216,7 @@ const char LiteralScalar = '|';
const char FoldedScalar = '>'; const char FoldedScalar = '>';
const char VerbatimTagStart = '<'; const char VerbatimTagStart = '<';
const char VerbatimTagEnd = '>'; const char VerbatimTagEnd = '>';
} // namespace Keys }
} // namespace YAML }
#endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // EXP_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -22,5 +22,5 @@ node& memory::create_node() {
void memory::merge(const memory& rhs) { void memory::merge(const memory& rhs) {
m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end()); m_nodes.insert(rhs.m_nodes.begin(), rhs.m_nodes.end());
} }
} // namespace detail }
} // namespace YAML }

View File

@ -9,4 +9,4 @@ Node Clone(const Node& node) {
events.Emit(builder); events.Emit(builder);
return builder.Root(); return builder.Root();
} }
} // namespace YAML }

View File

@ -1,5 +1,4 @@
#include <algorithm> #include <assert.h>
#include <cassert>
#include <iterator> #include <iterator>
#include <sstream> #include <sstream>
@ -13,24 +12,15 @@
namespace YAML { namespace YAML {
namespace detail { namespace detail {
YAML_CPP_API std::atomic<size_t> node::m_amount{0};
const std::string& node_data::empty_scalar() { std::string node_data::empty_scalar;
static const std::string svalue;
return svalue;
}
node_data::node_data() node_data::node_data()
: m_isDefined(false), : m_isDefined(false),
m_mark(Mark::null_mark()), m_mark(Mark::null_mark()),
m_type(NodeType::Null), m_type(NodeType::Null),
m_tag{},
m_style(EmitterStyle::Default), m_style(EmitterStyle::Default),
m_scalar{}, m_seqSize(0) {}
m_sequence{},
m_seqSize(0),
m_map{},
m_undefinedPairs{} {}
void node_data::mark_defined() { void node_data::mark_defined() {
if (m_type == NodeType::Undefined) if (m_type == NodeType::Undefined)
@ -110,9 +100,9 @@ void node_data::compute_seq_size() const {
} }
void node_data::compute_map_size() const { void node_data::compute_map_size() const {
auto it = m_undefinedPairs.begin(); kv_pairs::iterator it = m_undefinedPairs.begin();
while (it != m_undefinedPairs.end()) { while (it != m_undefinedPairs.end()) {
auto jt = std::next(it); kv_pairs::iterator jt = std::next(it);
if (it->first->is_defined() && it->second->is_defined()) if (it->first->is_defined() && it->second->is_defined())
m_undefinedPairs.erase(it); m_undefinedPairs.erase(it);
it = jt; it = jt;
@ -121,7 +111,7 @@ void node_data::compute_map_size() const {
const_node_iterator node_data::begin() const { const_node_iterator node_data::begin() const {
if (!m_isDefined) if (!m_isDefined)
return {}; return const_node_iterator();
switch (m_type) { switch (m_type) {
case NodeType::Sequence: case NodeType::Sequence:
@ -129,13 +119,13 @@ const_node_iterator node_data::begin() const {
case NodeType::Map: case NodeType::Map:
return const_node_iterator(m_map.begin(), m_map.end()); return const_node_iterator(m_map.begin(), m_map.end());
default: default:
return {}; return const_node_iterator();
} }
} }
node_iterator node_data::begin() { node_iterator node_data::begin() {
if (!m_isDefined) if (!m_isDefined)
return {}; return node_iterator();
switch (m_type) { switch (m_type) {
case NodeType::Sequence: case NodeType::Sequence:
@ -143,13 +133,13 @@ node_iterator node_data::begin() {
case NodeType::Map: case NodeType::Map:
return node_iterator(m_map.begin(), m_map.end()); return node_iterator(m_map.begin(), m_map.end());
default: default:
return {}; return node_iterator();
} }
} }
const_node_iterator node_data::end() const { const_node_iterator node_data::end() const {
if (!m_isDefined) if (!m_isDefined)
return {}; return const_node_iterator();
switch (m_type) { switch (m_type) {
case NodeType::Sequence: case NodeType::Sequence:
@ -157,13 +147,13 @@ const_node_iterator node_data::end() const {
case NodeType::Map: case NodeType::Map:
return const_node_iterator(m_map.end(), m_map.end()); return const_node_iterator(m_map.end(), m_map.end());
default: default:
return {}; return const_node_iterator();
} }
} }
node_iterator node_data::end() { node_iterator node_data::end() {
if (!m_isDefined) if (!m_isDefined)
return {}; return node_iterator();
switch (m_type) { switch (m_type) {
case NodeType::Sequence: case NodeType::Sequence:
@ -171,13 +161,12 @@ node_iterator node_data::end() {
case NodeType::Map: case NodeType::Map:
return node_iterator(m_map.end(), m_map.end()); return node_iterator(m_map.end(), m_map.end());
default: default:
return {}; return node_iterator();
} }
} }
// sequence // sequence
void node_data::push_back(node& node, void node_data::push_back(node& node, shared_memory_holder /* pMemory */) {
const shared_memory_holder& /* pMemory */) {
if (m_type == NodeType::Undefined || m_type == NodeType::Null) { if (m_type == NodeType::Undefined || m_type == NodeType::Null) {
m_type = NodeType::Sequence; m_type = NodeType::Sequence;
reset_sequence(); reset_sequence();
@ -189,8 +178,7 @@ void node_data::push_back(node& node,
m_sequence.push_back(&node); m_sequence.push_back(&node);
} }
void node_data::insert(node& key, node& value, void node_data::insert(node& key, node& value, shared_memory_holder pMemory) {
const shared_memory_holder& pMemory) {
switch (m_type) { switch (m_type) {
case NodeType::Map: case NodeType::Map:
break; break;
@ -200,28 +188,27 @@ void node_data::insert(node& key, node& value,
convert_to_map(pMemory); convert_to_map(pMemory);
break; break;
case NodeType::Scalar: case NodeType::Scalar:
throw BadSubscript(m_mark, key); throw BadSubscript();
} }
insert_map_pair(key, value); insert_map_pair(key, value);
} }
// indexing // indexing
node* node_data::get(node& key, node* node_data::get(node& key, shared_memory_holder /* pMemory */) const {
const shared_memory_holder& /* pMemory */) const {
if (m_type != NodeType::Map) { if (m_type != NodeType::Map) {
return nullptr; return NULL;
} }
for (const auto& it : m_map) { for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it.first->is(key)) if (it->first->is(key))
return it.second; return it->second;
} }
return nullptr; return NULL;
} }
node& node_data::get(node& key, const shared_memory_holder& pMemory) { node& node_data::get(node& key, shared_memory_holder pMemory) {
switch (m_type) { switch (m_type) {
case NodeType::Map: case NodeType::Map:
break; break;
@ -231,12 +218,12 @@ node& node_data::get(node& key, const shared_memory_holder& pMemory) {
convert_to_map(pMemory); convert_to_map(pMemory);
break; break;
case NodeType::Scalar: case NodeType::Scalar:
throw BadSubscript(m_mark, key); throw BadSubscript();
} }
for (const auto& it : m_map) { for (node_map::const_iterator it = m_map.begin(); it != m_map.end(); ++it) {
if (it.first->is(key)) if (it->first->is(key))
return *it.second; return *it->second;
} }
node& value = pMemory->create_node(); node& value = pMemory->create_node();
@ -244,26 +231,15 @@ node& node_data::get(node& key, const shared_memory_holder& pMemory) {
return value; return value;
} }
bool node_data::remove(node& key, const shared_memory_holder& /* pMemory */) { bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
if (m_type != NodeType::Map) if (m_type != NodeType::Map)
return false; return false;
for (auto it = m_undefinedPairs.begin(); it != m_undefinedPairs.end();) { for (node_map::iterator it = m_map.begin(); it != m_map.end(); ++it) {
auto jt = std::next(it); if (it->first->is(key)) {
if (it->first->is(key)) m_map.erase(it);
m_undefinedPairs.erase(it); return true;
it = jt; }
}
auto it =
std::find_if(m_map.begin(), m_map.end(),
[&](std::pair<YAML::detail::node*, YAML::detail::node*> j) {
return (j.first->is(key));
});
if (it != m_map.end()) {
m_map.erase(it);
return true;
} }
return false; return false;
@ -286,7 +262,7 @@ void node_data::insert_map_pair(node& key, node& value) {
m_undefinedPairs.emplace_back(&key, &value); m_undefinedPairs.emplace_back(&key, &value);
} }
void node_data::convert_to_map(const shared_memory_holder& pMemory) { void node_data::convert_to_map(shared_memory_holder pMemory) {
switch (m_type) { switch (m_type) {
case NodeType::Undefined: case NodeType::Undefined:
case NodeType::Null: case NodeType::Null:
@ -304,7 +280,7 @@ void node_data::convert_to_map(const shared_memory_holder& pMemory) {
} }
} }
void node_data::convert_sequence_to_map(const shared_memory_holder& pMemory) { void node_data::convert_sequence_to_map(shared_memory_holder pMemory) {
assert(m_type == NodeType::Sequence); assert(m_type == NodeType::Sequence);
reset_map(); reset_map();
@ -320,5 +296,5 @@ void node_data::convert_sequence_to_map(const shared_memory_holder& pMemory) {
reset_sequence(); reset_sequence();
m_type = NodeType::Map; m_type = NodeType::Map;
} }
} // namespace detail }
} // namespace YAML }

View File

@ -1,3 +1,4 @@
#include <assert.h>
#include <cassert> #include <cassert>
#include "nodebuilder.h" #include "nodebuilder.h"
@ -10,16 +11,11 @@ namespace YAML {
struct Mark; struct Mark;
NodeBuilder::NodeBuilder() NodeBuilder::NodeBuilder()
: m_pMemory(new detail::memory_holder), : m_pMemory(new detail::memory_holder), m_pRoot(0), m_mapDepth(0) {
m_pRoot(nullptr), m_anchors.push_back(0); // since the anchors start at 1
m_stack{},
m_anchors{},
m_keys{},
m_mapDepth(0) {
m_anchors.push_back(nullptr); // since the anchors start at 1
} }
NodeBuilder::~NodeBuilder() = default; NodeBuilder::~NodeBuilder() {}
Node NodeBuilder::Root() { Node NodeBuilder::Root() {
if (!m_pRoot) if (!m_pRoot)
@ -92,7 +88,7 @@ void NodeBuilder::Push(detail::node& node) {
m_stack.push_back(&node); m_stack.push_back(&node);
if (needsKey) if (needsKey)
m_keys.emplace_back(&node, false); m_keys.push_back(PushedKey(&node, false));
} }
void NodeBuilder::Pop() { void NodeBuilder::Pop() {
@ -131,4 +127,4 @@ void NodeBuilder::RegisterAnchor(anchor_t anchor, detail::node& node) {
m_anchors.push_back(&node); m_anchors.push_back(&node);
} }
} }
} // namespace YAML }

View File

@ -27,29 +27,25 @@ class Node;
class NodeBuilder : public EventHandler { class NodeBuilder : public EventHandler {
public: public:
NodeBuilder(); NodeBuilder();
NodeBuilder(const NodeBuilder&) = delete; virtual ~NodeBuilder();
NodeBuilder(NodeBuilder&&) = delete;
NodeBuilder& operator=(const NodeBuilder&) = delete;
NodeBuilder& operator=(NodeBuilder&&) = delete;
~NodeBuilder() override;
Node Root(); Node Root();
void OnDocumentStart(const Mark& mark) override; virtual void OnDocumentStart(const Mark& mark);
void OnDocumentEnd() override; virtual void OnDocumentEnd();
void OnNull(const Mark& mark, anchor_t anchor) override; virtual void OnNull(const Mark& mark, anchor_t anchor);
void OnAlias(const Mark& mark, anchor_t anchor) override; virtual void OnAlias(const Mark& mark, anchor_t anchor);
void OnScalar(const Mark& mark, const std::string& tag, virtual void OnScalar(const Mark& mark, const std::string& tag,
anchor_t anchor, const std::string& value) override; anchor_t anchor, const std::string& value);
void OnSequenceStart(const Mark& mark, const std::string& tag, virtual void OnSequenceStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override; anchor_t anchor, EmitterStyle::value style);
void OnSequenceEnd() override; virtual void OnSequenceEnd();
void OnMapStart(const Mark& mark, const std::string& tag, virtual void OnMapStart(const Mark& mark, const std::string& tag,
anchor_t anchor, EmitterStyle::value style) override; anchor_t anchor, EmitterStyle::value style);
void OnMapEnd() override; virtual void OnMapEnd();
private: private:
detail::node& Push(const Mark& mark, anchor_t anchor); detail::node& Push(const Mark& mark, anchor_t anchor);
@ -61,14 +57,14 @@ class NodeBuilder : public EventHandler {
detail::shared_memory_holder m_pMemory; detail::shared_memory_holder m_pMemory;
detail::node* m_pRoot; detail::node* m_pRoot;
using Nodes = std::vector<detail::node *>; typedef std::vector<detail::node*> Nodes;
Nodes m_stack; Nodes m_stack;
Nodes m_anchors; Nodes m_anchors;
using PushedKey = std::pair<detail::node*, bool>; typedef std::pair<detail::node*, bool> PushedKey;
std::vector<PushedKey> m_keys; std::vector<PushedKey> m_keys;
std::size_t m_mapDepth; std::size_t m_mapDepth;
}; };
} // namespace YAML }
#endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // NODE_NODEBUILDER_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -13,14 +13,14 @@ void NodeEvents::AliasManager::RegisterReference(const detail::node& node) {
anchor_t NodeEvents::AliasManager::LookupAnchor( anchor_t NodeEvents::AliasManager::LookupAnchor(
const detail::node& node) const { const detail::node& node) const {
auto it = m_anchorByIdentity.find(node.ref()); AnchorByIdentity::const_iterator it = m_anchorByIdentity.find(node.ref());
if (it == m_anchorByIdentity.end()) if (it == m_anchorByIdentity.end())
return 0; return 0;
return it->second; return it->second;
} }
NodeEvents::NodeEvents(const Node& node) NodeEvents::NodeEvents(const Node& node)
: m_pMemory(node.m_pMemory), m_root(node.m_pNode), m_refCount{} { : m_pMemory(node.m_pMemory), m_root(node.m_pNode) {
if (m_root) if (m_root)
Setup(*m_root); Setup(*m_root);
} }
@ -32,12 +32,13 @@ void NodeEvents::Setup(const detail::node& node) {
return; return;
if (node.type() == NodeType::Sequence) { if (node.type() == NodeType::Sequence) {
for (auto element : node) for (detail::const_node_iterator it = node.begin(); it != node.end(); ++it)
Setup(*element); Setup(**it);
} else if (node.type() == NodeType::Map) { } else if (node.type() == NodeType::Map) {
for (auto element : node) { for (detail::const_node_iterator it = node.begin(); it != node.end();
Setup(*element.first); ++it) {
Setup(*element.second); Setup(*it->first);
Setup(*it->second);
} }
} }
} }
@ -76,15 +77,17 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
break; break;
case NodeType::Sequence: case NodeType::Sequence:
handler.OnSequenceStart(Mark(), node.tag(), anchor, node.style()); handler.OnSequenceStart(Mark(), node.tag(), anchor, node.style());
for (auto element : node) for (detail::const_node_iterator it = node.begin(); it != node.end();
Emit(*element, handler, am); ++it)
Emit(**it, handler, am);
handler.OnSequenceEnd(); handler.OnSequenceEnd();
break; break;
case NodeType::Map: case NodeType::Map:
handler.OnMapStart(Mark(), node.tag(), anchor, node.style()); handler.OnMapStart(Mark(), node.tag(), anchor, node.style());
for (auto element : node) { for (detail::const_node_iterator it = node.begin(); it != node.end();
Emit(*element.first, handler, am); ++it) {
Emit(*element.second, handler, am); Emit(*it->first, handler, am);
Emit(*it->second, handler, am);
} }
handler.OnMapEnd(); handler.OnMapEnd();
break; break;
@ -92,7 +95,7 @@ void NodeEvents::Emit(const detail::node& node, EventHandler& handler,
} }
bool NodeEvents::IsAliased(const detail::node& node) const { bool NodeEvents::IsAliased(const detail::node& node) const {
auto it = m_refCount.find(node.ref()); RefCount::const_iterator it = m_refCount.find(node.ref());
return it != m_refCount.end() && it->second > 1; return it != m_refCount.end() && it->second > 1;
} }
} // namespace YAML }

View File

@ -26,17 +26,13 @@ class Node;
class NodeEvents { class NodeEvents {
public: public:
explicit NodeEvents(const Node& node); explicit NodeEvents(const Node& node);
NodeEvents(const NodeEvents&) = delete;
NodeEvents(NodeEvents&&) = delete;
NodeEvents& operator=(const NodeEvents&) = delete;
NodeEvents& operator=(NodeEvents&&) = delete;
void Emit(EventHandler& handler); void Emit(EventHandler& handler);
private: private:
class AliasManager { class AliasManager {
public: public:
AliasManager() : m_anchorByIdentity{}, m_curAnchor(0) {} AliasManager() : m_curAnchor(0) {}
void RegisterReference(const detail::node& node); void RegisterReference(const detail::node& node);
anchor_t LookupAnchor(const detail::node& node) const; anchor_t LookupAnchor(const detail::node& node) const;
@ -45,7 +41,7 @@ class NodeEvents {
anchor_t _CreateNewAnchor() { return ++m_curAnchor; } anchor_t _CreateNewAnchor() { return ++m_curAnchor; }
private: private:
using AnchorByIdentity = std::map<const detail::node_ref*, anchor_t>; typedef std::map<const detail::node_ref*, anchor_t> AnchorByIdentity;
AnchorByIdentity m_anchorByIdentity; AnchorByIdentity m_anchorByIdentity;
anchor_t m_curAnchor; anchor_t m_curAnchor;
@ -60,9 +56,9 @@ class NodeEvents {
detail::shared_memory_holder m_pMemory; detail::shared_memory_holder m_pMemory;
detail::node* m_root; detail::node* m_root;
using RefCount = std::map<const detail::node_ref*, int>; typedef std::map<const detail::node_ref*, int> RefCount;
RefCount m_refCount; RefCount m_refCount;
}; };
} // namespace YAML }
#endif // NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -7,4 +7,4 @@ bool IsNullString(const std::string& str) {
return str.empty() || str == "~" || str == "null" || str == "Null" || return str.empty() || str == "~" || str == "null" || str == "Null" ||
str == "NULL"; str == "NULL";
} }
} // namespace YAML }

View File

@ -7,21 +7,16 @@
namespace YAML { namespace YAML {
ostream_wrapper::ostream_wrapper() ostream_wrapper::ostream_wrapper()
: m_buffer(1, '\0'), : m_buffer(1, '\0'),
m_pStream(nullptr), m_pStream(0),
m_pos(0), m_pos(0),
m_row(0), m_row(0),
m_col(0), m_col(0),
m_comment(false) {} m_comment(false) {}
ostream_wrapper::ostream_wrapper(std::ostream& stream) ostream_wrapper::ostream_wrapper(std::ostream& stream)
: m_buffer{}, : m_pStream(&stream), m_pos(0), m_row(0), m_col(0), m_comment(false) {}
m_pStream(&stream),
m_pos(0),
m_row(0),
m_col(0),
m_comment(false) {}
ostream_wrapper::~ostream_wrapper() = default; ostream_wrapper::~ostream_wrapper() {}
void ostream_wrapper::write(const std::string& str) { void ostream_wrapper::write(const std::string& str) {
if (m_pStream) { if (m_pStream) {
@ -31,8 +26,8 @@ void ostream_wrapper::write(const std::string& str) {
std::copy(str.begin(), str.end(), m_buffer.begin() + m_pos); std::copy(str.begin(), str.end(), m_buffer.begin() + m_pos);
} }
for (char ch : str) { for (std::size_t i = 0; i < str.size(); i++) {
update_pos(ch); update_pos(str[i]);
} }
} }
@ -59,4 +54,4 @@ void ostream_wrapper::update_pos(char ch) {
m_comment = false; m_comment = false;
} }
} }
} // namespace YAML }

View File

@ -3,10 +3,10 @@
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>
#include "nodebuilder.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/node.h" #include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/parser.h" #include "yaml-cpp/parser.h"
#include "nodebuilder.h"
namespace YAML { namespace YAML {
Node Load(const std::string& input) { Node Load(const std::string& input) {
@ -30,9 +30,9 @@ Node Load(std::istream& input) {
} }
Node LoadFile(const std::string& filename) { Node LoadFile(const std::string& filename) {
std::ifstream fin(filename); std::ifstream fin(filename.c_str());
if (!fin) { if (!fin || fin.bad()) {
throw BadFile(filename); throw BadFile();
} }
return Load(fin); return Load(fin);
} }
@ -51,7 +51,7 @@ std::vector<Node> LoadAll(std::istream& input) {
std::vector<Node> docs; std::vector<Node> docs;
Parser parser(input); Parser parser(input);
while (true) { while (1) {
NodeBuilder builder; NodeBuilder builder;
if (!parser.HandleNextDocument(builder)) { if (!parser.HandleNextDocument(builder)) {
break; break;
@ -63,9 +63,9 @@ std::vector<Node> LoadAll(std::istream& input) {
} }
std::vector<Node> LoadAllFromFile(const std::string& filename) { std::vector<Node> LoadAllFromFile(const std::string& filename) {
std::ifstream fin(filename); std::ifstream fin(filename.c_str());
if (!fin) { if (!fin) {
throw BadFile(filename); throw BadFile();
} }
return LoadAll(fin); return LoadAll(fin);
} }

View File

@ -11,13 +11,15 @@
namespace YAML { namespace YAML {
class EventHandler; class EventHandler;
Parser::Parser() : m_pScanner{}, m_pDirectives{} {} Parser::Parser() {}
Parser::Parser(std::istream& in) : Parser() { Load(in); } Parser::Parser(std::istream& in) { Load(in); }
Parser::~Parser() = default; Parser::~Parser() {}
Parser::operator bool() const { return m_pScanner && !m_pScanner->empty(); } Parser::operator bool() const {
return m_pScanner.get() && !m_pScanner->empty();
}
void Parser::Load(std::istream& in) { void Parser::Load(std::istream& in) {
m_pScanner.reset(new Scanner(in)); m_pScanner.reset(new Scanner(in));
@ -25,7 +27,7 @@ void Parser::Load(std::istream& in) {
} }
bool Parser::HandleNextDocument(EventHandler& eventHandler) { bool Parser::HandleNextDocument(EventHandler& eventHandler) {
if (!m_pScanner) if (!m_pScanner.get())
return false; return false;
ParseDirectives(); ParseDirectives();
@ -41,7 +43,11 @@ bool Parser::HandleNextDocument(EventHandler& eventHandler) {
void Parser::ParseDirectives() { void Parser::ParseDirectives() {
bool readDirective = false; bool readDirective = false;
while (!m_pScanner->empty()) { while (1) {
if (m_pScanner->empty()) {
break;
}
Token& token = m_pScanner->peek(); Token& token = m_pScanner->peek();
if (token.type != Token::DIRECTIVE) { if (token.type != Token::DIRECTIVE) {
break; break;
@ -107,13 +113,17 @@ void Parser::HandleTagDirective(const Token& token) {
} }
void Parser::PrintTokens(std::ostream& out) { void Parser::PrintTokens(std::ostream& out) {
if (!m_pScanner) { if (!m_pScanner.get()) {
return; return;
} }
while (!m_pScanner->empty()) { while (1) {
if (m_pScanner->empty()) {
break;
}
out << m_pScanner->peek() << "\n"; out << m_pScanner->peek() << "\n";
m_pScanner->pop(); m_pScanner->pop();
} }
} }
} // namespace YAML }

View File

@ -12,17 +12,15 @@
#include <memory> #include <memory>
#include <vector> #include <vector>
#include "yaml-cpp/noncopyable.h"
namespace YAML { namespace YAML {
// TODO: This class is no longer needed // TODO: This class is no longer needed
template <typename T> template <typename T>
class ptr_vector { class ptr_vector : private YAML::noncopyable {
public: public:
ptr_vector() : m_data{} {} ptr_vector() {}
ptr_vector(const ptr_vector&) = delete;
ptr_vector(ptr_vector&&) = default;
ptr_vector& operator=(const ptr_vector&) = delete;
ptr_vector& operator=(ptr_vector&&) = default;
void clear() { m_data.clear(); } void clear() { m_data.clear(); }
@ -40,6 +38,6 @@ class ptr_vector {
private: private:
std::vector<std::unique_ptr<T>> m_data; std::vector<std::unique_ptr<T>> m_data;
}; };
} // namespace YAML }
#endif // PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // PTR_VECTOR_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -2,16 +2,18 @@
namespace YAML { namespace YAML {
// constructors // constructors
RegEx::RegEx() : m_op(REGEX_EMPTY) {}
RegEx::RegEx(REGEX_OP op) : m_op(op), m_a(0), m_z(0), m_params{} {} RegEx::RegEx(REGEX_OP op) : m_op(op) {}
RegEx::RegEx() : RegEx(REGEX_EMPTY) {}
RegEx::RegEx(char ch) : m_op(REGEX_MATCH), m_a(ch), m_z(0), m_params{} {} RegEx::RegEx(char ch) : m_op(REGEX_MATCH), m_a(ch) {}
RegEx::RegEx(char a, char z) : m_op(REGEX_RANGE), m_a(a), m_z(z), m_params{} {} RegEx::RegEx(char a, char z) : m_op(REGEX_RANGE), m_a(a), m_z(z) {}
RegEx::RegEx(const std::string& str, REGEX_OP op) RegEx::RegEx(const std::string& str, REGEX_OP op) : m_op(op) {
: m_op(op), m_a(0), m_z(0), m_params(str.begin(), str.end()) {} for (std::size_t i = 0; i < str.size(); i++)
m_params.push_back(RegEx(str[i]));
}
// combination constructors // combination constructors
RegEx operator!(const RegEx& ex) { RegEx operator!(const RegEx& ex) {
@ -20,14 +22,14 @@ RegEx operator!(const RegEx& ex) {
return ret; return ret;
} }
RegEx operator|(const RegEx& ex1, const RegEx& ex2) { RegEx operator||(const RegEx& ex1, const RegEx& ex2) {
RegEx ret(REGEX_OR); RegEx ret(REGEX_OR);
ret.m_params.push_back(ex1); ret.m_params.push_back(ex1);
ret.m_params.push_back(ex2); ret.m_params.push_back(ex2);
return ret; return ret;
} }
RegEx operator&(const RegEx& ex1, const RegEx& ex2) { RegEx operator&&(const RegEx& ex1, const RegEx& ex2) {
RegEx ret(REGEX_AND); RegEx ret(REGEX_AND);
ret.m_params.push_back(ex1); ret.m_params.push_back(ex1);
ret.m_params.push_back(ex2); ret.m_params.push_back(ex2);
@ -40,4 +42,4 @@ RegEx operator+(const RegEx& ex1, const RegEx& ex2) {
ret.m_params.push_back(ex2); ret.m_params.push_back(ex2);
return ret; return ret;
} }
} // namespace YAML }

View File

@ -31,14 +31,14 @@ enum REGEX_OP {
class YAML_CPP_API RegEx { class YAML_CPP_API RegEx {
public: public:
RegEx(); RegEx();
explicit RegEx(char ch); RegEx(char ch);
RegEx(char a, char z); RegEx(char a, char z);
RegEx(const std::string& str, REGEX_OP op = REGEX_SEQ); RegEx(const std::string& str, REGEX_OP op = REGEX_SEQ);
~RegEx() = default; ~RegEx() {}
friend YAML_CPP_API RegEx operator!(const RegEx& ex); friend YAML_CPP_API RegEx operator!(const RegEx& ex);
friend YAML_CPP_API RegEx operator|(const RegEx& ex1, const RegEx& ex2); friend YAML_CPP_API RegEx operator||(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator&(const RegEx& ex1, const RegEx& ex2); friend YAML_CPP_API RegEx operator&&(const RegEx& ex1, const RegEx& ex2);
friend YAML_CPP_API RegEx operator+(const RegEx& ex1, const RegEx& ex2); friend YAML_CPP_API RegEx operator+(const RegEx& ex1, const RegEx& ex2);
bool Matches(char ch) const; bool Matches(char ch) const;
@ -53,7 +53,7 @@ class YAML_CPP_API RegEx {
int Match(const Source& source) const; int Match(const Source& source) const;
private: private:
explicit RegEx(REGEX_OP op); RegEx(REGEX_OP op);
template <typename Source> template <typename Source>
bool IsValidSource(const Source& source) const; bool IsValidSource(const Source& source) const;
@ -77,11 +77,10 @@ class YAML_CPP_API RegEx {
private: private:
REGEX_OP m_op; REGEX_OP m_op;
char m_a{}; char m_a, m_z;
char m_z{};
std::vector<RegEx> m_params; std::vector<RegEx> m_params;
}; };
} // namespace YAML }
#include "regeximpl.h" #include "regeximpl.h"

View File

@ -8,8 +8,8 @@
#endif #endif
#include "stream.h" #include "stream.h"
#include "streamcharsource.h"
#include "stringsource.h" #include "stringsource.h"
#include "streamcharsource.h"
namespace YAML { namespace YAML {
// query matches // query matches
@ -106,8 +106,9 @@ inline int RegEx::MatchOpEmpty(const Source& source) const {
template <> template <>
inline int RegEx::MatchOpEmpty<StringCharSource>( inline int RegEx::MatchOpEmpty<StringCharSource>(
const StringCharSource& source) const { const StringCharSource& source) const {
return !source ? 0 : -1; // the empty regex only is successful on the empty return !source
// string ? 0
: -1; // the empty regex only is successful on the empty string
} }
// MatchOperator // MatchOperator
@ -129,8 +130,8 @@ inline int RegEx::MatchOpRange(const Source& source) const {
// OrOperator // OrOperator
template <typename Source> template <typename Source>
inline int RegEx::MatchOpOr(const Source& source) const { inline int RegEx::MatchOpOr(const Source& source) const {
for (const RegEx& param : m_params) { for (std::size_t i = 0; i < m_params.size(); i++) {
int n = param.MatchUnchecked(source); int n = m_params[i].MatchUnchecked(source);
if (n >= 0) if (n >= 0)
return n; return n;
} }
@ -168,11 +169,11 @@ inline int RegEx::MatchOpNot(const Source& source) const {
template <typename Source> template <typename Source>
inline int RegEx::MatchOpSeq(const Source& source) const { inline int RegEx::MatchOpSeq(const Source& source) const {
int offset = 0; int offset = 0;
for (const RegEx& param : m_params) { for (std::size_t i = 0; i < m_params.size(); i++) {
int n = param.Match(source + offset); // note Match, not int n = m_params[i].Match(source + offset); // note Match, not
// MatchUnchecked because we // MatchUnchecked because we
// need to check validity after // need to check validity after
// the offset // the offset
if (n == -1) if (n == -1)
return -1; return -1;
offset += n; offset += n;
@ -180,6 +181,6 @@ inline int RegEx::MatchOpSeq(const Source& source) const {
return offset; return offset;
} }
} // namespace YAML }
#endif // REGEXIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66 #endif // REGEXIMPL_H_62B23520_7C8E_11DE_8A39_0800200C9A66

View File

@ -9,17 +9,12 @@
namespace YAML { namespace YAML {
Scanner::Scanner(std::istream& in) Scanner::Scanner(std::istream& in)
: INPUT(in), : INPUT(in),
m_tokens{},
m_startedStream(false), m_startedStream(false),
m_endedStream(false), m_endedStream(false),
m_simpleKeyAllowed(false), m_simpleKeyAllowed(false),
m_canBeJSONFlow(false), m_canBeJSONFlow(false) {}
m_simpleKeys{},
m_indents{},
m_indentRefs{},
m_flows{} {}
Scanner::~Scanner() = default; Scanner::~Scanner() {}
bool Scanner::empty() { bool Scanner::empty() {
EnsureTokensInQueue(); EnsureTokensInQueue();
@ -51,7 +46,7 @@ Token& Scanner::peek() {
Mark Scanner::mark() const { return INPUT.mark(); } Mark Scanner::mark() const { return INPUT.mark(); }
void Scanner::EnsureTokensInQueue() { void Scanner::EnsureTokensInQueue() {
while (true) { while (1) {
if (!m_tokens.empty()) { if (!m_tokens.empty()) {
Token& token = m_tokens.front(); Token& token = m_tokens.front();
@ -88,7 +83,7 @@ void Scanner::ScanNextToken() {
return StartStream(); return StartStream();
} }
// get rid of whitespace, etc. (in between tokens it should be irrelevant) // get rid of whitespace, etc. (in between tokens it should be irrelevent)
ScanToNextToken(); ScanToNextToken();
// maybe need to end some blocks // maybe need to end some blocks
@ -174,7 +169,7 @@ void Scanner::ScanNextToken() {
} }
void Scanner::ScanToNextToken() { void Scanner::ScanToNextToken() {
while (true) { while (1) {
// first eat whitespace // first eat whitespace
while (INPUT && IsWhitespaceToBeEaten(INPUT.peek())) { while (INPUT && IsWhitespaceToBeEaten(INPUT.peek())) {
if (InBlockContext() && Exp::Tab().Matches(INPUT)) { if (InBlockContext() && Exp::Tab().Matches(INPUT)) {
@ -287,7 +282,7 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column,
IndentMarker::INDENT_TYPE type) { IndentMarker::INDENT_TYPE type) {
// are we in flow? // are we in flow?
if (InFlowContext()) { if (InFlowContext()) {
return nullptr; return 0;
} }
std::unique_ptr<IndentMarker> pIndent(new IndentMarker(column, type)); std::unique_ptr<IndentMarker> pIndent(new IndentMarker(column, type));
@ -296,12 +291,12 @@ Scanner::IndentMarker* Scanner::PushIndentTo(int column,
// is this actually an indentation? // is this actually an indentation?
if (indent.column < lastIndent.column) { if (indent.column < lastIndent.column) {
return nullptr; return 0;
} }
if (indent.column == lastIndent.column && if (indent.column == lastIndent.column &&
!(indent.type == IndentMarker::SEQ && !(indent.type == IndentMarker::SEQ &&
lastIndent.type == IndentMarker::MAP)) { lastIndent.type == IndentMarker::MAP)) {
return nullptr; return 0;
} }
// push a start token // push a start token

View File

@ -9,7 +9,9 @@
#include <cstddef> #include <cstddef>
#include <ios> #include <ios>
#include <map>
#include <queue> #include <queue>
#include <set>
#include <stack> #include <stack>
#include <string> #include <string>
@ -47,7 +49,7 @@ class Scanner {
enum INDENT_TYPE { MAP, SEQ, NONE }; enum INDENT_TYPE { MAP, SEQ, NONE };
enum STATUS { VALID, INVALID, UNKNOWN }; enum STATUS { VALID, INVALID, UNKNOWN };
IndentMarker(int column_, INDENT_TYPE type_) IndentMarker(int column_, INDENT_TYPE type_)
: column(column_), type(type_), status(VALID), pStartToken(nullptr) {} : column(column_), type(type_), status(VALID), pStartToken(0) {}
int column; int column;
INDENT_TYPE type; INDENT_TYPE type;

View File

@ -47,8 +47,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
if (INPUT.column() == 0 && Exp::DocIndicator().Matches(INPUT)) { if (INPUT.column() == 0 && Exp::DocIndicator().Matches(INPUT)) {
if (params.onDocIndicator == BREAK) { if (params.onDocIndicator == BREAK) {
break; break;
} } else if (params.onDocIndicator == THROW) {
if (params.onDocIndicator == THROW) {
throw ParserException(INPUT.mark(), ErrorMsg::DOC_IN_SCALAR); throw ParserException(INPUT.mark(), ErrorMsg::DOC_IN_SCALAR);
} }
} }
@ -184,7 +183,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
case FOLD_FLOW: case FOLD_FLOW:
if (nextEmptyLine) { if (nextEmptyLine) {
scalar += "\n"; scalar += "\n";
} else if (!emptyLine && !escapedNewline) { } else if (!emptyLine && !nextEmptyLine && !escapedNewline) {
scalar += " "; scalar += " ";
} }
break; break;
@ -204,7 +203,7 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
// post-processing // post-processing
if (params.trimTrailingSpaces) { if (params.trimTrailingSpaces) {
std::size_t pos = scalar.find_last_not_of(" \t"); std::size_t pos = scalar.find_last_not_of(' ');
if (lastEscapedChar != std::string::npos) { if (lastEscapedChar != std::string::npos) {
if (pos < lastEscapedChar || pos == std::string::npos) { if (pos < lastEscapedChar || pos == std::string::npos) {
pos = lastEscapedChar; pos = lastEscapedChar;
@ -248,4 +247,4 @@ std::string ScanScalar(Stream& INPUT, ScanScalarParams& params) {
return scalar; return scalar;
} }
} // namespace YAML }

Some files were not shown because too many files have changed in this diff Show More