mirror of
https://github.com/boostorg/serialization.git
synced 2026-07-23 13:54:08 +00:00
Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5b87c83419 | |||
| 14f3f5ea77 | |||
| e15f94a77e |
+47
-78
@@ -1,4 +1,4 @@
|
||||
# Copyright 2016, 2017 Peter Dimov
|
||||
# Copyright 2016 Peter Dimov
|
||||
# Distributed under the Boost Software License, Version 1.0.
|
||||
# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt)
|
||||
|
||||
@@ -6,97 +6,66 @@ language: cpp
|
||||
|
||||
sudo: false
|
||||
|
||||
cache:
|
||||
ccache: true
|
||||
os:
|
||||
- linux
|
||||
- osx
|
||||
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- develop
|
||||
- /feature\/.*/
|
||||
|
||||
env:
|
||||
matrix:
|
||||
- BOGUS_JOB=true
|
||||
|
||||
matrix:
|
||||
|
||||
exclude:
|
||||
- env: BOGUS_JOB=true
|
||||
|
||||
include:
|
||||
- os: linux
|
||||
compiler: g++
|
||||
env: TOOLSET=gcc LINK=static,shared
|
||||
|
||||
- os: linux
|
||||
compiler: g++-5
|
||||
env: TOOLSET=gcc LINK=static,shared
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-5
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-6
|
||||
env: TOOLSET=gcc LINK=static,shared
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-6
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: g++-7
|
||||
env: TOOLSET=gcc LINK=static,shared
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- g++-7
|
||||
sources:
|
||||
- ubuntu-toolchain-r-test
|
||||
|
||||
- os: linux
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang LINK=static,shared
|
||||
|
||||
- os: linux
|
||||
compiler: clang++-libc++
|
||||
env: TOOLSET=clang LINK=static,shared
|
||||
addons:
|
||||
apt:
|
||||
packages:
|
||||
- libc++-dev
|
||||
|
||||
- os: osx
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang LINK=static,shared
|
||||
|
||||
- os: osx
|
||||
osx_image: xcode10
|
||||
compiler: clang++
|
||||
env: TOOLSET=clang LINK=static,shared
|
||||
|
||||
install:
|
||||
- BOOST_BRANCH=develop && [ "$TRAVIS_BRANCH" == "master" ] && BOOST_BRANCH=master || true
|
||||
- cd ..
|
||||
- git clone -b $BOOST_BRANCH https://github.com/boostorg/boost.git boost-root
|
||||
- git clone -b $TRAVIS_BRANCH --depth 1 https://github.com/boostorg/boost.git boost-root
|
||||
- cd boost-root
|
||||
- git submodule update --init tools/build
|
||||
- git submodule update --init libs/config
|
||||
- git submodule update --init tools/boostdep
|
||||
- git submodule init libs/align
|
||||
- git submodule init libs/array
|
||||
- git submodule init libs/assert
|
||||
- git submodule init libs/bind
|
||||
- git submodule init libs/compatibility
|
||||
- git submodule init libs/concept_check
|
||||
- git submodule init libs/config
|
||||
- git submodule init libs/container
|
||||
- git submodule init libs/core
|
||||
- git submodule init libs/detail
|
||||
- git submodule init libs/filesystem
|
||||
- git submodule init libs/function
|
||||
- git submodule init libs/functional
|
||||
- git submodule init libs/integer
|
||||
- git submodule init libs/intrusive
|
||||
- git submodule init libs/io
|
||||
- git submodule init libs/iterator
|
||||
- git submodule init libs/lexical_cast
|
||||
- git submodule init libs/math
|
||||
- git submodule init libs/move
|
||||
- git submodule init libs/mpl
|
||||
- git submodule init libs/numeric/conversion
|
||||
- git submodule init libs/optional
|
||||
- git submodule init libs/predef
|
||||
- git submodule init libs/preprocessor
|
||||
- git submodule init libs/range
|
||||
- git submodule init libs/smart_ptr
|
||||
- git submodule init libs/spirit
|
||||
- git submodule init libs/static_assert
|
||||
- git submodule init libs/system
|
||||
- git submodule init libs/throw_exception
|
||||
- git submodule init libs/tuple
|
||||
- git submodule init libs/type_index
|
||||
- git submodule init libs/type_traits
|
||||
- git submodule init libs/unordered
|
||||
- git submodule init libs/utility
|
||||
- git submodule init libs/variant
|
||||
- git submodule init tools/build
|
||||
- git submodule update --depth 1
|
||||
- cp -r $TRAVIS_BUILD_DIR/* libs/serialization
|
||||
- python tools/boostdep/depinst/depinst.py serialization
|
||||
- ./bootstrap.sh
|
||||
- ./b2 headers
|
||||
|
||||
script:
|
||||
- |-
|
||||
echo "using $TOOLSET : : $TRAVIS_COMPILER ;" > ~/user-config.jam
|
||||
- ./b2 -j 3 libs/serialization/test toolset=$TOOLSET link=${LINK:-shared}
|
||||
- TOOLSET=gcc,clang
|
||||
- if [ $TRAVIS_OS_NAME == osx ]; then TOOLSET=clang; fi
|
||||
- ./b2 libs/serialization/test toolset=$TOOLSET
|
||||
|
||||
notifications:
|
||||
email:
|
||||
|
||||
+61
-91
@@ -35,12 +35,29 @@ elseif( CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" )
|
||||
set(COMPILER_SUPPORTS_CXX11 TRUE)
|
||||
elseif( CMAKE_CXX_COMPILER_ID STREQUAL "AppleClang" )
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=300")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++98")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0" )
|
||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "-g -O3" )
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++ -dead_strip")
|
||||
set(COMPILER_SUPPORTS_CXX11 FALSE)
|
||||
set(COMPILER_SUPPORTS_CXX11 TRUE)
|
||||
endif()
|
||||
|
||||
#
|
||||
# IDE settings
|
||||
#
|
||||
|
||||
if( CMAKE_HOST_APPLE )
|
||||
# note: it seems that bjam builds both address models in any case
|
||||
# so we can defer this decision to the IDE just as we do for debug/release
|
||||
# so we'll not use this now
|
||||
# set(Boost_ADDRESS_MODEL 64 CACHE INTEGER "32/64 bits")
|
||||
set(Boost_USE_STATIC_LIBS ON CACHE BOOL "Link to Boost static libraries")
|
||||
set(Boost_USE_MULTITHREADED ON)
|
||||
else()
|
||||
set(Boost_ADDRESS_MODEL 64 CACHE INTEGER "32/64 bits")
|
||||
set(Boost_USE_STATIC_LIBS ON CACHE BOOL "Link to Boost static libraries")
|
||||
set(Boost_USE_MULTITHREADED ON)
|
||||
endif()
|
||||
|
||||
#
|
||||
@@ -90,58 +107,46 @@ endif()
|
||||
# end special note for Xcode
|
||||
############################
|
||||
|
||||
#
|
||||
# IDE settings
|
||||
#
|
||||
|
||||
set(Boost_DEBUG true)
|
||||
set(Boost_ADDRESS_MODEL 64 CACHE INTEGER "32/64 bits")
|
||||
set(Boost_USE_STATIC_LIBS TRUE CACHE BOOL "Use static libraries")
|
||||
set(Boost_USE_MULTITHREADED ON)
|
||||
set(Boost_DETAILED_FAILURE_MSG true)
|
||||
set(Boost_FOUND true)
|
||||
|
||||
get_filename_component(BOOST_ROOT "../../.." ABSOLUTE)
|
||||
string(CONCAT boost_headers ${BOOST_ROOT} "/boost")
|
||||
if(NOT IS_DIRECTORY ${boost_headers})
|
||||
message(FATAL_ERROR "BOOST_ROOT not found")
|
||||
find_package(Boost REQUIRED COMPONENTS system filesystem program_options)
|
||||
include(CheckIncludeFileCXX)
|
||||
|
||||
message(STATUS "Boost_FOUND is ${Boost_FOUND}")
|
||||
|
||||
if(Boost_FOUND)
|
||||
message(STATUS "Boost Found!")
|
||||
message(STATUS "Boost is ${BOOST_ROOT}")
|
||||
message(STATUS "Boost directories found at ${Boost_INCLUDE_DIRS}")
|
||||
message(STATUS "Boost libraries found at ${Boost_LIBRARY_DIRS}")
|
||||
message(STATUS "Boost libraries prefix is ${Boost_LIB_PREFIX}")
|
||||
message(STATUS "Boost component libraries to be linked are ${Boost_LIBRARIES}")
|
||||
message(STATUS "Boost version found is ${Boost_VERSION}")
|
||||
#include_directories("../include" "${Boost_INCLUDE_DIRS}")
|
||||
#link_directories("${Boost_LIBRARY_DIRS}")
|
||||
else()
|
||||
message(STATUS "BOOST_ROOT is ${BOOST_ROOT}")
|
||||
message(STATUS "Boost NOT Found!")
|
||||
endif()
|
||||
|
||||
if(Boost_USE_STATIC_LIBS)
|
||||
message(STATUS "Link to Boost static libraries")
|
||||
set(BUILD_SHARED_LIBS NO)
|
||||
string(CONCAT boost_stage ${BOOST_ROOT} "/stage/Debug/static")
|
||||
message(STATUS "Use static libraries")
|
||||
set(LINK_TYPE "STATIC")
|
||||
else()
|
||||
message(STATUS "Link to Boost shared libraries")
|
||||
set(BUILD_SHARED_LIBS YES)
|
||||
message(STATUS "Building shared libraries")
|
||||
set(LINK_TYPE "SHARED")
|
||||
add_definitions( "-DBOOST_ALL_DYN_LINK=1")
|
||||
add_definitions( "-DBOOST_ALL_NO_LIB=1")
|
||||
add_definitions( "-DBOOST_LIB_DIAGNOSTICS=1")
|
||||
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||
set(VISIBILITY_INLINES_HIDDEN YES)
|
||||
string(CONCAT boost_stage ${BOOST_ROOT} "/stage/Debug/shared")
|
||||
set(VISIBILITY_INLINES_HIDDEN)
|
||||
endif()
|
||||
|
||||
include(CheckIncludeFileCXX)
|
||||
|
||||
message(STATUS "Boost directories found at ${boost_headers}")
|
||||
message(STATUS "Boost libraries found at ${boost_stage}")
|
||||
set(CMAKE_LIBRARY_PATH ${boost_stage})
|
||||
|
||||
# list of archive names for which tests should be generated
|
||||
#set(archive_list text_archive text_warchive binary_archive xml_archive xml_warchive)
|
||||
set(archive_list text_archive)
|
||||
|
||||
# list of tests generated by each function call
|
||||
set(test_list)
|
||||
|
||||
include_directories(BEFORE ${BOOST_ROOT})
|
||||
|
||||
###########################
|
||||
# library builds
|
||||
|
||||
add_library(serialization
|
||||
add_library(serialization ${LINK_TYPE}
|
||||
../src/archive_exception.cpp
|
||||
../src/basic_archive.cpp
|
||||
../src/basic_iarchive.cpp
|
||||
@@ -161,8 +166,7 @@ add_library(serialization
|
||||
../src/extended_type_info.cpp
|
||||
../src/polymorphic_iarchive.cpp
|
||||
../src/polymorphic_oarchive.cpp
|
||||
../src/polymorphic_text_iarchive.cpp
|
||||
../src/polymorphic_text_oarchive.cpp
|
||||
../src/singleton.cpp
|
||||
../src/stl_port.cpp
|
||||
../src/text_iarchive.cpp
|
||||
../src/text_oarchive.cpp
|
||||
@@ -175,7 +179,7 @@ add_library(serialization
|
||||
../src/basic_xml_grammar.ipp # doesn't show up in "Source Files" in Xcode"'
|
||||
)
|
||||
|
||||
add_library(wserialization
|
||||
add_library(wserialization ${LINK_TYPE}
|
||||
../src/codecvt_null.cpp
|
||||
../src/basic_text_wiprimitive.cpp
|
||||
../src/basic_text_woprimitive.cpp
|
||||
@@ -187,18 +191,9 @@ add_library(wserialization
|
||||
../src/basic_xml_grammar.ipp # doesn't show up in "Source Files" in Xcode"'
|
||||
)
|
||||
|
||||
set_property(TARGET wserialization PROPERTY LINK_LIBRARIES serialization)
|
||||
|
||||
# end library build
|
||||
###########################
|
||||
|
||||
add_library(filesystem SHARED IMPORTED GLOBAL ) # or STATIC instead of SHARED
|
||||
set_target_properties(filesystem PROPERTIES
|
||||
IMPORTED_LOCATION "${CMAKE_LIBRARY_PATH}/libboost_filesystem-clang-darwin-mt-d-x64-1_69.dylib"
|
||||
)
|
||||
get_property(loc TARGET filesystem PROPERTY LOCATION)
|
||||
message(STATUS "filesystem library located at:${loc}")
|
||||
|
||||
###########################
|
||||
# test targets
|
||||
|
||||
@@ -209,73 +204,58 @@ function( serialization_test test_name)
|
||||
endforeach()
|
||||
message(STATUS ${test_name})
|
||||
add_executable( ${test_name} ../test/${test_name}.cpp ${arglist} )
|
||||
target_link_libraries(${test_name} serialization wserialization filesystem)
|
||||
target_link_libraries(${test_name} serialization wserialization ${Boost_LIBRARIES})
|
||||
add_test( ${test_name} ${test_name} )
|
||||
endfunction(serialization_test)
|
||||
|
||||
function(archive_test test_name)
|
||||
set(test_list)
|
||||
set(arglist)
|
||||
foreach(a IN ITEMS ${ARGN} )
|
||||
set(arglist ${arglist} ../test/${a}.cpp)
|
||||
endforeach()
|
||||
foreach(
|
||||
archive-name
|
||||
IN ITEMS ${archive_list}
|
||||
IN ITEMS portable_archive
|
||||
# text_archive text_warchive binary_archive xml_archive xml_warchive
|
||||
)
|
||||
set(amended_test_name ${test_name}_${archive-name})
|
||||
message(STATUS ${amended_test_name})
|
||||
add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})
|
||||
set_property(
|
||||
TARGET ${amended_test_name}
|
||||
PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=${archive-name}.hpp
|
||||
)
|
||||
message(STATUS ${amended_test_name} " " ${arglist} " " ${archive-name})
|
||||
target_link_libraries(${amended_test_name} serialization wserialization filesystem)
|
||||
target_link_libraries(${amended_test_name} serialization wserialization ${Boost_LIBRARIES})
|
||||
add_test(${amended_test_name} ${amended_test_name})
|
||||
set(test_list ${test_list} ${amended_test_name} PARENT_SCOPE)
|
||||
endforeach()
|
||||
endfunction(archive_test)
|
||||
|
||||
function(polymorphic_archive_test test_name)
|
||||
set(test_list)
|
||||
set(arglist)
|
||||
foreach(a IN ITEMS ${ARGN} )
|
||||
set(arglist ${arglist} ../test/${a}.cpp)
|
||||
endforeach()
|
||||
foreach(
|
||||
archive-name
|
||||
IN ITEMS ${archive_list}
|
||||
IN ITEMS portable_archive
|
||||
# text_archive text_warchive binary_archive xml_archive xml_warchive
|
||||
)
|
||||
set(amended_archive_name polymorphic_${archive-name})
|
||||
set(amended_test_name ${test_name}_${amended_archive_name})
|
||||
set(amended_test_name ${test_name}_polymorphic_${archive-name})
|
||||
message(STATUS ${amended_test_name})
|
||||
add_executable(${amended_test_name} ../test/${test_name}.cpp ${arglist})
|
||||
set_property(
|
||||
TARGET ${amended_test_name}
|
||||
PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=${amended_archive_name}.hpp
|
||||
PROPERTY COMPILE_DEFINITIONS BOOST_ARCHIVE_TEST=polymorphic_${archive-name}.hpp
|
||||
)
|
||||
message(STATUS ${amended_test_name} " " ${arglist} " " ${amended_archive_name})
|
||||
target_link_libraries(${amended_test_name} serialization wserialization filesystem)
|
||||
target_link_libraries(${amended_test_name} serialization wserialization ${Boost_LIBRARIES})
|
||||
add_test(${amended_test_name} ${amended_test_name})
|
||||
set(test_list ${test_list} ${amended_test_name} PARENT_SCOPE)
|
||||
endforeach()
|
||||
endfunction(polymorphic_archive_test)
|
||||
|
||||
enable_testing()
|
||||
|
||||
message(STATUS dll_a)
|
||||
add_library(dll_a SHARED ../test/dll_a.cpp)
|
||||
target_link_libraries(dll_a serialization)
|
||||
serialization_test(test_dll_simple)
|
||||
target_link_libraries(test_dll_simple dll_a serialization)
|
||||
|
||||
message(STATUS dll_polymorphic_base)
|
||||
add_library(dll_polymorphic_base SHARED ../test/polymorphic_base.cpp)
|
||||
target_link_libraries(dll_polymorphic_base serialization)
|
||||
|
||||
message(STATUS dll_polymorphic_derived2)
|
||||
add_library(dll_polymorphic_derived2 SHARED ../test/polymorphic_derived2.cpp)
|
||||
target_link_libraries(dll_polymorphic_derived2 dll_polymorphic_base serialization)
|
||||
|
||||
# serialization(test_dll_exported dll_polymorphic_derived2_lib)
|
||||
# serialization(test_dll_simple dll_a_lib)
|
||||
# compile test_dll_plugin.cpp
|
||||
# Running the following test requires that the test know the directory
|
||||
# in which the dll is stored. I don't know how to extract this from bjam
|
||||
@@ -288,13 +268,9 @@ serialization_test(test_mult_archive_types)
|
||||
serialization_test(test_iterators)
|
||||
serialization_test(test_iterators_base64)
|
||||
serialization_test(test_inclusion)
|
||||
serialization_test(test_inclusion2)
|
||||
serialization_test(test_smart_cast)
|
||||
serialization_test(test_codecvt_null ../src/codecvt_null)
|
||||
serialization_test(test_strong_typedef)
|
||||
serialization_test(test_singleton)
|
||||
serialization_test(test_singleton_inherited)
|
||||
serialization_test(test_singleton_plain)
|
||||
|
||||
archive_test(test_native_array A)
|
||||
archive_test(test_boost_array A)
|
||||
@@ -314,6 +290,7 @@ archive_test(test_derived)
|
||||
archive_test(test_derived_class A)
|
||||
archive_test(test_diamond)
|
||||
archive_test(test_diamond_complex)
|
||||
archive_test(test_exported polymorphic_base)
|
||||
archive_test(test_forward_list A)
|
||||
archive_test(test_forward_list_ptrs A)
|
||||
archive_test(test_helper_support)
|
||||
@@ -325,6 +302,7 @@ archive_test(test_map_boost_unordered A)
|
||||
archive_test(test_mi)
|
||||
archive_test(test_multiple_ptrs A)
|
||||
archive_test(test_multiple_inheritance)
|
||||
archive_test(test_no_rtti polymorphic_base polymorphic_derived1)
|
||||
archive_test(test_new_operator A)
|
||||
archive_test(test_non_intrusive)
|
||||
archive_test(test_non_default_ctor)
|
||||
@@ -380,14 +358,6 @@ else()
|
||||
endif()
|
||||
endif()
|
||||
|
||||
polymorphic_archive_test(test_dll_exported polymorphic_derived1)
|
||||
foreach(test_name IN ITEMS ${test_list} )
|
||||
target_link_libraries(${test_name} dll_polymorphic_derived2 dll_polymorphic_base)
|
||||
message(STATUS " " target_link_libraries " " dll_polymorphic_derived2 " " dll_polymorphic_base)
|
||||
endforeach()
|
||||
|
||||
polymorphic_archive_test(test_no_rtti polymorphic_base polymorphic_derived1 polymorphic_derived2)
|
||||
polymorphic_archive_test(test_exported polymorphic_base polymorphic_derived1 polymorphic_derived2)
|
||||
polymorphic_archive_test(test_polymorphic test_polymorphic_A A)
|
||||
polymorphic_archive_test(test_polymorphic2 test_polymorphic2imp)
|
||||
polymorphic_archive_test(test_polymorphic_helper)
|
||||
@@ -398,7 +368,7 @@ polymorphic_archive_test(test_polymorphic_helper)
|
||||
####################
|
||||
# add headers in IDE
|
||||
|
||||
# for serialization
|
||||
# for serialisation
|
||||
|
||||
file(GLOB x
|
||||
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}"
|
||||
|
||||
+1
-14
@@ -12,17 +12,6 @@ branches:
|
||||
- develop
|
||||
# - master
|
||||
|
||||
environment:
|
||||
matrix:
|
||||
- BUILD_TOOLSET: gcc
|
||||
BUILD_LINK: static
|
||||
- BUILD_TOOLSET: gcc
|
||||
BUILD_LINK: shared
|
||||
- BUILD_TOOLSET: msvc-14.0
|
||||
BUILD_LINK: static
|
||||
- BUILD_TOOLSET: msvc-14.0
|
||||
BUILD_LINK: shared
|
||||
|
||||
install:
|
||||
- cd ..
|
||||
- git clone -b %APPVEYOR_REPO_BRANCH% https://github.com/boostorg/boost.git boost-root
|
||||
@@ -35,7 +24,6 @@ install:
|
||||
- git submodule init libs/concept_check
|
||||
- git submodule init libs/config
|
||||
- git submodule init libs/container
|
||||
- git submodule init libs/container_hash
|
||||
- git submodule init libs/core
|
||||
- git submodule init libs/detail
|
||||
- git submodule init libs/filesystem
|
||||
@@ -65,7 +53,6 @@ install:
|
||||
- git submodule init libs/unordered
|
||||
- git submodule init libs/utility
|
||||
- git submodule init libs/variant
|
||||
- git submodule init libs/winapi
|
||||
- git submodule init tools/build
|
||||
- git submodule update
|
||||
- xcopy /s /e /q %APPVEYOR_BUILD_FOLDER% libs\serialization
|
||||
@@ -77,4 +64,4 @@ build: off
|
||||
|
||||
test_script:
|
||||
- cd libs/serialization/test
|
||||
- b2 -j2 toolset=%BUILD_TOOLSET% link=%BUILD_LINK%
|
||||
- b2 toolset=gcc link=static,shared
|
||||
|
||||
+2
-11
@@ -74,12 +74,6 @@ SOURCES =
|
||||
stl_port
|
||||
text_iarchive
|
||||
text_oarchive
|
||||
polymorphic_text_iarchive
|
||||
polymorphic_text_oarchive
|
||||
polymorphic_binary_iarchive
|
||||
polymorphic_binary_oarchive
|
||||
polymorphic_xml_iarchive
|
||||
polymorphic_xml_oarchive
|
||||
void_cast
|
||||
archive_exception
|
||||
xml_grammar
|
||||
@@ -88,20 +82,17 @@ SOURCES =
|
||||
xml_archive_exception
|
||||
codecvt_null
|
||||
utf8_codecvt_facet
|
||||
;
|
||||
singleton
|
||||
;
|
||||
|
||||
WSOURCES =
|
||||
basic_text_wiprimitive
|
||||
basic_text_woprimitive
|
||||
text_wiarchive
|
||||
text_woarchive
|
||||
polymorphic_text_wiarchive
|
||||
polymorphic_text_woarchive
|
||||
xml_wgrammar
|
||||
xml_wiarchive
|
||||
xml_woarchive
|
||||
polymorphic_xml_wiarchive
|
||||
polymorphic_xml_woarchive
|
||||
;
|
||||
|
||||
lib boost_serialization
|
||||
|
||||
@@ -267,7 +267,7 @@ EXCEPT for one special case.
|
||||
To make this work, the following should be included after the archive
|
||||
class definition.
|
||||
<pre><code>
|
||||
BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)
|
||||
#define BOOST_SERIALIZATION_REGISTER_ARCHIVE(Archive)
|
||||
</code></pre>
|
||||
Failure to do this will not inhibit the program from compiling, linking
|
||||
and executing properly - except in one case. If an instance of a derived
|
||||
|
||||
Executable
+38
@@ -0,0 +1,38 @@
|
||||
IMPORTANT:
|
||||
|
||||
This is the last release from me as EOS employee. I plan to contribute all of this
|
||||
work to the official boost libraries distribution and will continue to support users.
|
||||
Francois Mauger joined me recently and already added a valuable tutorial for you!
|
||||
|
||||
Changelog:
|
||||
|
||||
07.11.2015 5.1 Small fix to get it running up to 1.59.
|
||||
|
||||
26.06.2012 5.0 Ported to boost versions up to 1.49.
|
||||
Added support for wstring, added tutorial by Francois Mauger.
|
||||
|
||||
01.04.2011 4.2 Ported to boost versions up to 1.46.1.
|
||||
Allow serialization of inf and nan values.
|
||||
|
||||
17.12.2009 4.1 Ported to boost versions up to 1.41.
|
||||
|
||||
4.0 Changes in inheritance make arrays work.
|
||||
|
||||
13.02.2009 3.1 Shared pointer serialization capabilities added
|
||||
Ported to recent boost versions (up to 1.38)
|
||||
|
||||
25.09.2008 3.0 Refactored, fixed and ported to recent boost versions
|
||||
Archives are now named eos::portable_[io]archive
|
||||
|
||||
17.09.2008 2.1 Improved floating point handling and error detection.
|
||||
Extracted the exception class into an extra file.
|
||||
|
||||
28.04.2008 2.0 Major Bugfix resolving negative number collision!
|
||||
|
||||
28.11.2007 1.1 Small Bugfix in portable_binary_archive_exception class:
|
||||
throwing specifiers did not match base class declaration
|
||||
|
||||
12.11.2007 1.0 Initial Release to boost-users!
|
||||
|
||||
Christian Pfligersdorffer
|
||||
christian.pfligersdorffer@gmx.at
|
||||
Executable
+56
@@ -0,0 +1,56 @@
|
||||
/** tutorial_pba_0.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This quick start example shows how to store some variables
|
||||
* of basic types (bool, integer, floating point numbers, STL string)
|
||||
* using the portable binary archive format associated to a
|
||||
* standard output file stream.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
// The name for the example data file :
|
||||
std::string filename = "pba_0.data";
|
||||
|
||||
// Some variables of various primitive types :
|
||||
bool b = true;
|
||||
char c = 'B';
|
||||
uint32_t answer = 42;
|
||||
float computing_time = 7.5e6;
|
||||
double e = 2.71828182845905;
|
||||
std::string slogan = "DON'T PANIC";
|
||||
|
||||
// Open an output file stream in binary mode :
|
||||
std::ofstream fout (filename.c_str (), std::ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an output portable binary archive attached to the output file :
|
||||
boost::archive::portable_binary_oarchive opba (fout);
|
||||
|
||||
// Store (serializing) variables :
|
||||
opba & b & c & answer & computing_time & e & slogan;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_0.cpp
|
||||
Executable
+68
@@ -0,0 +1,68 @@
|
||||
/** tutorial_pba_1.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization package.
|
||||
*
|
||||
* This quick start example shows how to load some variables
|
||||
* of basic types (bool, integer, floating point numbers, STL string)
|
||||
* using the portable binary archive format associated to a
|
||||
* standard input file stream.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
// The name for the example data file :
|
||||
string filename = "pba_0.data";
|
||||
|
||||
// Some variables of various types :
|
||||
bool b;
|
||||
char c;
|
||||
uint32_t answer;
|
||||
float computing_time;
|
||||
double e;
|
||||
string slogan;
|
||||
|
||||
// Open an input file stream in binary mode :
|
||||
ifstream fin (filename.c_str (), ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an input portable binary archive attached to the input file :
|
||||
boost::archive::portable_binary_iarchive ipba (fin);
|
||||
|
||||
// Loading (de-serializing) variables using the same
|
||||
// order than for serialization (see tutorial_pba_0.cpp) :
|
||||
ipba & b & c & answer & computing_time & e & slogan;
|
||||
}
|
||||
|
||||
cout.precision (15);
|
||||
cout << "Variable 'b' is : " << b << " " << "(bool)" << endl;
|
||||
cout << "Variable 'c' is : '" << c << "' " << " " << "(char)" << endl;
|
||||
cout << "Variable 'answer' is : " << answer << " " << "(unsigned 32-bit integer)" << endl;
|
||||
cout << "Variable 'computing_time' is : " << computing_time << " " << "(single precision 32-bit float)" << endl;
|
||||
cout << "Variable 'e' is : " << e << " " << "(double precision 64-bit float)" << endl;
|
||||
cout << "Variable 'slogan' is : \"" << slogan << "\" " << "(std::string)" << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_1.cpp
|
||||
Executable
+162
@@ -0,0 +1,162 @@
|
||||
/** tutorial_pba_10.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This example shows how use PBAs combined with on-the-fly
|
||||
* compressed I/O streams.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
#include <boost/iostreams/filtering_stream.hpp>
|
||||
#include <boost/iostreams/filter/gzip.hpp>
|
||||
#include <boost/serialization/access.hpp>
|
||||
#include <boost/serialization/vector.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class data_type
|
||||
{
|
||||
private:
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
void serialize (Archive & ar, const unsigned int version);
|
||||
public:
|
||||
void print (ostream & out, const string & title) const;
|
||||
public:
|
||||
vector<double> values;
|
||||
data_type ();
|
||||
};
|
||||
|
||||
data_type::data_type () : values ()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void data_type::print (ostream & out, const string & title) const
|
||||
{
|
||||
out << endl;
|
||||
out << title << " :" << endl;
|
||||
for (int i = 0; i < this->values.size (); ++i)
|
||||
{
|
||||
out.precision (16);
|
||||
out.width (18);
|
||||
out << this->values [i] << ' ' ;
|
||||
if ((i%4) == 3) clog << endl;
|
||||
}
|
||||
out << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void data_type::serialize (Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & values;
|
||||
return;
|
||||
}
|
||||
|
||||
void do_gzipped_out (void)
|
||||
{
|
||||
// The name for the output data file :
|
||||
string filename = "pba_10.data.gz";
|
||||
|
||||
// A data structure to be stored :
|
||||
data_type my_data;
|
||||
|
||||
// Fill the vector with arbitrary (possibly non-finite) values :
|
||||
size_t dim = 1000;
|
||||
my_data.values.reserve (dim);
|
||||
for (int i = 0; i < dim; ++i)
|
||||
{
|
||||
double val = (i + 1) * (1.0 + 3 * numeric_limits<double>::epsilon ());
|
||||
if (i == 4) val = numeric_limits<double>::quiet_NaN ();
|
||||
if (i == 23) val = numeric_limits<double>::infinity ();
|
||||
if (i == 73) val = -numeric_limits<double>::infinity ();
|
||||
if (i == 90) val = 0.0;
|
||||
my_data.values.push_back (val);
|
||||
}
|
||||
|
||||
// Print:
|
||||
my_data.print (clog, "Stored data");
|
||||
|
||||
// Create an output filtering stream :
|
||||
boost::iostreams::filtering_ostream zout;
|
||||
zout.push (boost::iostreams::gzip_compressor ());
|
||||
|
||||
// Open an output file stream in binary mode :
|
||||
ofstream fout (filename.c_str (), ios_base::binary);
|
||||
zout.push (fout);
|
||||
|
||||
// Save to PBA :
|
||||
{
|
||||
// Create an output portable binary archive attached to the output file :
|
||||
boost::archive::portable_binary_oarchive opba (zout);
|
||||
|
||||
// Store (serializing) the data :
|
||||
opba & my_data;
|
||||
}
|
||||
|
||||
// Clean termination of the streams :
|
||||
zout.flush ();
|
||||
zout.reset ();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void do_gzipped_in (void)
|
||||
{
|
||||
// The name for the input data file :
|
||||
string filename = "pba_10.data.gz";
|
||||
|
||||
// A data structure to be loaded :
|
||||
data_type my_data;
|
||||
|
||||
// Create an input filtering stream :
|
||||
boost::iostreams::filtering_istream zin;
|
||||
zin.push (boost::iostreams::gzip_decompressor ());
|
||||
|
||||
// Open an input file stream in binary mode :
|
||||
ifstream fin (filename.c_str (), ios_base::binary);
|
||||
zin.push (fin);
|
||||
|
||||
// Load from PBA :
|
||||
{
|
||||
// Create an input portable binary archive attached to the input file :
|
||||
boost::archive::portable_binary_iarchive ipba (zin);
|
||||
|
||||
// Load (deserializing) the data :
|
||||
ipba & my_data;
|
||||
}
|
||||
|
||||
// Print:
|
||||
my_data.print (clog, "Loaded data");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
do_gzipped_out ();
|
||||
do_gzipped_in ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_10.cpp
|
||||
Executable
+198
@@ -0,0 +1,198 @@
|
||||
/** tutorial_pba_10b.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This example shows how use PBAs combined with on-the-fly
|
||||
* compressed I/O streams.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
#include <boost/archive/xml_oarchive.hpp>
|
||||
#include <boost/iostreams/filtering_stream.hpp>
|
||||
#include <boost/iostreams/filter/gzip.hpp>
|
||||
#include <boost/serialization/access.hpp>
|
||||
#include <boost/serialization/vector.hpp>
|
||||
#include <boost/serialization/nvp.hpp>
|
||||
#include <boost/serialization/version.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class data_type
|
||||
{
|
||||
private:
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
void serialize (Archive & ar, const unsigned int version);
|
||||
public:
|
||||
void print (ostream & out, const string & title) const;
|
||||
public:
|
||||
vector<double> values;
|
||||
data_type ();
|
||||
};
|
||||
|
||||
//BOOST_CLASS_VERSION(data_type, 7)
|
||||
|
||||
data_type::data_type () : values ()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void data_type::print (ostream & out, const string & title) const
|
||||
{
|
||||
out << endl;
|
||||
out << title << " :" << endl;
|
||||
for (int i = 0; i < this->values.size (); ++i)
|
||||
{
|
||||
out.precision (16);
|
||||
out.width (18);
|
||||
out << this->values [i] << ' ' ;
|
||||
if ((i%4) == 3) clog << endl;
|
||||
}
|
||||
out << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void data_type::serialize (Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & BOOST_SERIALIZATION_NVP (values);
|
||||
return;
|
||||
}
|
||||
|
||||
class data_type2
|
||||
{
|
||||
private:
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
void serialize (Archive & ar, const unsigned int version);
|
||||
public:
|
||||
double value;
|
||||
data_type2 ();
|
||||
};
|
||||
|
||||
BOOST_CLASS_VERSION(data_type2, 99)
|
||||
|
||||
data_type2::data_type2 () : value (666.666)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void data_type2::serialize (Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & BOOST_SERIALIZATION_NVP (value);
|
||||
return;
|
||||
}
|
||||
|
||||
class data_type3
|
||||
{
|
||||
private:
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
void serialize (Archive & ar, const unsigned int version);
|
||||
public:
|
||||
vector<data_type2> values;
|
||||
data_type3 ();
|
||||
};
|
||||
|
||||
BOOST_CLASS_VERSION(data_type3, 33)
|
||||
|
||||
data_type3::data_type3 ()
|
||||
{
|
||||
{
|
||||
data_type2 d;
|
||||
d.value = 6.66;
|
||||
values.push_back (d);
|
||||
}
|
||||
{
|
||||
data_type2 d;
|
||||
d.value = 66.66;
|
||||
values.push_back (d);
|
||||
}
|
||||
{
|
||||
data_type2 d;
|
||||
d.value = 666.66;
|
||||
values.push_back (d);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void data_type3::serialize (Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & BOOST_SERIALIZATION_NVP (values);
|
||||
return;
|
||||
}
|
||||
|
||||
/********************/
|
||||
|
||||
void do_xml_out (void)
|
||||
{
|
||||
// The name for the output data file :
|
||||
string filename = "pba_10.xml";
|
||||
|
||||
// A data structure to be stored :
|
||||
data_type my_data;
|
||||
|
||||
// Fill the vector with arbitrary (possibly non-finite) values :
|
||||
size_t dim = 6;
|
||||
my_data.values.reserve (dim);
|
||||
for (int i = 0; i < dim; ++i)
|
||||
{
|
||||
double val = (i + 1) * (1.0 + 3 * numeric_limits<double>::epsilon ());
|
||||
if (i == 4) val = numeric_limits<double>::quiet_NaN ();
|
||||
if (i == 7) val = numeric_limits<double>::infinity ();
|
||||
if (i == 9) val = -numeric_limits<double>::infinity ();
|
||||
if (i == 13) val = 0.0;
|
||||
my_data.values.push_back (val);
|
||||
}
|
||||
|
||||
// Print:
|
||||
my_data.print (clog, "Stored data");
|
||||
|
||||
data_type2 my_data2;
|
||||
data_type3 my_data3;
|
||||
|
||||
// Open an output file stream in binary mode :
|
||||
ofstream fout (filename.c_str ());
|
||||
|
||||
// Save to PBA :
|
||||
{
|
||||
// Create an output XML archive attached to the output file :
|
||||
boost::archive::xml_oarchive oxa (fout);
|
||||
|
||||
// Store (serializing) the data :
|
||||
oxa & BOOST_SERIALIZATION_NVP(my_data);
|
||||
oxa & BOOST_SERIALIZATION_NVP(my_data2);
|
||||
oxa & BOOST_SERIALIZATION_NVP(my_data3);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
do_xml_out ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_10b.cpp
|
||||
Executable
+187
@@ -0,0 +1,187 @@
|
||||
/** tutorial_pba_11.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This example program compares the times needed to serialize
|
||||
* and deserialize some large amount of data using PBA and
|
||||
* text archives.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
#include <boost/archive/text_oarchive.hpp>
|
||||
#include <boost/archive/text_iarchive.hpp>
|
||||
#include <boost/serialization/access.hpp>
|
||||
#include <boost/serialization/vector.hpp>
|
||||
#include <boost/random/mersenne_twister.hpp>
|
||||
#include <boost/random/uniform_real_distribution.hpp>
|
||||
#include <boost/timer.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
class data_type
|
||||
{
|
||||
private:
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
void serialize (Archive & ar, const unsigned int version);
|
||||
public:
|
||||
void print (ostream & out, const string & title) const;
|
||||
public:
|
||||
vector<double> values;
|
||||
data_type ();
|
||||
};
|
||||
|
||||
data_type::data_type () : values ()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
void data_type::print (ostream & out, const string & title) const
|
||||
{
|
||||
out << endl;
|
||||
out << title << " :" << endl;
|
||||
bool skip = false;
|
||||
for (int i = 0; i < this->values.size (); ++i)
|
||||
{
|
||||
if ((i >= 12) && (i < (int) this->values.size () - 8))
|
||||
{
|
||||
if (! skip) out << " ..." << endl;
|
||||
skip = true;
|
||||
continue;
|
||||
}
|
||||
out.precision (16);
|
||||
out.width (18);
|
||||
out << this->values [i] << ' ' ;
|
||||
if ((i%4) == 3) clog << endl;
|
||||
}
|
||||
out << endl;
|
||||
return;
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void data_type::serialize (Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & values;
|
||||
return;
|
||||
}
|
||||
|
||||
double do_pba_out (const data_type & a_data)
|
||||
{
|
||||
string filename = "pba_11.data";
|
||||
ofstream fout (filename.c_str (), ios_base::binary);
|
||||
boost::timer io_timer;
|
||||
{
|
||||
boost::archive::portable_binary_oarchive opba (fout);
|
||||
opba & a_data;
|
||||
}
|
||||
return io_timer.elapsed ();
|
||||
}
|
||||
|
||||
double do_pba_in (data_type & a_data)
|
||||
{
|
||||
string filename = "pba_11.data";
|
||||
ifstream fin (filename.c_str (), ios_base::binary);
|
||||
boost::timer io_timer;
|
||||
{
|
||||
boost::archive::portable_binary_iarchive ipba (fin);
|
||||
ipba & a_data;
|
||||
}
|
||||
return io_timer.elapsed ();
|
||||
}
|
||||
|
||||
double do_text_out (const data_type & a_data)
|
||||
{
|
||||
string filename = "pba_11.txt";
|
||||
ofstream fout (filename.c_str ());
|
||||
boost::timer io_timer;
|
||||
{
|
||||
boost::archive::text_oarchive ota (fout);
|
||||
ota & a_data;
|
||||
}
|
||||
return io_timer.elapsed ();
|
||||
}
|
||||
|
||||
double do_text_in (data_type & a_data)
|
||||
{
|
||||
string filename = "pba_11.txt";
|
||||
ifstream fin (filename.c_str ());
|
||||
boost::timer io_timer;
|
||||
{
|
||||
boost::archive::text_iarchive ita (fin);
|
||||
ita & a_data;
|
||||
}
|
||||
return io_timer.elapsed ();
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
double elapsed_time_pba_out;
|
||||
double elapsed_time_text_out;
|
||||
double elapsed_time_pba_in;
|
||||
double elapsed_time_text_in;
|
||||
data_type my_data; // A data structure to be stored then loaded.
|
||||
|
||||
{
|
||||
// Fill the vector with random values :
|
||||
size_t dim = 10000000;
|
||||
my_data.values.reserve (dim);
|
||||
boost::random::mt19937 rng;
|
||||
boost::random::uniform_real_distribution<> flat (0.0, 100.0);
|
||||
for (int i = 0; i < dim; ++i)
|
||||
{
|
||||
double val = flat (rng);
|
||||
my_data.values.push_back (val);
|
||||
}
|
||||
my_data.print (clog, "Stored data in PBA and text archive");
|
||||
}
|
||||
|
||||
{
|
||||
// Store in PBA :
|
||||
elapsed_time_pba_out = do_pba_out (my_data);
|
||||
}
|
||||
|
||||
{
|
||||
// Store in text archive :
|
||||
elapsed_time_text_out = do_text_out (my_data);
|
||||
}
|
||||
|
||||
{
|
||||
my_data.values.clear ();
|
||||
// Load from PBA :
|
||||
elapsed_time_pba_in = do_pba_in (my_data);
|
||||
my_data.print (clog, "Loaded data from PBA");
|
||||
}
|
||||
|
||||
{
|
||||
my_data.values.clear ();
|
||||
// Load from text archive :
|
||||
elapsed_time_text_in = do_text_in (my_data);
|
||||
my_data.print (clog, "Loaded data from text archive");
|
||||
}
|
||||
|
||||
clog << "PBA store I/O elapsed time : " << elapsed_time_pba_out << " (second)" << endl;
|
||||
clog << "Text store I/O elapsed time : " << elapsed_time_text_out << " (second)" << endl;
|
||||
clog << "PBA load I/O elapsed time : " << elapsed_time_pba_in << " (second)" << endl;
|
||||
clog << "Text load I/O elapsed time : " << elapsed_time_text_in << " (second)" << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_11.cpp
|
||||
Executable
+105
@@ -0,0 +1,105 @@
|
||||
/** tutorial_pba_2.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This sample program shows how to use a portable binary archive
|
||||
* to store/load floating point numbers including non-finite and
|
||||
* special (denormalized) values.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
// The name for the example data file :
|
||||
string filename = "pba_2.data";
|
||||
|
||||
{
|
||||
// A normal single precision floating point number :
|
||||
float pi = 3.14159265;
|
||||
|
||||
// Single precision zeroed floating point number :
|
||||
float zero = 0.0;
|
||||
|
||||
// A denormalized single precision floating point number :
|
||||
float tiny = 1.e-40;
|
||||
|
||||
// A single precision floating point number with `+Infinity' value :
|
||||
float plus_infinity = numeric_limits<float>::infinity ();
|
||||
|
||||
// A single precision floating point number with `-Infinity' value :
|
||||
float minus_infinity = -numeric_limits<float>::infinity ();
|
||||
|
||||
// A single precision `Not-a-Number' (NaN):
|
||||
float nan = numeric_limits<float>::quiet_NaN ();
|
||||
|
||||
// Open an output file stream in binary mode :
|
||||
ofstream fout (filename.c_str (), ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an output portable binary archive attached to the output file :
|
||||
boost::archive::portable_binary_oarchive opba (fout);
|
||||
|
||||
// Store (serialize) variables :
|
||||
opba & pi & zero & tiny & plus_infinity & minus_infinity & nan;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
// Single precision floating point numbers to be loaded :
|
||||
float x[6];
|
||||
|
||||
// Open an input file stream in binary mode :
|
||||
ifstream fin (filename.c_str (), ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an input portable binary archive attached to the input file :
|
||||
boost::archive::portable_binary_iarchive ipba (fin);
|
||||
|
||||
// Load (de-serialize) variables using the same
|
||||
// order than for serialization :
|
||||
for (int i = 0; i < 6; ++i)
|
||||
{
|
||||
ipba & x[i];
|
||||
}
|
||||
}
|
||||
|
||||
// Print :
|
||||
for (int i = 0; i < 6; ++i)
|
||||
{
|
||||
cout.precision (8);
|
||||
cout << "Loaded x[" << i << "] = " << x[i];
|
||||
switch (fp::fpclassify(x[i]))
|
||||
{
|
||||
case FP_NAN: cout << " (NaN)"; break;
|
||||
case FP_INFINITE: cout << " (infinite)"; break;
|
||||
case FP_SUBNORMAL: cout << " (denormalized)"; break;
|
||||
case FP_NORMAL: cout << " (normalized)"; break;
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_2.cpp
|
||||
Executable
+70
@@ -0,0 +1,70 @@
|
||||
/** tutorial_pba_3.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This sample program shows how to use a portable binary archive
|
||||
* and prevent the serialization of non-finite floating numbers.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
// The name for the example data file :
|
||||
string filename = "pba_3.data";
|
||||
|
||||
try
|
||||
{
|
||||
// An array of single precision floating numbers:
|
||||
float x[5];
|
||||
x[0] = 3.14159; // Pi
|
||||
x[1] = 6.022e22; // Avogadro constant
|
||||
x[2] = 1.6e-19; // Electron charge magnitude
|
||||
x[3] = 1.e-40; // A tiny (denormalized) value
|
||||
x[4] = numeric_limits<float>::infinity (); // This will fail while serializing...
|
||||
|
||||
// Open an output file stream in binary mode :
|
||||
ofstream fout (filename.c_str (), ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an output portable binary archive attached to the output file,
|
||||
// using the special 'boost::archive::no_infnan' flag :
|
||||
boost::archive::portable_binary_oarchive opba (fout, boost::archive::no_infnan);
|
||||
|
||||
// Store (serialize) variables :
|
||||
for (int i = 0; i < 5; ++i)
|
||||
{
|
||||
clog << "Serializing value : " << x[i] << " ... ";
|
||||
opba & x[i];
|
||||
clog << "Ok !" << endl;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (exception & x)
|
||||
{
|
||||
cerr << "ERROR: " << x.what () << endl;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_3.cpp
|
||||
Executable
+105
@@ -0,0 +1,105 @@
|
||||
/** tutorial_pba_4.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This sample program shows how to use a portable binary archive
|
||||
* to store/load integer numbers of various sizes using the Boost
|
||||
* portable integer typedefs.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
// The name for the example data file :
|
||||
string filename = "pba_4.data";
|
||||
|
||||
{
|
||||
// Some integer numbers :
|
||||
bool t = true;
|
||||
char c = 'c';
|
||||
unsigned char u = 'u';
|
||||
int8_t b = -3; // char
|
||||
uint8_t B = +6; // unsigned char
|
||||
int16_t s = -16;
|
||||
uint16_t S = +32;
|
||||
int32_t l = -128;
|
||||
uint32_t L = +127;
|
||||
int64_t ll = -1024;
|
||||
uint64_t LL = +2048;
|
||||
|
||||
// Open an output file stream in binary mode :
|
||||
ofstream fout (filename.c_str (), ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an output portable binary archive attached to the output file :
|
||||
boost::archive::portable_binary_oarchive opba (fout);
|
||||
|
||||
// Store (serialize) variables :
|
||||
opba & t & c & u & b & B & s & S & l & L & ll & LL;
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
// Single precision floating numbers to be loaded :
|
||||
// Some integer numbers :
|
||||
bool t;
|
||||
char c;
|
||||
unsigned char u;
|
||||
int8_t b;
|
||||
uint8_t B;
|
||||
int16_t s;
|
||||
uint16_t S;
|
||||
int32_t l;
|
||||
uint32_t L;
|
||||
int64_t ll;
|
||||
uint64_t LL;
|
||||
|
||||
// Open an input file stream in binary mode :
|
||||
ifstream fin (filename.c_str (), ios_base::binary);
|
||||
|
||||
{
|
||||
// Create an input portable binary archive attached to the input file :
|
||||
boost::archive::portable_binary_iarchive ipba (fin);
|
||||
|
||||
// Load (de-serialize) variables using the same
|
||||
// order than for serialization :
|
||||
ipba & t & c & u & b & B & s & S & l & L & ll & LL;
|
||||
}
|
||||
|
||||
clog << "t = " << t << " (bool)" << endl;
|
||||
clog << "c = '" << c << "' (char)" << endl;
|
||||
clog << "u = '" << u << "' (unsigned char)" << endl;
|
||||
clog << "b = " << (int) b << " (int8_t)" << endl;
|
||||
clog << "B = " << (int) B << " (uint8_t)" << endl;
|
||||
clog << "s = " << s << " (int16_t)" << endl;
|
||||
clog << "S = " << S << " (uint16_t)" << endl;
|
||||
clog << "l = " << l << " (int32_t)" << endl;
|
||||
clog << "L = " << L << " (uint32_t)" << endl;
|
||||
clog << "ll = " << ll << " (int64_t)" << endl;
|
||||
clog << "LL = " << LL << " (uint64_t)" << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_4.cpp
|
||||
Executable
+111
@@ -0,0 +1,111 @@
|
||||
/** tutorial_pba_5.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This sample program shows how to use a portable binary archive
|
||||
* to store/load data in a memory buffer.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/iostreams/stream.hpp>
|
||||
#include <boost/iostreams/device/back_inserter.hpp>
|
||||
#include <boost/iostreams/device/array.hpp>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
|
||||
int main (void)
|
||||
{
|
||||
using namespace std;
|
||||
|
||||
// The memory buffer is implemented using a STL vector :
|
||||
typedef std::vector<char> buffer_type;
|
||||
buffer_type buffer;
|
||||
|
||||
{
|
||||
// Some data to be stored :
|
||||
bool t = true;
|
||||
char c = 'c';
|
||||
int16_t s = +16;
|
||||
int32_t l = -128;
|
||||
int64_t ll = +10000000000;
|
||||
float pi = 3.14159;
|
||||
double nan = numeric_limits<double>::quiet_NaN ();
|
||||
string hello = "World !";
|
||||
|
||||
buffer.reserve (1024); // pre-allocate some memory
|
||||
|
||||
// The output stream interface to the buffer :
|
||||
boost::iostreams::stream<boost::iostreams::back_insert_device<buffer_type> > output_stream (buffer);
|
||||
|
||||
{
|
||||
// Create an output portable binary archive attached to the output file :
|
||||
boost::archive::portable_binary_oarchive opba (output_stream);
|
||||
|
||||
// Store (serialize) variables :
|
||||
opba & t & c & s & l & ll & pi & nan & hello;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
clog << "Buffer content is " << buffer.size () << " bytes : " << endl << " ";
|
||||
for (int i = 0; i < buffer.size (); ++i)
|
||||
{
|
||||
clog << (int) ((unsigned char) buffer[i]) << ' ';
|
||||
if ((i + 1) % 20 == 0) clog << endl << " ";
|
||||
}
|
||||
clog << endl;
|
||||
|
||||
{
|
||||
// Some data to be loaded :
|
||||
bool t;
|
||||
char c;
|
||||
int16_t s;
|
||||
int32_t l;
|
||||
int64_t ll;
|
||||
float pi;
|
||||
double nan;
|
||||
string hello;
|
||||
|
||||
// The input stream interface to the buffer :
|
||||
boost::iostreams::stream<boost::iostreams::array_source> input_stream (&buffer[0],
|
||||
buffer.size ());
|
||||
|
||||
{
|
||||
// Create an input portable binary archive attached to the input file :
|
||||
boost::archive::portable_binary_iarchive ipba (input_stream);
|
||||
|
||||
// Load (de-serialize) variables :
|
||||
ipba & t & c & s & l & ll & pi & nan & hello;
|
||||
}
|
||||
|
||||
clog << "Loaded values from the buffer are: " << endl;
|
||||
clog << " t = " << t << " (bool)" << endl;
|
||||
clog << " c = '" << c << "' (char)" << endl;
|
||||
clog << " s = " << s << " (int16_t)" << endl;
|
||||
clog << " l = " << l << " (int32_t)" << endl;
|
||||
clog << " ll = " << ll << " (int64_t)" << endl;
|
||||
clog << " pi = " << pi << " (float)" << endl;
|
||||
clog << " nan = " << nan << " (double)" << endl;
|
||||
clog << " hello = \"" << hello << "\" (std::string)" << endl;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_5.cpp
|
||||
Executable
+112
@@ -0,0 +1,112 @@
|
||||
/** tutorial_pba_6.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This sample program shows how to use a portable binary archive
|
||||
* associated to a memory buffer to copy a non-copyable object.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <vector>
|
||||
|
||||
#include <boost/utility.hpp>
|
||||
#include <boost/iostreams/stream.hpp>
|
||||
#include <boost/iostreams/device/back_inserter.hpp>
|
||||
#include <boost/iostreams/device/array.hpp>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/portable_binary_oarchive.hpp>
|
||||
#include <boost/archive/portable_binary_iarchive.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
/* A foo noncopyable class */
|
||||
struct foo : boost::noncopyable
|
||||
{
|
||||
uint32_t status;
|
||||
double value;
|
||||
double special;
|
||||
|
||||
string to_string () const
|
||||
{
|
||||
ostringstream sout;
|
||||
sout << "foo={status=" << status << "; value=" << value << "; special=" << special<< "}";
|
||||
return sout.str();
|
||||
}
|
||||
|
||||
template<class Archive>
|
||||
void serialize (Archive & ar, const unsigned int version)
|
||||
{
|
||||
ar & status;
|
||||
ar & value;
|
||||
ar & special;
|
||||
return;
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
// A templatized copy function for Boost/Serialization equipped classes.
|
||||
// Here we use PBAs associated to a memory buffer :
|
||||
template <class Serializable>
|
||||
void copy (const Serializable & source, Serializable & target)
|
||||
{
|
||||
namespace io = boost::iostreams;
|
||||
namespace ba = boost::archive;
|
||||
if (&source == &target) return; // self-copy guard
|
||||
typedef std::vector<char> buffer_type;
|
||||
buffer_type buffer;
|
||||
buffer.reserve (1024);
|
||||
{
|
||||
io::stream<io::back_insert_device<buffer_type> > output_stream (buffer);
|
||||
ba::portable_binary_oarchive opba (output_stream);
|
||||
opba & source;
|
||||
}
|
||||
{
|
||||
io::stream<io::array_source> input_stream (&buffer[0], buffer.size ());
|
||||
ba::portable_binary_iarchive ipba (input_stream);
|
||||
ipba & target;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
// Some instance of the 'foo' class :
|
||||
foo dummy;
|
||||
dummy.status = 1;
|
||||
dummy.value = 3.14159;
|
||||
dummy.special = numeric_limits<double>::quiet_NaN ();
|
||||
clog << "dummy is : " << dummy.to_string () << endl;
|
||||
|
||||
// Another instance of the 'foo' class :
|
||||
foo clone;
|
||||
|
||||
/* The following instruction is forbidden because foo
|
||||
inherits 'boost::noncopyable' :
|
||||
|
||||
clone = dummy; // this ends in a compilation error.
|
||||
|
||||
*/
|
||||
|
||||
// Anyway, we can use this workaround :
|
||||
copy (dummy, clone);
|
||||
clog << "clone is : " << clone.to_string () << endl;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_6.cpp
|
||||
Executable
+54
@@ -0,0 +1,54 @@
|
||||
/** tutorial_pba_7.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This example shows how the default behaviour of standard
|
||||
* I/O streams does not support the read/write operations of
|
||||
* non-finite floating point values in a portable way.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <limits>
|
||||
|
||||
using namespace std;
|
||||
|
||||
int main (void)
|
||||
{
|
||||
{
|
||||
float x = numeric_limits<float>::infinity ();
|
||||
double y = numeric_limits<double>::quiet_NaN ();
|
||||
cout.precision (8);
|
||||
cout << "x = " << x << endl;
|
||||
cout.precision (16);
|
||||
cout << "y = " << y << endl;
|
||||
}
|
||||
|
||||
{
|
||||
string input ("inf nan");
|
||||
istringstream iss (input);
|
||||
float x;
|
||||
double y;
|
||||
iss >> x >> y;
|
||||
if (! iss)
|
||||
{
|
||||
cerr << "Cannot read 'x' or 'y' : non finite values are not supported !" << endl;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_7.cpp
|
||||
Executable
+118
@@ -0,0 +1,118 @@
|
||||
/** tutorial_pba_8.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This example shows how to store some variables
|
||||
* of basic types (bool, integer, floating point numbers, STL string)
|
||||
* using the text or XML archive format associated to a
|
||||
* standard output file stream supporting portable non-finite
|
||||
* floating point values.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <locale>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/xml_oarchive.hpp>
|
||||
#include <boost/archive/text_oarchive.hpp>
|
||||
#include <boost/serialization/nvp.hpp>
|
||||
#include <boost/archive/codecvt_null.hpp>
|
||||
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void do_text_out (void)
|
||||
{
|
||||
// The name for the example data text file :
|
||||
string filename = "pba_8.txt";
|
||||
|
||||
// Some variables of various primitive types :
|
||||
bool b = true;
|
||||
char c = 'B';
|
||||
uint32_t answer = 42;
|
||||
float value = numeric_limits<float>::infinity ();
|
||||
double precision = numeric_limits<double>::quiet_NaN ();
|
||||
string question = "What makes you think she's a witch?";
|
||||
|
||||
// Open an output file stream :
|
||||
ofstream fout (filename.c_str ());
|
||||
|
||||
// Prepare the output file stream for inf/NaN support :
|
||||
locale default_locale (locale::classic (),
|
||||
new boost::archive::codecvt_null<char>);
|
||||
locale infnan_locale (default_locale,
|
||||
new boost::math::nonfinite_num_put<char>);
|
||||
fout.imbue (infnan_locale);
|
||||
|
||||
{
|
||||
// Create an output text archive attached to the output file :
|
||||
boost::archive::text_oarchive ota (fout, boost::archive::no_codecvt);
|
||||
|
||||
// Store (serializing) variables :
|
||||
ota & b & c & answer & value & precision & question;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void do_xml_out (void)
|
||||
{
|
||||
// The name for the example data XML file :
|
||||
string filename = "pba_8.xml";
|
||||
|
||||
// Some variables of various primitive types :
|
||||
bool b = true;
|
||||
char c = 'B';
|
||||
uint32_t answer = 42;
|
||||
float value = numeric_limits<float>::infinity ();
|
||||
double precision = numeric_limits<double>::quiet_NaN ();
|
||||
string question = "What makes you think she's a witch?";
|
||||
|
||||
// Open an output file stream :
|
||||
ofstream fout (filename.c_str ());
|
||||
|
||||
// Prepare the output file stream for inf/NaN support :
|
||||
locale default_locale (locale::classic (),
|
||||
new boost::archive::codecvt_null<char>);
|
||||
locale infnan_locale (default_locale,
|
||||
new boost::math::nonfinite_num_put<char>);
|
||||
fout.imbue (infnan_locale);
|
||||
|
||||
{
|
||||
// Create an output text archive attached to the output file :
|
||||
boost::archive::xml_oarchive oxa (fout, boost::archive::no_codecvt);
|
||||
|
||||
// Store (serializing) variables :
|
||||
oxa & BOOST_SERIALIZATION_NVP(b)
|
||||
& BOOST_SERIALIZATION_NVP(c)
|
||||
& BOOST_SERIALIZATION_NVP(answer)
|
||||
& BOOST_SERIALIZATION_NVP(value)
|
||||
& BOOST_SERIALIZATION_NVP(precision)
|
||||
& BOOST_SERIALIZATION_NVP(question);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
do_text_out ();
|
||||
do_xml_out ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_8.cpp
|
||||
Executable
+134
@@ -0,0 +1,134 @@
|
||||
/** tutorial_pba_9.cpp
|
||||
*
|
||||
* (C) Copyright 2011 François Mauger, Christian Pfligersdorffer
|
||||
*
|
||||
* Use, modification and distribution is subject to the Boost Software
|
||||
* License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
* http://www.boost.org/LICENSE_1_0.txt)
|
||||
*
|
||||
*/
|
||||
|
||||
/**
|
||||
* The intent of this program is to serve as a tutorial for
|
||||
* users of the portable binary archive in the framework of
|
||||
* the Boost/Serialization library.
|
||||
*
|
||||
* This example shows how to load some variables of basic
|
||||
* types (bool, char, integer, floating point numbers, STL string)
|
||||
* using the text or XML archive format associated to a
|
||||
* standard file input stream supporting portable non-finite
|
||||
* floating point values.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <limits>
|
||||
#include <locale>
|
||||
|
||||
#include <boost/cstdint.hpp>
|
||||
#include <boost/archive/xml_iarchive.hpp>
|
||||
#include <boost/archive/text_iarchive.hpp>
|
||||
#include <boost/serialization/nvp.hpp>
|
||||
#include <boost/scoped_ptr.hpp>
|
||||
#include <boost/archive/codecvt_null.hpp>
|
||||
#include <boost/math/special_functions/nonfinite_num_facets.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void do_text_in (void)
|
||||
{
|
||||
// The name for the example data text file :
|
||||
string filename = "pba_8.txt";
|
||||
// Some variables of various primitive types :
|
||||
bool b;
|
||||
char c;
|
||||
uint32_t answer;
|
||||
float value;
|
||||
double precision;
|
||||
string question;
|
||||
|
||||
// Open an input file stream :
|
||||
ifstream fin (filename.c_str ());
|
||||
|
||||
// Prepare the input file stream for inf/NaN support :
|
||||
locale default_locale (locale::classic (),
|
||||
new boost::archive::codecvt_null<char>);
|
||||
locale infnan_locale (default_locale,
|
||||
new boost::math::nonfinite_num_get<char>);
|
||||
fin.imbue (infnan_locale);
|
||||
|
||||
{
|
||||
// Create an input text archive attached to the input file :
|
||||
boost::archive::text_iarchive ita (fin, boost::archive::no_codecvt);
|
||||
|
||||
// Store (serializing) variables :
|
||||
ita & b & c & answer & value & precision & question;
|
||||
}
|
||||
|
||||
clog << "Loaded values from text archive are: " << endl;
|
||||
clog << " b = " << b << endl;
|
||||
clog << " c = '" << c << "'" << endl;
|
||||
clog << " answer = " << answer << endl;
|
||||
clog << " value = " << value << endl;
|
||||
clog << " precision = " << precision << endl;
|
||||
clog << " question = \"" << question << "\"" << endl;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
void do_xml_in (void)
|
||||
{
|
||||
// The name for the example data text file :
|
||||
string filename = "pba_8.xml";
|
||||
|
||||
// Some variables of various primitive types :
|
||||
bool b;
|
||||
char c;
|
||||
uint32_t answer;
|
||||
float value;
|
||||
double precision;
|
||||
string question;
|
||||
|
||||
// Open an input file stream :
|
||||
ifstream fin (filename.c_str ());
|
||||
|
||||
// Prepare the input file stream for inf/NaN support :
|
||||
locale default_locale (locale::classic (),
|
||||
new boost::archive::codecvt_null<char>);
|
||||
locale infnan_locale (default_locale,
|
||||
new boost::math::nonfinite_num_get<char>);
|
||||
fin.imbue (infnan_locale);
|
||||
|
||||
{
|
||||
// Create an output text archive attached to the output file :
|
||||
boost::archive::xml_iarchive ixa (fin, boost::archive::no_codecvt);
|
||||
|
||||
// Store (serializing) variables :
|
||||
ixa & BOOST_SERIALIZATION_NVP(b)
|
||||
& BOOST_SERIALIZATION_NVP(c)
|
||||
& BOOST_SERIALIZATION_NVP(answer)
|
||||
& BOOST_SERIALIZATION_NVP(value)
|
||||
& BOOST_SERIALIZATION_NVP(precision)
|
||||
& BOOST_SERIALIZATION_NVP(question);
|
||||
}
|
||||
|
||||
clog << "Loaded values from XML archive are: " << endl;
|
||||
clog << " b = " << b << endl;
|
||||
clog << " c = '" << c << "'" << endl;
|
||||
clog << " answer = " << answer << endl;
|
||||
clog << " value = " << value << endl;
|
||||
clog << " precision = " << precision << endl;
|
||||
clog << " question = \"" << question << "\"" << endl;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
int main (void)
|
||||
{
|
||||
do_text_in ();
|
||||
do_xml_in ();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// end of tutorial_pba_9.cpp
|
||||
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
Executable
BIN
Binary file not shown.
|
After Width: | Height: | Size: 1.3 KiB |
Executable
+36
@@ -0,0 +1,36 @@
|
||||
IMPORTANT:
|
||||
|
||||
This is the last release from me as EOS employee. I plan to contribute all of this
|
||||
work to the official boost libraries distribution and will continue to support users.
|
||||
Francois Mauger joined me recently and already added a valuable tutorial for you!
|
||||
|
||||
|
||||
Dear user,
|
||||
|
||||
I am proud to announce the very first release of our portable_binary_[io]archive
|
||||
which we use here at EOS to move data between different platforms. It really is
|
||||
a conglomerate of pieces that already were there - as is most often the case in
|
||||
OO world - we simply put them together in a way that seemed to make sense. I know
|
||||
a lot of people were interested in portable binary archives, so here you are -
|
||||
give it a try and let me know what you think about it!
|
||||
|
||||
We rely heavily on boost::serialization and really appreciate the amount of time
|
||||
and knowledge that went into it. By publishing this small missing piece we hope
|
||||
to contribute our mite to this great library.
|
||||
|
||||
The work extends the portable binary example which was done by Robert Ramey and
|
||||
uses Beman Dawes' endian library plus the fp_utilities by Johan Rade. You will
|
||||
need to get those two libraries in order to use our classes - look for them at
|
||||
the boost vault (http://www.boost-consulting.com/vault/) in categories 'integer'
|
||||
and 'math - numerics'. Finally you will find the portable binary archive in
|
||||
category 'serialization' as well.
|
||||
|
||||
Regards,
|
||||
Christian Pfligersdorffer
|
||||
|
||||
Munich, End of 2007
|
||||
|
||||
--
|
||||
christian.pfligersdorffer@eos.info
|
||||
christian.pfligersdorffer@gmx.at
|
||||
http://www.eos.info
|
||||
+151
@@ -0,0 +1,151 @@
|
||||
/*!
|
||||
* jQuery JavaScript Library v1.4
|
||||
* http://jquery.com/
|
||||
*
|
||||
* Copyright 2010, John Resig
|
||||
* Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
* http://docs.jquery.com/License
|
||||
*
|
||||
* Includes Sizzle.js
|
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation
|
||||
* Released under the MIT, BSD, and GPL Licenses.
|
||||
*
|
||||
* Date: Wed Jan 13 15:23:05 2010 -0500
|
||||
*/
|
||||
(function(A,w){function oa(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(oa,1);return}c.ready()}}function La(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function $(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var o in b)$(a,o,b[o],f,e,d);return a}if(d!==w){f=!i&&f&&c.isFunction(d);for(o=0;o<j;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,i);return a}return j?
|
||||
e(a[0],b):null}function K(){return(new Date).getTime()}function aa(){return false}function ba(){return true}function pa(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function qa(a){var b=true,d=[],f=[],e=arguments,i,j,o,p,n,t=c.extend({},c.data(this,"events").live);for(p in t){j=t[p];if(j.live===a.type||j.altLive&&c.inArray(a.type,j.altLive)>-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete t[p]}i=c(a.target).closest(f,a.currentTarget);
|
||||
n=0;for(l=i.length;n<l;n++)for(p in t){j=t[p];o=i[n].elem;f=null;if(i[n].selector===j.selector){if(j.live==="mouseenter"||j.live==="mouseleave")f=c(a.relatedTarget).closest(j.selector)[0];if(!f||f!==o)d.push({elem:o,fn:j})}}n=0;for(l=d.length;n<l;n++){i=d[n];a.currentTarget=i.elem;a.data=i.fn.data;if(i.fn.apply(i.elem,e)===false){b=false;break}}return b}function ra(a,b){return["live",a,b.replace(/\./g,"`").replace(/ /g,"&")].join(".")}function sa(a){return!a||!a.parentNode||a.parentNode.nodeType===
|
||||
11}function ta(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var i in f)for(var j in f[i])c.event.add(this,i,f[i][j],f[i][j].data)}}})}function ua(a,b,d){var f,e,i;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&a[0].indexOf("<option")<0){e=true;if(i=c.fragments[a[0]])if(i!==1)f=i}if(!f){b=b&&b[0]?b[0].ownerDocument||b[0]:s;f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=
|
||||
i?f:1;return{fragment:f,cacheable:e}}function T(a){for(var b=0,d,f;(d=a[b])!=null;b++)if(!c.noData[d.nodeName.toLowerCase()]&&(f=d[H]))delete c.cache[f]}function L(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ma=A.jQuery,Na=A.$,s=A.document,U,Oa=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Pa=/^.[^:#\[\.,]*$/,Qa=/\S/,
|
||||
Ra=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Sa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],M,ca=Object.prototype.toString,da=Object.prototype.hasOwnProperty,ea=Array.prototype.push,R=Array.prototype.slice,V=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Oa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Sa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];
|
||||
c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ua([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return U.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a)}else return!b||b.jquery?(b||U).find(a):c(b).find(a);else if(c.isFunction(a))return U.ready(a);if(a.selector!==w){this.selector=a.selector;
|
||||
this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a,this)},selector:"",jquery:"1.4",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=
|
||||
0;ea.apply(this,a);return this},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||
|
||||
c(null)},push:ea,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(i in e){j=a[i];o=e[i];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){j=j&&(c.isPlainObject(j)||c.isArray(j))?j:c.isArray(o)?[]:{};a[i]=c.extend(f,j,o)}else if(o!==w)a[i]=
|
||||
o}return a};c.extend({noConflict:function(a){A.$=Na;if(a)A.jQuery=Ma;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded",M,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",
|
||||
M);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&oa()}}},isFunction:function(a){return ca.call(a)==="[object Function]"},isArray:function(a){return ca.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||ca.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!da.call(a,"constructor")&&!da.call(a.constructor.prototype,"isPrototypeOf"))return false;var b;for(b in a);return b===w||da.call(a,b)},
|
||||
isEmptyObject:function(a){for(var b in a)return false;return true},noop:function(){},globalEval:function(a){if(a&&Qa.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,i=a.length,j=i===w||c.isFunction(a);
|
||||
if(d)if(j)for(f in a){if(b.apply(a[f],d)===false)break}else for(;e<i;){if(b.apply(a[e++],d)===false)break}else if(j)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<i&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Ra,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ea.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=
|
||||
0,f=b.length;d<f;d++)if(b[d]===a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,i=a.length;e<i;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,i=0,j=a.length;i<j;i++){e=b(a[i],i,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b===
|
||||
"string"){d=a;a=d[b];b=w}else if(b&&!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){var b={browser:""};a=a.toLowerCase();if(/webkit/.test(a))b={browser:"webkit",version:/webkit[\/ ]([\w.]+)/};else if(/opera/.test(a))b={browser:"opera",version:/version/.test(a)?/version[\/ ]([\w.]+)/:/opera[\/ ]([\w.]+)/};else if(/msie/.test(a))b={browser:"msie",version:/msie ([\w.]+)/};else if(/mozilla/.test(a)&&
|
||||
!/compatible/.test(a))b={browser:"mozilla",version:/rv:([\w.]+)/};b.version=(b.version&&b.version.exec(a)||[0,"0"])[1];return b},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari=true;if(V)c.inArray=function(a,b){return V.call(b,a)};U=c(s);if(s.addEventListener)M=function(){s.removeEventListener("DOMContentLoaded",M,false);c.ready()};else if(s.attachEvent)M=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",
|
||||
M);c.ready()}};if(V)c.inArray=function(a,b){return V.call(b,a)};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+K();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,
|
||||
htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,
|
||||
a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function o(){c.support.noCloneEvent=false;d.detachEvent("onclick",o)});d.cloneNode(true).fireEvent("onclick")}c(function(){var o=s.createElement("div");o.style.width=o.style.paddingLeft="1px";s.body.appendChild(o);c.boxModel=c.support.boxModel=o.offsetWidth===2;s.body.removeChild(o).style.display="none"});a=function(o){var p=s.createElement("div");o="on"+o;var n=o in
|
||||
p;if(!n){p.setAttribute(o,"return;");n=typeof p[o]==="function"}return n};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var H="jQuery"+K(),Ta=0,ya={},Ua={};c.extend({cache:{},expando:H,noData:{embed:true,object:true,applet:true},data:function(a,
|
||||
b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?ya:a;var f=a[H],e=c.cache;if(!b&&!f)return null;f||(f=++Ta);if(typeof b==="object"){a[H]=f;e=e[f]=c.extend(true,{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Ua:(e[f]={});if(d!==w){a[H]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?ya:a;var d=a[H],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[H]}catch(i){a.removeAttribute&&
|
||||
a.removeAttribute(H)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,
|
||||
a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,
|
||||
a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var za=/[\n\t]/g,fa=/\s+/,Va=/\r/g,Wa=/href|src|style/,Xa=/(button|input)/i,Ya=/(button|input|object|select|textarea)/i,Za=/^(a|area)$/i,Aa=/radio|checkbox/;c.fn.extend({attr:function(a,
|
||||
b){return $(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(p){var n=c(this);n.addClass(a.call(this,p,n.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(fa),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className)for(var i=" "+e.className+" ",j=0,o=b.length;j<o;j++){if(i.indexOf(" "+b[j]+" ")<0)e.className+=
|
||||
" "+b[j]}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(p){var n=c(this);n.removeClass(a.call(this,p,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(fa),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var i=(" "+e.className+" ").replace(za," "),j=0,o=b.length;j<o;j++)i=i.replace(" "+b[j]+" "," ");e.className=i.substring(1,i.length-1)}else e.className=""}return this},toggleClass:function(a,
|
||||
b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var i=c(this);i.toggleClass(a.call(this,e,i.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,i=0,j=c(this),o=b,p=a.split(fa);e=p[i++];){o=f?o:!j.hasClass(e);j[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className=this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=
|
||||
" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(za," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i<d;i++){var j=e[i];if(j.selected){a=c(j).val();if(b)return a;f.push(a)}}return f}if(Aa.test(b.type)&&
|
||||
!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Va,"")}return w}var o=c.isFunction(a);return this.each(function(p){var n=c(this),t=a;if(this.nodeType===1){if(o)t=a.call(this,p,n.val());if(typeof t==="number")t+="";if(c.isArray(t)&&Aa.test(this.type))this.checked=c.inArray(n.val(),t)>=0;else if(c.nodeName(this,"select")){var z=c.makeArray(t);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),z)>=0});if(!z.length)this.selectedIndex=
|
||||
-1}else this.value=t}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Wa.test(b);if(b in a&&f&&!i){if(e){if(b==="type"&&Xa.test(a.nodeName)&&a.parentNode)throw"type property can't be changed";a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;
|
||||
if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Ya.test(a.nodeName)||Za.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var $a=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===
|
||||
3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;if(!d.guid)d.guid=c.guid++;if(f!==w){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):w};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var o,p=0;o=b[p++];){var n=o.split(".");o=n.shift();d.type=n.slice(0).sort().join(".");var t=e[o],z=this.special[o]||{};if(!t){t=e[o]={};
|
||||
if(!z.setup||z.setup.call(a,f,n,d)===false)if(a.addEventListener)a.addEventListener(o,i,false);else a.attachEvent&&a.attachEvent("on"+o,i)}if(z.add)if((n=z.add.call(a,d,f,n,t))&&c.isFunction(n)){n.guid=n.guid||d.guid;d=n}t[d.guid]=d;this.global[o]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===w||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);
|
||||
for(var o=0;i=b[o++];){var p=i.split(".");i=p.shift();var n=!p.length,t=c.map(p.slice(0).sort(),$a);t=new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.)?")+"(\\.|$)");var z=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var B in f[i])if(n||t.test(f[i][B].type))delete f[i][B];z.remove&&z.remove.call(a,p,j);for(e in f[i])break;if(!e){if(!z.teardown||z.teardown.call(a,p)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+
|
||||
i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(B=c.data(a,"handle"))B.elem=null;c.removeData(a,"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[H]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===
|
||||
8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;var i=c.data(d,"handle");i&&i.apply(d,b);var j,o;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){j=d[e];o=d["on"+e]}}catch(p){}i=c.nodeName(d,"a")&&e==="click";if(!f&&j&&!a.isDefaultPrevented()&&!i){this.triggered=true;try{d[e]()}catch(n){}}else if(o&&d["on"+e].apply(d,b)===false)a.result=false;this.triggered=false;if(!a.isPropagationStopped())(d=d.parentNode||d.ownerDocument)&&c.event.trigger(a,b,d,true)},
|
||||
handle:function(a){var b,d;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},
|
||||
props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[H])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||
|
||||
s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop||d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&
|
||||
a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;c.event.add(this,b.live,qa,b)},remove:function(a){if(a.length){var b=0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],qa)}},special:{}},beforeunload:{setup:function(a,
|
||||
b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=K();this[H]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=ba;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=
|
||||
ba;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=ba;this.stopPropagation()},isDefaultPrevented:aa,isPropagationStopped:aa,isImmediatePropagationStopped:aa};var Ba=function(a){for(var b=a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ca=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",
|
||||
mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ca:Ba,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ca:Ba)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return pa("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+
|
||||
d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return pa("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this,"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var ga=/textarea|input|select/i;function Da(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>
|
||||
-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ha(a,b){var d=a.target,f,e;if(!(!ga.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Da(d);if(e!==f){if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",e);if(d.type!=="select"&&(f!=null||e)){a.type="change";return c.event.trigger(a,b,this)}}}}c.event.special.change={filters:{focusout:ha,click:function(a){var b=a.target,d=b.type;if(d===
|
||||
"radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ha.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ha.call(this,a)},beforeactivate:function(a){a=a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Da(a))}},setup:function(a,b,d){for(var f in W)c.event.add(this,f+".specialChange."+d.guid,W[f]);return ga.test(this.nodeName)},
|
||||
remove:function(a,b){for(var d in W)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),W[d]);return ga.test(this.nodeName)}};var W=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,
|
||||
f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){thisObject=e;e=f;f=w}var j=b==="one"?c.proxy(e,function(o){c(this).unbind(o,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e,thisObject):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,
|
||||
b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||
|
||||
a)},live:function(a,b,d){if(c.isFunction(b)){d=b;b=w}c(this.context).bind(ra(a,this.selector),{data:b,selector:this.selector,live:a},d);return this},die:function(a,b){c(this.context).unbind(ra(a,this.selector),b?{guid:b.guid+this.selector+a}:null);return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){c.fn[b]=function(d){return d?
|
||||
this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",k,m=0;g[m];m++){k=g[m];if(k.nodeType===3||k.nodeType===4)h+=k.nodeValue;else if(k.nodeType!==8)h+=a(k.childNodes)}return h}function b(g,h,k,m,r,q){r=0;for(var v=m.length;r<v;r++){var u=m[r];if(u){u=u[g];for(var y=false;u;){if(u.sizcache===
|
||||
k){y=m[u.sizset];break}if(u.nodeType===1&&!q){u.sizcache=k;u.sizset=r}if(u.nodeName.toLowerCase()===h){y=u;break}u=u[g]}m[r]=y}}}function d(g,h,k,m,r,q){r=0;for(var v=m.length;r<v;r++){var u=m[r];if(u){u=u[g];for(var y=false;u;){if(u.sizcache===k){y=m[u.sizset];break}if(u.nodeType===1){if(!q){u.sizcache=k;u.sizset=r}if(typeof h!=="string"){if(u===h){y=true;break}}else if(p.filter(h,[u]).length>0){y=u;break}}u=u[g]}m[r]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
||||
e=0,i=Object.prototype.toString,j=false,o=true;[0,0].sort(function(){o=false;return 0});var p=function(g,h,k,m){k=k||[];var r=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return k;for(var q=[],v,u,y,S,I=true,N=x(h),J=g;(f.exec(""),v=f.exec(J))!==null;){J=v[3];q.push(v[1]);if(v[2]){S=v[3];break}}if(q.length>1&&t.exec(g))if(q.length===2&&n.relative[q[0]])u=ia(q[0]+q[1],h);else for(u=n.relative[q[0]]?[h]:p(q.shift(),h);q.length;){g=q.shift();if(n.relative[g])g+=q.shift();
|
||||
u=ia(g,u)}else{if(!m&&q.length>1&&h.nodeType===9&&!N&&n.match.ID.test(q[0])&&!n.match.ID.test(q[q.length-1])){v=p.find(q.shift(),h,N);h=v.expr?p.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:q.pop(),set:B(m)}:p.find(q.pop(),q.length===1&&(q[0]==="~"||q[0]==="+")&&h.parentNode?h.parentNode:h,N);u=v.expr?p.filter(v.expr,v.set):v.set;if(q.length>0)y=B(u);else I=false;for(;q.length;){var E=q.pop();v=E;if(n.relative[E])v=q.pop();else E="";if(v==null)v=h;n.relative[E](y,v,N)}}else y=[]}y||(y=u);if(!y)throw"Syntax error, unrecognized expression: "+
|
||||
(E||g);if(i.call(y)==="[object Array]")if(I)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&F(h,y[g])))k.push(u[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&k.push(u[g]);else k.push.apply(k,y);else B(y,k);if(S){p(S,r,k,m);p.uniqueSort(k)}return k};p.uniqueSort=function(g){if(D){j=o;g.sort(D);if(j)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};p.matches=function(g,h){return p(g,null,null,h)};p.find=function(g,h,k){var m,r;if(!g)return[];
|
||||
for(var q=0,v=n.order.length;q<v;q++){var u=n.order[q];if(r=n.leftMatch[u].exec(g)){var y=r[1];r.splice(1,1);if(y.substr(y.length-1)!=="\\"){r[1]=(r[1]||"").replace(/\\/g,"");m=n.find[u](r,h,k);if(m!=null){g=g.replace(n.match[u],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};p.filter=function(g,h,k,m){for(var r=g,q=[],v=h,u,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var I in n.filter)if((u=n.leftMatch[I].exec(g))!=null&&u[2]){var N=n.filter[I],J,E;E=u[1];y=false;u.splice(1,1);if(E.substr(E.length-
|
||||
1)!=="\\"){if(v===q)q=[];if(n.preFilter[I])if(u=n.preFilter[I](u,v,k,q,m,S)){if(u===true)continue}else y=J=true;if(u)for(var X=0;(E=v[X])!=null;X++)if(E){J=N(E,u,X,v);var Ea=m^!!J;if(k&&J!=null)if(Ea)y=true;else v[X]=false;else if(Ea){q.push(E);y=true}}if(J!==w){k||(v=q);g=g.replace(n.match[I],"");if(!y)return[];break}}}if(g===r)if(y==null)throw"Syntax error, unrecognized expression: "+g;else break;r=g}return v};var n=p.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/,
|
||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}},
|
||||
relative:{"+":function(g,h){var k=typeof h==="string",m=k&&!/\W/.test(h);k=k&&!m;if(m)h=h.toLowerCase();m=0;for(var r=g.length,q;m<r;m++)if(q=g[m]){for(;(q=q.previousSibling)&&q.nodeType!==1;);g[m]=k||q&&q.nodeName.toLowerCase()===h?q||false:q===h}k&&p.filter(h,g,true)},">":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,r=g.length;m<r;m++){var q=g[m];if(q){k=q.parentNode;g[m]=k.nodeName.toLowerCase()===h?k:false}}}else{m=0;for(r=g.length;m<r;m++)if(q=g[m])g[m]=
|
||||
k?q.parentNode:q.parentNode===h;k&&p.filter(h,g,true)}},"":function(g,h,k){var m=e++,r=d;if(typeof h==="string"&&!/\W/.test(h)){var q=h=h.toLowerCase();r=b}r("parentNode",h,m,g,q,k)},"~":function(g,h,k){var m=e++,r=d;if(typeof h==="string"&&!/\W/.test(h)){var q=h=h.toLowerCase();r=b}r("previousSibling",h,m,g,q,k)}},find:{ID:function(g,h,k){if(typeof h.getElementById!=="undefined"&&!k)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var k=[];
|
||||
h=h.getElementsByName(g[1]);for(var m=0,r=h.length;m<r;m++)h[m].getAttribute("name")===g[1]&&k.push(h[m]);return k.length===0?null:k}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,k,m,r,q){g=" "+g[1].replace(/\\/g,"")+" ";if(q)return g;q=0;for(var v;(v=h[q])!=null;q++)if(v)if(r^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))k||m.push(v);else if(k)h[q]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
|
||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,m,r,q){h=g[1].replace(/\\/g,"");if(!q&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,m,r){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=p(g[3],null,null,h);else{g=p.filter(g[3],h,k,true^r);k||m.push.apply(m,
|
||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!p(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
|
||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
|
||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,k,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return h<k[3]-0},gt:function(g,h,k){return h>k[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,m){var r=h[1],q=n.filters[r];if(q)return q(g,k,h,m);else if(r==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(r==="not"){h=
|
||||
h[3];k=0;for(m=h.length;k<m;k++)if(h[k]===g)return false;return true}else throw"Syntax error, unrecognized expression: "+r;},CHILD:function(g,h){var k=h[1],m=g;switch(k){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(k==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":k=h[2];var r=h[3];if(k===1&&r===0)return true;h=h[0];var q=g.parentNode;if(q&&(q.sizcache!==h||!g.nodeIndex)){var v=0;for(m=q.firstChild;m;m=
|
||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;q.sizcache=h}g=g.nodeIndex-r;return k===0?g===0:g%k===0&&g/k>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=n.attrHandle[k]?n.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
|
||||
"="?k===h:m==="*="?k.indexOf(h)>=0:m==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:m==="!="?k!==h:m==="^="?k.indexOf(h)===0:m==="$="?k.substr(k.length-h.length)===h:m==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,m){var r=n.setFilters[h[2]];if(r)return r(g,k,h,m)}}},t=n.match.POS;for(var z in n.match){n.match[z]=new RegExp(n.match[z].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[z]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[z].source.replace(/\\(\d+)/g,function(g,
|
||||
h){return"\\"+(h-0+1)}))}var B=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){B=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,m=g.length;k<m;k++)h.push(g[k]);else for(k=0;g[k];k++)h.push(g[k]);return h}}var D;if(s.documentElement.compareDocumentPosition)D=function(g,h){if(!g.compareDocumentPosition||
|
||||
!h.compareDocumentPosition){if(g==h)j=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)j=true;return g};else if("sourceIndex"in s.documentElement)D=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)j=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)j=true;return g};else if(s.createRange)D=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)j=true;return g.ownerDocument?-1:1}var k=g.ownerDocument.createRange(),m=
|
||||
h.ownerDocument.createRange();k.setStart(g,0);k.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=k.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)j=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var k=s.documentElement;k.insertBefore(g,k.firstChild);if(s.getElementById(h)){n.find.ID=function(m,r,q){if(typeof r.getElementById!=="undefined"&&!q)return(r=r.getElementById(m[1]))?r.id===m[1]||typeof r.getAttributeNode!=="undefined"&&
|
||||
r.getAttributeNode("id").nodeValue===m[1]?[r]:w:[]};n.filter.ID=function(m,r){var q=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&q&&q.nodeValue===r}}k.removeChild(g);k=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;k[m];m++)k[m].nodeType===1&&h.push(k[m]);k=h}return k};g.innerHTML="<a href='#'></a>";
|
||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=p,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){p=function(m,r,q,v){r=r||s;if(!v&&r.nodeType===9&&!x(r))try{return B(r.querySelectorAll(m),q)}catch(u){}return g(m,r,q,v)};for(var k in g)p[k]=g[k];h=null}}();
|
||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,k,m){if(typeof k.getElementsByClassName!=="undefined"&&!m)return k.getElementsByClassName(h[1])};g=null}}})();var F=s.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,
|
||||
h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ia=function(g,h){var k=[],m="",r;for(h=h.nodeType?[h]:h;r=n.match.PSEUDO.exec(g);){m+=r[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;r=0;for(var q=h.length;r<q;r++)p(g,h[r],k);return p.filter(m,k)};c.find=p;c.expr=p.selectors;c.expr[":"]=c.expr.filters;c.unique=p.uniqueSort;c.getText=a;c.isXMLDoc=x;c.contains=F})();var ab=/Until$/,bb=/^(?:parents|prevUntil|prevAll)/,
|
||||
cb=/,/;R=Array.prototype.slice;var Fa=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,i){return!!b.call(e,i,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Pa.test(b))return c.filter(b,f,!d);else b=c.filter(b,a)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length;
|
||||
c.find(a,this[f],b);if(f>0)for(var i=d;i<b.length;i++)for(var j=0;j<d;j++)if(b[j]===b[i]){b.splice(i--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Fa(this,a,false),"not",a)},filter:function(a){return this.pushStack(Fa(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i=
|
||||
{},j;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){j=a[e];i[j]||(i[j]=c.expr.match.POS.test(j)?c(j,b||this.context):j)}for(;f&&f.ownerDocument&&f!==b;){for(j in i){e=i[j];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var p=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,t){for(;t&&t.ownerDocument&&t!==b;){if(p?p.index(t)>-1:c(t).is(a))return t;t=t.parentNode}return null})},index:function(a){if(!a||typeof a===
|
||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(sa(a[0])||sa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
|
||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
|
||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);ab.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||cb.test(f))&&bb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||!c(a).is(d));){a.nodeType===
|
||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ga=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,db=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/<tbody/i,gb=/<|&\w+;/,hb=function(a,b,d){return eb.test(d)?a:b+"></"+d+">"},G={option:[1,"<select multiple='multiple'>","</select>"],
|
||||
legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};G.optgroup=G.option;G.tbody=G.tfoot=G.colgroup=G.caption=G.thead;G.th=G.td;if(!c.support.htmlSerialize)G._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);
|
||||
return d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.getText(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
|
||||
wrapInner:function(a){return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&
|
||||
this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,
|
||||
"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ga,"").replace(Y,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ta(this,b);ta(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===
|
||||
1?this[0].innerHTML.replace(Ga,""):null;else if(typeof a==="string"&&!/<script/i.test(a)&&(c.support.leadingWhitespace||!Y.test(a))&&!G[(Ha.exec(a)||["",""])[1].toLowerCase()])try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){T(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}else c.isFunction(a)?this.each(function(e){var i=c(this),j=i.html();i.empty().append(function(){return a.call(this,e,j)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&
|
||||
this[0].parentNode){c.isFunction(a)||(a=c(a).detach());return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(t){return c.nodeName(t,"table")?t.getElementsByTagName("tbody")[0]||t.appendChild(t.ownerDocument.createElement("tbody")):t}var e,i,j=a[0],o=[];if(c.isFunction(j))return this.each(function(t){var z=
|
||||
c(this);a[0]=j.call(this,t,b?z.html():w);return z.domManip(a,b,d)});if(this[0]){e=a[0]&&a[0].parentNode&&a[0].parentNode.nodeType===11?{fragment:a[0].parentNode}:ua(a,this,o);if(i=e.fragment.firstChild){b=b&&c.nodeName(i,"tr");for(var p=0,n=this.length;p<n;p++)d.call(b?f(this[p],i):this[p],e.cacheable||this.length>1||p>0?e.fragment.cloneNode(true):e.fragment)}o&&c.each(o,La)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},
|
||||
function(a,b){c.fn[a]=function(d){var f=[];d=c(d);for(var e=0,i=d.length;e<i;e++){var j=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),j);f=f.concat(j)}return this.pushStack(f,a,d.selector)}});c.each({remove:function(a,b){if(!a||c.filter(a,[this]).length){if(!b&&this.nodeType===1){T(this.getElementsByTagName("*"));T([this])}this.parentNode&&this.parentNode.removeChild(this)}},empty:function(){for(this.nodeType===1&&T(this.getElementsByTagName("*"));this.firstChild;)this.removeChild(this.firstChild)}},
|
||||
function(a,b){c.fn[a]=function(){return this.each(b,arguments)}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;var e=[];c.each(a,function(i,j){if(typeof j==="number")j+="";if(j){if(typeof j==="string"&&!gb.test(j))j=b.createTextNode(j);else if(typeof j==="string"){j=j.replace(db,hb);var o=(Ha.exec(j)||["",""])[1].toLowerCase(),p=G[o]||G._default,n=p[0];i=b.createElement("div");for(i.innerHTML=p[1]+j+p[2];n--;)i=i.lastChild;
|
||||
if(!c.support.tbody){n=fb.test(j);o=o==="table"&&!n?i.firstChild&&i.firstChild.childNodes:p[1]==="<table>"&&!n?i.childNodes:[];for(p=o.length-1;p>=0;--p)c.nodeName(o[p],"tbody")&&!o[p].childNodes.length&&o[p].parentNode.removeChild(o[p])}!c.support.leadingWhitespace&&Y.test(j)&&i.insertBefore(b.createTextNode(Y.exec(j)[0]),i.firstChild);j=c.makeArray(i.childNodes)}if(j.nodeType)e.push(j);else e=c.merge(e,j)}});if(d)for(a=0;e[a];a++)if(f&&c.nodeName(e[a],"script")&&(!e[a].type||e[a].type.toLowerCase()===
|
||||
"text/javascript"))f.push(e[a].parentNode?e[a].parentNode.removeChild(e[a]):e[a]);else{e[a].nodeType===1&&e.splice.apply(e,[a+1,0].concat(c.makeArray(e[a].getElementsByTagName("script"))));d.appendChild(e[a])}return e}});var ib=/z-?index|font-?weight|opacity|zoom|line-?height/i,Ia=/alpha\([^)]*\)/,Ja=/opacity=([^)]*)/,ja=/float/i,ka=/-([a-z])/ig,jb=/([A-Z])/g,kb=/^-?\d+(?:px)?$/i,lb=/^-?\d/,mb={position:"absolute",visibility:"hidden",display:"block"},nb=["Left","Right"],ob=["Top","Bottom"],pb=s.defaultView&&
|
||||
s.defaultView.getComputedStyle,Ka=c.support.cssFloat?"cssFloat":"styleFloat",la=function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return $(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!ib.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""===
|
||||
"NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=Ia.test(a)?a.replace(Ia,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Ja.exec(f.filter)[1])/100+"":""}if(ja.test(b))b=Ka;b=b.replace(ka,la);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,i=b==="width"?nb:ob;function j(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(i,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=
|
||||
parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,"border"+this+"Width",true))||0})}a.offsetWidth!==0?j():c.swap(a,mb,j);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Ja.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ja.test(b))b=Ka;if(!d&&e&&e[b])f=e[b];else if(pb){if(ja.test(b))b="float";b=b.replace(jb,"-$1").toLowerCase();e=
|
||||
a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ka,la);f=a.currentStyle[b]||a.currentStyle[d];if(!kb.test(f)&&lb.test(f)){b=e.left;var i=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=i}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=
|
||||
f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var qb=K(),rb=/<script(.|\s)*?\/script>/gi,sb=/select|textarea/i,tb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,O=/=\?(&|$)/,ma=/\?/,ub=/(\?|&)_=.*?(&|$)/,vb=/^(\w+:)?\/\/([^\/?#]+)/,
|
||||
wb=/%20/g;c.fn.extend({_load:c.fn.load,load:function(a,b,d){if(typeof a!=="string")return this._load(a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}c.ajax({url:a,type:f,dataType:"html",data:b,context:this,complete:function(i,j){if(j==="success"||j==="notmodified")this.html(e?c("<div />").append(i.responseText.replace(rb,
|
||||
"")).find(e):i.responseText);d&&this.each(d,[i.responseText,j,i])}});return this},serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||sb.test(this.nodeName)||tb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});
|
||||
c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},
|
||||
ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href,global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",
|
||||
text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&&e.success.call(p,o,j,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(p,x,j);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(r,q){(e.context?c(e.context):c.event).trigger(r,q)}var e=c.extend(true,{},c.ajaxSettings,a),i,j,o,p=e.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,
|
||||
e.traditional);if(e.dataType==="jsonp"){if(n==="GET")O.test(e.url)||(e.url+=(ma.test(e.url)?"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!O.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&O.test(e.data)||O.test(e.url))){i=e.jsonpCallback||"jsonp"+qb++;if(e.data)e.data=(e.data+"").replace(O,"="+i+"$1");e.url=e.url.replace(O,"="+i+"$1");e.dataType="script";A[i]=A[i]||function(r){o=r;b();d();A[i]=w;try{delete A[i]}catch(q){}B&&
|
||||
B.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache===false&&n==="GET"){var t=K(),z=e.url.replace(ub,"$1_="+t+"$2");e.url=z+(z===e.url?(ma.test(e.url)?"&":"?")+"_="+t:"")}if(e.data&&n==="GET")e.url+=(ma.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");t=(t=vb.exec(e.url))&&(t[1]&&t[1]!==location.protocol||t[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&t){var B=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");
|
||||
C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!i){var D=false;C.onload=C.onreadystatechange=function(){if(!D&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){D=true;b();d();C.onload=C.onreadystatechange=null;B&&C.parentNode&&B.removeChild(C)}}}B.insertBefore(C,B.firstChild);return w}var F=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",
|
||||
e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since",c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}t||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ia){}if(e.beforeSend&&e.beforeSend.call(p,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",
|
||||
[x,e]);var g=x.onreadystatechange=function(r){if(!x||x.readyState===0){F||d();F=true;if(x)x.onreadystatechange=c.noop}else if(!F&&x&&(x.readyState===4||r==="timeout")){F=true;x.onreadystatechange=c.noop;j=r==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";if(j==="success")try{o=c.httpData(x,e.dataType,e)}catch(q){j="parsererror"}if(j==="success"||j==="notmodified")i||b();else c.handleError(e,x,j);d();r==="timeout"&&x.abort();if(e.async)x=
|
||||
null}};try{var h=x.abort;x.abort=function(){if(x){h.call(x);if(x)x.readyState=0}g()}}catch(k){}e.async&&e.timeout>0&&setTimeout(function(){x&&!F&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||A,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol===
|
||||
"file:"||a.status>=200&&a.status<300||a.status===304||a.status===1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;if(e&&a.documentElement.nodeName==="parsererror")throw"parsererror";if(d&&
|
||||
d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b==="json"||!b&&f.indexOf("json")>=0)if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))a=A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+a))();else throw"Invalid JSON: "+a;else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(e,i){i=
|
||||
c.isFunction(i)?i():i;f[f.length]=encodeURIComponent(e)+"="+encodeURIComponent(i)}var f=[];if(b===w)b=c.ajaxSettings.traditional;c.isArray(a)||a.jquery?c.each(a,function(){d(this.name,this.value)}):c.each(a,function e(i,j){if(c.isArray(j))c.each(j,function(o,p){b?d(i,p):e(i+"["+(typeof p==="object"||c.isArray(p)?o:"")+"]",p)});else!b&&j!=null&&typeof j==="object"?c.each(j,function(o,p){e(i+"["+o+"]",p)}):d(i,j)});return f.join("&").replace(wb,"+")}});var na={},xb=/toggle|show|hide/,yb=/^([+-]=)?([\d+-.]+)(.*)$/,
|
||||
Z,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a!=null)return this.animate(L("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(na[d])f=na[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();
|
||||
na[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a!=null)return this.animate(L("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a],"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&
|
||||
c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(L("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)},animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var i=c.extend({},e),j,o=this.nodeType===1&&c(this).is(":hidden"),
|
||||
p=this;for(j in a){var n=j.replace(ka,la);if(j!==n){a[n]=a[j];delete a[j];j=n}if(a[j]==="hide"&&o||a[j]==="show"&&!o)return i.complete.call(this);if((j==="height"||j==="width")&&this.style){i.display=c.css(this,"display");i.overflow=this.style.overflow}if(c.isArray(a[j])){(i.specialEasing=i.specialEasing||{})[j]=a[j][1];a[j]=a[j][0]}}if(i.overflow!=null)this.style.overflow="hidden";i.curAnim=c.extend({},a);c.each(a,function(t,z){var B=new c.fx(p,i,t);if(xb.test(z))B[z==="toggle"?o?"show":"hide":z](a);
|
||||
else{var C=yb.exec(z),D=B.cur(true)||0;if(C){z=parseFloat(C[2]);var F=C[3]||"px";if(F!=="px"){p.style[t]=(z||1)+F;D=(z||1)/B.cur(true)*D;p.style[t]=D+F}if(C[1])z=(C[1]==="-="?-1:1)*z+D;B.custom(D,z,F)}else B.custom(D,z,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]);this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:L("show",1),slideUp:L("hide",1),slideToggle:L("toggle",
|
||||
1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration==="number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,
|
||||
b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]||c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==
|
||||
null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(i){return e.step(i)}this.startTime=K();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start;this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!Z)Z=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop===
|
||||
"width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=K(),d=true;if(a||b>=this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=
|
||||
this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem,e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=
|
||||
c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length||c.fx.stop()},stop:function(){clearInterval(Z);Z=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=
|
||||
null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement?function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),
|
||||
f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b=this[0];if(!b||!b.ownerDocument)return null;if(a)return this.each(function(t){c.offset.setOffset(this,a,t)});if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=
|
||||
b,e=b.ownerDocument,i,j=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var p=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==j;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;i=e?e.getComputedStyle(b,null):b.currentStyle;p-=b.scrollTop;n-=b.scrollLeft;if(b===d){p+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){p+=parseFloat(i.borderTopWidth)||
|
||||
0;n+=parseFloat(i.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&i.overflow!=="visible"){p+=parseFloat(i.borderTopWidth)||0;n+=parseFloat(i.borderLeftWidth)||0}f=i}if(f.position==="relative"||f.position==="static"){p+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&&f.position==="fixed"){p+=Math.max(j.scrollTop,o.scrollTop);n+=Math.max(j.scrollLeft,o.scrollLeft)}return{top:p,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),
|
||||
d,f,e,i=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";a.insertBefore(b,a.firstChild);
|
||||
d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i;a.removeChild(b);c.offset.initialize=c.noop},
|
||||
bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),i=parseInt(c.curCSS(a,"top",true),10)||0,j=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a,d,e);d={top:b.top-e.top+i,left:b.left-
|
||||
e.left+j};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top-f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=
|
||||
this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],i;if(!e)return null;if(f!==w)return this.each(function(){if(i=wa(this))i.scrollTo(!a?f:c(i).scrollLeft(),a?f:c(i).scrollTop());else this[d]=f});else return(i=wa(e))?"pageXOffset"in i?i[a?"pageYOffset":"pageXOffset"]:c.support.boxModel&&i.document.documentElement[d]||i.document.body[d]:e[d]}});
|
||||
c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;return"scrollTo"in e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+
|
||||
b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window);
|
||||
Executable
+39
@@ -0,0 +1,39 @@
|
||||
/*=============================================================================
|
||||
Copyright 2002 William E. Kempf
|
||||
Distributed under the Boost Software License, Version 1.0. (See accompany-
|
||||
ing file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
=============================================================================*/
|
||||
|
||||
H1
|
||||
{
|
||||
FONT-SIZE: 200%;
|
||||
COLOR: #00008B;
|
||||
}
|
||||
H2
|
||||
{
|
||||
FONT-SIZE: 150%;
|
||||
}
|
||||
H3
|
||||
{
|
||||
FONT-SIZE: 125%;
|
||||
}
|
||||
H4
|
||||
{
|
||||
FONT-SIZE: 108%;
|
||||
}
|
||||
/*
|
||||
BODY
|
||||
{
|
||||
FONT-SIZE: 100%;
|
||||
BACKGROUND-COLOR: #ffffff;
|
||||
COLOR: #000000;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
PRE
|
||||
{
|
||||
MARGIN-LEFT: 2em;
|
||||
FONT-FAMILY: Courier,
|
||||
monospace;
|
||||
}
|
||||
*/
|
||||
Executable
+92
@@ -0,0 +1,92 @@
|
||||
|
||||
body
|
||||
{
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
pre
|
||||
{
|
||||
border-right: gray 1pt solid;
|
||||
border-top: gray 1pt solid;
|
||||
border-left: gray 1pt solid;
|
||||
border-bottom: gray 1pt solid;
|
||||
margin-left: 0pt;
|
||||
background-color: #EEEEEE;
|
||||
font-size: smaller;
|
||||
}
|
||||
|
||||
.button
|
||||
{
|
||||
color : black;
|
||||
background-color : #FFFFFF;
|
||||
border-radius: 0px;
|
||||
border: outset 3px #d6d6d6;
|
||||
text-decoration : none;
|
||||
outline:none;
|
||||
}
|
||||
|
||||
.fs
|
||||
{
|
||||
font-family: courier;
|
||||
font-size: 11pt;
|
||||
font-weight: bold;
|
||||
color: maroon;
|
||||
}
|
||||
|
||||
.code_string
|
||||
{
|
||||
font-family: courier;
|
||||
font-size: 11pt;
|
||||
font-weight: bold;
|
||||
color: #bc8f8f;
|
||||
}
|
||||
|
||||
.code
|
||||
{
|
||||
/*
|
||||
top: 0;
|
||||
border-style: inset;
|
||||
margin-top: 5pt;
|
||||
margin-bottom: 5pt;
|
||||
margin-left: 5pt;
|
||||
margin-right: 5pt;
|
||||
border-width: 2px 2px 2px 2px ;
|
||||
*/
|
||||
font-family: courier;
|
||||
font-size: 11pt;
|
||||
font-weight: bold;
|
||||
color: #228b22;
|
||||
}
|
||||
|
||||
.byte
|
||||
{
|
||||
border-right: gray 1pt solid;
|
||||
border-top: gray 1pt solid;
|
||||
border-left: gray 1pt solid;
|
||||
border-bottom: gray 1pt solid;
|
||||
margin-left: 2pt;
|
||||
margin-right: 2pt;
|
||||
font-family: courier;
|
||||
font-size: 11pt;
|
||||
font-weight: bold;
|
||||
color: #000000;
|
||||
background-color: #eeeeee;
|
||||
}
|
||||
|
||||
#pre
|
||||
{
|
||||
border-right: gray 1pt solid;
|
||||
border-top: gray 1pt solid;
|
||||
border-left: gray 1pt solid;
|
||||
border-bottom: gray 1pt solid;
|
||||
margin-left: 1pt;
|
||||
margin-right: 1pt;
|
||||
background-color: #EEEEEE;
|
||||
}
|
||||
|
||||
/*
|
||||
(C) Copyright 2011 François Mauger.
|
||||
Use, modification and distribution is subject to the Boost Software
|
||||
License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
http://www.boost.org/LICENSE_1_0.txt)
|
||||
*/
|
||||
Executable
+2348
File diff suppressed because it is too large
Load Diff
@@ -151,10 +151,7 @@ private:
|
||||
public:
|
||||
object_id_type(): t(0) {};
|
||||
// note: presumes that size_t >= unsigned int.
|
||||
// use explicit cast to silence useless warning
|
||||
explicit object_id_type(const std::size_t & t_) : t(static_cast<base_type>(t_)){
|
||||
// make quadriple sure that we haven't lost any real integer
|
||||
// precision
|
||||
explicit object_id_type(const std::size_t & t_) : t(t_){
|
||||
BOOST_ASSERT(t_ <= boost::integer_traits<base_type>::const_max);
|
||||
}
|
||||
object_id_type(const object_id_type & t_) :
|
||||
|
||||
@@ -102,32 +102,20 @@ protected:
|
||||
}
|
||||
void load_override(class_id_type & t){
|
||||
library_version_type lvt = this->get_library_version();
|
||||
/*
|
||||
* library versions:
|
||||
* boost 1.39 -> 5
|
||||
* boost 1.43 -> 7
|
||||
* boost 1.47 -> 9
|
||||
*
|
||||
*
|
||||
* 1) in boost 1.43 and inferior, class_id_type is always a 16bit value, with no check on the library version
|
||||
* --> this means all archives with version v <= 7 are written with a 16bit class_id_type
|
||||
* 2) in boost 1.44 this load_override has disappeared (and thus boost 1.44 is not backward compatible at all !!)
|
||||
* 3) recent boosts reintroduced load_override with a test on the version :
|
||||
* - v > 7 : this->detail_common_iarchive::load_override(t, version)
|
||||
* - v > 6 : 16bit
|
||||
* - other : 32bit
|
||||
* --> which is obviously incorrect, see point 1
|
||||
*
|
||||
* the fix here decodes class_id_type on 16bit for all v <= 7, which seems to be the correct behaviour ...
|
||||
*/
|
||||
if(boost::archive::library_version_type(7) < lvt){
|
||||
this->detail_common_iarchive::load_override(t);
|
||||
}
|
||||
else{
|
||||
else
|
||||
if(boost::archive::library_version_type(6) < lvt){
|
||||
int_least16_t x=0;
|
||||
* this->This() >> x;
|
||||
t = boost::archive::class_id_type(x);
|
||||
}
|
||||
else{
|
||||
int x=0;
|
||||
* this->This() >> x;
|
||||
t = boost::archive::class_id_type(x);
|
||||
}
|
||||
}
|
||||
void load_override(class_id_reference_type & t){
|
||||
load_override(static_cast<class_id_type &>(t));
|
||||
|
||||
@@ -63,10 +63,10 @@ public:
|
||||
};
|
||||
|
||||
template<>
|
||||
class BOOST_WARCHIVE_DECL codecvt_null<wchar_t> :
|
||||
class BOOST_SYMBOL_VISIBLE codecvt_null<wchar_t> :
|
||||
public std::codecvt<wchar_t, char, std::mbstate_t>
|
||||
{
|
||||
virtual std::codecvt_base::result
|
||||
virtual BOOST_WARCHIVE_DECL std::codecvt_base::result
|
||||
do_out(
|
||||
std::mbstate_t & state,
|
||||
const wchar_t * first1,
|
||||
@@ -76,7 +76,7 @@ class BOOST_WARCHIVE_DECL codecvt_null<wchar_t> :
|
||||
char * last2,
|
||||
char * & next2
|
||||
) const;
|
||||
virtual std::codecvt_base::result
|
||||
virtual BOOST_WARCHIVE_DECL std::codecvt_base::result
|
||||
do_in(
|
||||
std::mbstate_t & state,
|
||||
const char * first1,
|
||||
@@ -96,7 +96,7 @@ public:
|
||||
explicit codecvt_null(std::size_t no_locale_manage = 0) :
|
||||
std::codecvt<wchar_t, char, std::mbstate_t>(no_locale_manage)
|
||||
{}
|
||||
//virtual ~codecvt_null(){};
|
||||
virtual ~codecvt_null(){};
|
||||
};
|
||||
|
||||
} // namespace archive
|
||||
|
||||
@@ -35,12 +35,11 @@ class extended_type_info;
|
||||
|
||||
// note: referred to as Curiously Recurring Template Patter (CRTP)
|
||||
template<class Archive>
|
||||
class BOOST_SYMBOL_VISIBLE common_iarchive :
|
||||
class BOOST_SYMBOL_VISIBLE common_iarchive :
|
||||
public basic_iarchive,
|
||||
public interface_iarchive<Archive>
|
||||
{
|
||||
friend class interface_iarchive<Archive>;
|
||||
friend class basic_iarchive;
|
||||
private:
|
||||
virtual void vload(version_type & t){
|
||||
* this->This() >> t;
|
||||
|
||||
@@ -38,7 +38,6 @@ class BOOST_SYMBOL_VISIBLE common_oarchive :
|
||||
public interface_oarchive<Archive>
|
||||
{
|
||||
friend class interface_oarchive<Archive>;
|
||||
friend class basic_oarchive;
|
||||
private:
|
||||
virtual void vsave(const version_type t){
|
||||
* this->This() << t;
|
||||
|
||||
@@ -57,10 +57,11 @@ namespace std{
|
||||
|
||||
#include <boost/serialization/assume_abstract.hpp>
|
||||
|
||||
#if !defined(BOOST_MSVC) && \
|
||||
(BOOST_WORKAROUND(__IBMCPP__, < 1210) || \
|
||||
defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590))
|
||||
#define DONT_USE_HAS_NEW_OPERATOR 1
|
||||
#if BOOST_WORKAROUND(__IBMCPP__, < 1210) \
|
||||
|| ( \
|
||||
defined(__SUNPRO_CC) && (__SUNPRO_CC < 0x590) \
|
||||
)
|
||||
#define DONT_USE_HAS_NEW_OPERATOR 1
|
||||
#else
|
||||
#define DONT_USE_HAS_NEW_OPERATOR 0
|
||||
#endif
|
||||
@@ -89,8 +90,6 @@ namespace std{
|
||||
#include <boost/archive/detail/archive_serializer_map.hpp>
|
||||
#include <boost/archive/detail/check.hpp>
|
||||
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
namespace boost {
|
||||
|
||||
namespace serialization {
|
||||
@@ -123,7 +122,8 @@ private:
|
||||
virtual void destroy(/*const*/ void *address) const {
|
||||
boost::serialization::access::destroy(static_cast<T *>(address));
|
||||
}
|
||||
public:
|
||||
protected:
|
||||
// protected constructor since it's always created by singleton
|
||||
explicit iserializer() :
|
||||
basic_iserializer(
|
||||
boost::serialization::singleton<
|
||||
@@ -132,6 +132,7 @@ public:
|
||||
>::get_const_instance()
|
||||
)
|
||||
{}
|
||||
public:
|
||||
virtual BOOST_DLLEXPORT void load_object_data(
|
||||
basic_iarchive & ar,
|
||||
void *x,
|
||||
@@ -233,7 +234,7 @@ struct heap_allocation {
|
||||
// that the class might have class specific new with NO
|
||||
// class specific delete at all. Patches (compatible with
|
||||
// C++03) welcome!
|
||||
(operator delete)(t);
|
||||
delete t;
|
||||
}
|
||||
};
|
||||
struct doesnt_have_new_operator {
|
||||
@@ -242,7 +243,7 @@ struct heap_allocation {
|
||||
}
|
||||
static void invoke_delete(T * t) {
|
||||
// Note: I'm reliance upon automatic conversion from T * to void * here
|
||||
(operator delete)(t);
|
||||
delete t;
|
||||
}
|
||||
};
|
||||
static T * invoke_new() {
|
||||
@@ -305,7 +306,7 @@ private:
|
||||
void * x,
|
||||
const unsigned int file_version
|
||||
) const BOOST_USED;
|
||||
public:
|
||||
protected:
|
||||
// this should alway be a singleton so make the constructor protected
|
||||
pointer_iserializer();
|
||||
~pointer_iserializer();
|
||||
@@ -405,7 +406,7 @@ struct load_non_pointer_type {
|
||||
struct load_standard {
|
||||
template<class T>
|
||||
static void invoke(Archive &ar, const T & t){
|
||||
void * x = boost::addressof(const_cast<T &>(t));
|
||||
void * x = & const_cast<T &>(t);
|
||||
ar.load_object(
|
||||
x,
|
||||
boost::serialization::singleton<
|
||||
@@ -483,7 +484,7 @@ struct load_pointer_type {
|
||||
};
|
||||
|
||||
template<class T>
|
||||
static const basic_pointer_iserializer * register_type(Archive &ar, const T* const /*t*/){
|
||||
static const basic_pointer_iserializer * register_type(Archive &ar, const T & /*t*/){
|
||||
// there should never be any need to load an abstract polymorphic
|
||||
// class pointer. Inhibiting code generation for this
|
||||
// permits abstract base classes to be used - note: exception
|
||||
@@ -522,7 +523,7 @@ struct load_pointer_type {
|
||||
}
|
||||
|
||||
template<class T>
|
||||
static void check_load(T * const /* t */){
|
||||
static void check_load(T & /* t */){
|
||||
check_pointer_level< T >();
|
||||
check_pointer_tracking< T >();
|
||||
}
|
||||
@@ -536,8 +537,8 @@ struct load_pointer_type {
|
||||
|
||||
template<class Tptr>
|
||||
static void invoke(Archive & ar, Tptr & t){
|
||||
check_load(t);
|
||||
const basic_pointer_iserializer * bpis_ptr = register_type(ar, t);
|
||||
check_load(*t);
|
||||
const basic_pointer_iserializer * bpis_ptr = register_type(ar, *t);
|
||||
const basic_pointer_iserializer * newbpis_ptr = ar.load_pointer(
|
||||
// note major hack here !!!
|
||||
// I tried every way to convert Tptr &t (where Tptr might
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include <cstddef> // NULL
|
||||
|
||||
#include <boost/config.hpp>
|
||||
|
||||
#include <boost/static_assert.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
|
||||
@@ -69,8 +68,6 @@
|
||||
#include <boost/archive/detail/archive_serializer_map.hpp>
|
||||
#include <boost/archive/detail/check.hpp>
|
||||
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
namespace boost {
|
||||
|
||||
namespace serialization {
|
||||
@@ -256,7 +253,7 @@ struct save_non_pointer_type {
|
||||
template<class T>
|
||||
static void invoke(Archive &ar, const T & t){
|
||||
ar.save_object(
|
||||
boost::addressof(t),
|
||||
& t,
|
||||
boost::serialization::singleton<
|
||||
oserializer<Archive, T>
|
||||
>::get_const_instance()
|
||||
@@ -264,8 +261,6 @@ struct save_non_pointer_type {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
// adds class information to the archive. This includes
|
||||
// serialization level and class version
|
||||
struct save_conditional {
|
||||
|
||||
@@ -13,17 +13,27 @@
|
||||
#error "wide char i/o not supported on this platform"
|
||||
#endif
|
||||
|
||||
// use boost's utf8 codecvt facet
|
||||
#include <boost/archive/detail/decl.hpp>
|
||||
#define BOOST_UTF8_BEGIN_NAMESPACE \
|
||||
namespace boost { namespace archive { namespace detail {
|
||||
#define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL
|
||||
#define BOOST_UTF8_END_NAMESPACE }}}
|
||||
// std::codecvt_utf8 doesn't seem to work for any versions of msvc
|
||||
|
||||
#include <boost/detail/utf8_codecvt_facet.hpp>
|
||||
#if defined(_MSC_VER) || defined(BOOST_NO_CXX11_HDR_CODECVT)
|
||||
// use boost's utf8 codecvt facet
|
||||
#include <boost/archive/detail/decl.hpp>
|
||||
#define BOOST_UTF8_BEGIN_NAMESPACE \
|
||||
namespace boost { namespace archive { namespace detail {
|
||||
#define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL
|
||||
#define BOOST_UTF8_END_NAMESPACE }}}
|
||||
|
||||
#undef BOOST_UTF8_END_NAMESPACE
|
||||
#undef BOOST_UTF8_DECL
|
||||
#undef BOOST_UTF8_BEGIN_NAMESPACE
|
||||
#include <boost/detail/utf8_codecvt_facet.hpp>
|
||||
|
||||
#undef BOOST_UTF8_END_NAMESPACE
|
||||
#undef BOOST_UTF8_DECL
|
||||
#undef BOOST_UTF8_BEGIN_NAMESPACE
|
||||
#else
|
||||
// use the standard vendor supplied facet
|
||||
#include <codecvt>
|
||||
namespace boost { namespace archive { namespace detail {
|
||||
typedef std::codecvt_utf8<wchar_t> utf8_codecvt_facet;
|
||||
} } }
|
||||
#endif
|
||||
|
||||
#endif // BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP
|
||||
|
||||
@@ -47,10 +47,10 @@ archive_serializer_map<Archive>::insert(const basic_serializer * bs){
|
||||
template<class Archive>
|
||||
BOOST_ARCHIVE_OR_WARCHIVE_DECL void
|
||||
archive_serializer_map<Archive>::erase(const basic_serializer * bs){
|
||||
// note: previously this conditional was a runtime assertion with
|
||||
// BOOST_ASSERT. We've changed it because we've discovered that at
|
||||
// least one platform is not guaranteed to destroy singletons in
|
||||
// reverse order of distruction.
|
||||
BOOST_ASSERT(! boost::serialization::singleton<
|
||||
extra_detail::map<Archive>
|
||||
>::is_destroyed()
|
||||
);
|
||||
if(boost::serialization::singleton<
|
||||
extra_detail::map<Archive>
|
||||
>::is_destroyed())
|
||||
|
||||
@@ -64,7 +64,7 @@ namespace archive {
|
||||
// XML grammar parsing
|
||||
|
||||
template<class CharType>
|
||||
class BOOST_SYMBOL_VISIBLE basic_xml_grammar {
|
||||
class basic_xml_grammar {
|
||||
public:
|
||||
// The following is not necessary according to DR45, but at least
|
||||
// one compiler (Compaq C++ 6.5 in strict_ansi mode) chokes otherwise.
|
||||
|
||||
@@ -161,13 +161,13 @@ xml_wiarchive_impl<Archive>::xml_wiarchive_impl(
|
||||
gimpl(new xml_wgrammar())
|
||||
{
|
||||
if(0 == (flags & no_codecvt)){
|
||||
archive_locale = std::locale(
|
||||
std::locale l = std::locale(
|
||||
is_.getloc(),
|
||||
new boost::archive::detail::utf8_codecvt_facet
|
||||
);
|
||||
// libstdc++ crashes without this
|
||||
is_.sync();
|
||||
is_.imbue(archive_locale);
|
||||
is_.imbue(l);
|
||||
}
|
||||
if(0 == (flags & no_header))
|
||||
init();
|
||||
|
||||
@@ -103,6 +103,7 @@ xml_woarchive_impl<Archive>::save(const char * s){
|
||||
template<class Archive>
|
||||
BOOST_WARCHIVE_DECL void
|
||||
xml_woarchive_impl<Archive>::save(const wchar_t * ws){
|
||||
os << ws;
|
||||
typedef iterators::xml_escape<const wchar_t *> xmbtows;
|
||||
std::copy(
|
||||
xmbtows(ws),
|
||||
@@ -125,12 +126,12 @@ xml_woarchive_impl<Archive>::xml_woarchive_impl(
|
||||
basic_xml_oarchive<Archive>(flags)
|
||||
{
|
||||
if(0 == (flags & no_codecvt)){
|
||||
archive_locale = std::locale(
|
||||
std::locale l = std::locale(
|
||||
os_.getloc(),
|
||||
new boost::archive::detail::utf8_codecvt_facet
|
||||
);
|
||||
os_.flush();
|
||||
os_.imbue(archive_locale);
|
||||
os_.imbue(l);
|
||||
}
|
||||
if(0 == (flags & no_header))
|
||||
this->init();
|
||||
@@ -142,7 +143,7 @@ xml_woarchive_impl<Archive>::~xml_woarchive_impl(){
|
||||
if(std::uncaught_exception())
|
||||
return;
|
||||
if(0 == (this->get_flags() & no_header)){
|
||||
os << L"</boost_serialization>";
|
||||
save(L"</boost_serialization>\n");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/detail/workaround.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
|
||||
#include <boost/serialization/throw_exception.hpp>
|
||||
@@ -44,11 +42,11 @@ class xml_unescape
|
||||
return unescape<xml_unescape<Base>, Base>::dereference();
|
||||
}
|
||||
public:
|
||||
// msvc versions prior to 14.0 crash with and ICE
|
||||
#if BOOST_WORKAROUND(BOOST_MSVC, < 1900)
|
||||
// workaround msvc 7.1 ICU crash
|
||||
#if defined(BOOST_MSVC)
|
||||
typedef int value_type;
|
||||
#else
|
||||
typedef typename super_t::value_type value_type;
|
||||
typedef typename this_t::value_type value_type;
|
||||
#endif
|
||||
|
||||
void drain_residue(const char *literal);
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_binary_iarchive :
|
||||
class polymorphic_binary_iarchive :
|
||||
public detail::polymorphic_iarchive_route<binary_iarchive>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -23,15 +23,13 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_binary_oarchive :
|
||||
public detail::polymorphic_oarchive_route<binary_oarchive>
|
||||
{
|
||||
public:
|
||||
polymorphic_binary_oarchive(std::ostream & os, unsigned int flags = 0) :
|
||||
detail::polymorphic_oarchive_route<binary_oarchive>(os, flags)
|
||||
{}
|
||||
~polymorphic_binary_oarchive(){}
|
||||
};
|
||||
typedef detail::polymorphic_oarchive_route<
|
||||
binary_oarchive_impl<
|
||||
binary_oarchive,
|
||||
std::ostream::char_type,
|
||||
std::ostream::traits_type
|
||||
>
|
||||
> polymorphic_binary_oarchive;
|
||||
|
||||
} // namespace archive
|
||||
} // namespace boost
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_text_iarchive :
|
||||
class polymorphic_text_iarchive :
|
||||
public detail::polymorphic_iarchive_route<text_iarchive>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -23,15 +23,9 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_text_oarchive :
|
||||
public detail::polymorphic_oarchive_route<text_oarchive>
|
||||
{
|
||||
public:
|
||||
polymorphic_text_oarchive(std::ostream & os, unsigned int flags = 0) :
|
||||
detail::polymorphic_oarchive_route<text_oarchive>(os, flags)
|
||||
{}
|
||||
~polymorphic_text_oarchive(){}
|
||||
};
|
||||
typedef detail::polymorphic_oarchive_route<
|
||||
text_oarchive_impl<text_oarchive>
|
||||
> polymorphic_text_oarchive;
|
||||
|
||||
} // namespace archive
|
||||
} // namespace boost
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_text_wiarchive :
|
||||
class polymorphic_text_wiarchive :
|
||||
public detail::polymorphic_iarchive_route<text_wiarchive>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -27,15 +27,9 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_text_woarchive :
|
||||
public detail::polymorphic_oarchive_route<text_woarchive>
|
||||
{
|
||||
public:
|
||||
polymorphic_text_woarchive(std::wostream & os, unsigned int flags = 0) :
|
||||
detail::polymorphic_oarchive_route<text_woarchive>(os, flags)
|
||||
{}
|
||||
~polymorphic_text_woarchive(){}
|
||||
};
|
||||
typedef detail::polymorphic_oarchive_route<
|
||||
text_woarchive_impl<text_woarchive>
|
||||
> polymorphic_text_woarchive;
|
||||
|
||||
} // namespace archive
|
||||
} // namespace boost
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_xml_iarchive :
|
||||
class polymorphic_xml_iarchive :
|
||||
public detail::polymorphic_iarchive_route<xml_iarchive>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -23,15 +23,10 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_xml_oarchive :
|
||||
public detail::polymorphic_oarchive_route<xml_oarchive>
|
||||
{
|
||||
public:
|
||||
polymorphic_xml_oarchive(std::ostream & os, unsigned int flags = 0) :
|
||||
detail::polymorphic_oarchive_route<xml_oarchive>(os, flags)
|
||||
{}
|
||||
~polymorphic_xml_oarchive(){}
|
||||
};
|
||||
typedef detail::polymorphic_oarchive_route<
|
||||
xml_oarchive_impl<xml_oarchive>
|
||||
> polymorphic_xml_oarchive;
|
||||
|
||||
} // namespace archive
|
||||
} // namespace boost
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_xml_wiarchive :
|
||||
class polymorphic_xml_wiarchive :
|
||||
public detail::polymorphic_iarchive_route<xml_wiarchive>
|
||||
{
|
||||
public:
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
#endif
|
||||
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_xml_woarchive.hpp
|
||||
// polymorphic_xml_oarchive.hpp
|
||||
|
||||
// (C) Copyright 2002 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
@@ -27,15 +27,9 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_xml_woarchive :
|
||||
public detail::polymorphic_oarchive_route<xml_woarchive>
|
||||
{
|
||||
public:
|
||||
polymorphic_xml_woarchive(std::wostream & os, unsigned int flags = 0) :
|
||||
detail::polymorphic_oarchive_route<xml_woarchive>(os, flags)
|
||||
{}
|
||||
~polymorphic_xml_woarchive(){}
|
||||
};
|
||||
typedef detail::polymorphic_oarchive_route<
|
||||
xml_woarchive_impl<xml_woarchive>
|
||||
> polymorphic_xml_woarchive;
|
||||
|
||||
} // namespace archive
|
||||
} // namespace boost
|
||||
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* \file portable_archive.hpp
|
||||
* \brief Needed for unit tests on portable archives.
|
||||
* \author christian.pfligersdorffer@gmx.at
|
||||
*
|
||||
* Header for testing portable archives with all of the serialization tests.
|
||||
* Before use copy all hpp files from this directory to your boost folder
|
||||
* boost_.../libs/serialization/test and run from there a visual studio
|
||||
* prompt with b2 oder bjam -sBOOST_ARCHIVE_LIST=portable_archive.hpp
|
||||
*
|
||||
* \note Since portable archives version 5.0 we depend on program_options!
|
||||
* Edit libs/serialization/test/Jamfile.v2 and change the requirements to
|
||||
* : requirements <source>/boost/filesystem <source>/boost/program_options
|
||||
*/
|
||||
/****************************************************************************/
|
||||
|
||||
#pragma warning( disable:4217 4127 4310 4244 4800 4267 )
|
||||
|
||||
// portable_archive test header
|
||||
// include output archive header
|
||||
#include "portable_oarchive.hpp"
|
||||
// set name of test output archive
|
||||
typedef eos::portable_oarchive test_oarchive;
|
||||
// set name of test output stream
|
||||
typedef std::ofstream test_ostream;
|
||||
|
||||
// repeat the above for input archive
|
||||
#include "portable_iarchive.hpp"
|
||||
typedef eos::portable_iarchive test_iarchive;
|
||||
typedef std::ifstream test_istream;
|
||||
|
||||
// define open mode for streams
|
||||
// binary archives should use std::ios_base::binary
|
||||
#define TEST_STREAM_FLAGS std::ios_base::binary
|
||||
+93
@@ -0,0 +1,93 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* \file portable_archive_exception.hpp
|
||||
* \brief Provides error handling and constants.
|
||||
* \author christian.pfligersdorffer@gmx.at
|
||||
*
|
||||
* Portable archive exceptions derive from the boost archive exceptions
|
||||
* and add failure causes specific to the portable binary usecase.
|
||||
*
|
||||
* Additionally this header serves as common include for important
|
||||
* constants or typedefs.
|
||||
*/
|
||||
/****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <boost/lexical_cast.hpp>
|
||||
#include <boost/archive/basic_archive.hpp>
|
||||
#include <boost/archive/archive_exception.hpp>
|
||||
|
||||
namespace eos {
|
||||
|
||||
// this value is written to the top of the stream
|
||||
const signed char magic_byte = 'e' | 'o' | 's';
|
||||
|
||||
// flag for fp serialization
|
||||
const unsigned no_infnan = 64;
|
||||
|
||||
// integral type for the archive version
|
||||
#if BOOST_VERSION < 104400
|
||||
typedef boost::archive::version_type archive_version_type;
|
||||
#else
|
||||
typedef boost::archive::library_version_type archive_version_type;
|
||||
#endif
|
||||
|
||||
// version of the linked boost archive library
|
||||
const archive_version_type archive_version(
|
||||
#if BOOST_VERSION < 103700
|
||||
boost::archive::ARCHIVE_VERSION()
|
||||
#else
|
||||
boost::archive::BOOST_ARCHIVE_VERSION()
|
||||
#endif
|
||||
);
|
||||
|
||||
/**
|
||||
* \brief Exception being thrown when serialization cannot proceed.
|
||||
*
|
||||
* There are several situations in which the portable archives may fail and
|
||||
* hence throw an exception:
|
||||
* -# deserialization of an integer value that exceeds the range of the type
|
||||
* -# (de)serialization of inf/nan through an archive with no_infnan flag set
|
||||
* -# deserialization of a denormalized value without the floating point type
|
||||
* supporting denormalized numbers
|
||||
*
|
||||
* Note that this exception will also be thrown if you mixed up your stream
|
||||
* position and accidentially interpret some value for size data (in this case
|
||||
* the reported size will be totally amiss most of the time).
|
||||
*/
|
||||
class portable_archive_exception : public boost::archive::archive_exception
|
||||
{
|
||||
std::string msg;
|
||||
|
||||
public:
|
||||
//! type size is not large enough for deserialized number
|
||||
portable_archive_exception(signed char invalid_size)
|
||||
: boost::archive::archive_exception(other_exception)
|
||||
, msg("requested integer size exceeds type size: ")
|
||||
{
|
||||
msg += boost::lexical_cast<std::string, int>(invalid_size);
|
||||
}
|
||||
|
||||
//! negative number in unsigned type
|
||||
portable_archive_exception()
|
||||
: boost::archive::archive_exception(other_exception)
|
||||
, msg("cannot read a negative number into an unsigned type")
|
||||
{
|
||||
}
|
||||
|
||||
//! serialization of inf, nan and denormals
|
||||
template <typename T>
|
||||
portable_archive_exception(const T& abnormal)
|
||||
: boost::archive::archive_exception(other_exception)
|
||||
, msg("serialization of illegal floating point value: ")
|
||||
{
|
||||
msg += boost::lexical_cast<std::string>(abnormal);
|
||||
}
|
||||
|
||||
//! override the base class function with our message
|
||||
const char* what() const throw() { return msg.c_str(); }
|
||||
~portable_archive_exception() throw() {}
|
||||
};
|
||||
|
||||
} // namespace eos
|
||||
Executable
+487
@@ -0,0 +1,487 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* \file portable_iarchive.hpp
|
||||
* \brief Provides an archive to read from portable binary files.
|
||||
* \author christian.pfligersdorffer@gmx.at
|
||||
* \version 5.1
|
||||
*
|
||||
* This pair of archives brings the advantages of binary streams to the cross
|
||||
* platform boost::serialization user. While being almost as fast as the native
|
||||
* binary archive it allows its files to be exchanged between cpu architectures
|
||||
* using different byte order (endianness). Speaking of speed: in serializing
|
||||
* numbers the (portable) binary approach is approximately ten times faster than
|
||||
* the ascii implementation (that is inherently portable)!
|
||||
*
|
||||
* Based on the portable archive example by Robert Ramey this implementation
|
||||
* uses Beman Dawes endian library and fp_utilities from Johan Rade, both being
|
||||
* in boost since 1.36. Prior to that you need to add them both (header only)
|
||||
* to your boost directory before you're able to use the archives provided.
|
||||
* Our archives have been tested successfully for boost versions 1.33 to 1.49!
|
||||
*
|
||||
* \note Correct behaviour has so far been confirmed using PowerPC-32, x86-32
|
||||
* and x86-64 platforms featuring different byte order. So there is a good
|
||||
* chance it will instantly work for your specific setup. If you encounter
|
||||
* problems or have suggestions please contact the author.
|
||||
*
|
||||
* \note Version 5.1 is now compatible with boost up to version 1.59. Thanks to
|
||||
* ecotax for pointing to the issue with shared_ptr_helper.
|
||||
*
|
||||
* \note Version 5.0 is now compatible with boost up to version 1.49 and enables
|
||||
* serialization of std::wstring by converting it to/from utf8 (thanks to
|
||||
* Arash Abghari for this suggestion). With that all unit tests from the
|
||||
* serialization library pass again with the notable exception of user
|
||||
* defined primitive types. Those are not supported and as a result any
|
||||
* user defined type to be used with the portable archives are required
|
||||
* to be at least object_serializable.
|
||||
*
|
||||
* \note Version 4.2 maintains compatibility with the latest boost 1.45 and adds
|
||||
* serialization of special floating point values inf and NaN as proposed
|
||||
* by Francois Mauger.
|
||||
*
|
||||
* \note Version 4.1 makes the archives work together with boost 1.40 and 1.41.
|
||||
* Thanks to Francois Mauger for his suggestions.
|
||||
*
|
||||
* \note Version 4 removes one level of the inheritance hierarchy and directly
|
||||
* builds upon binary primitive and basic binary archive, thereby fixing
|
||||
* the last open issue regarding array serialization. Thanks to Robert
|
||||
* Ramey for the hint.
|
||||
*
|
||||
* \note A few fixes introduced in version 3.1 let the archives pass all of the
|
||||
* serialization tests. Thanks to Sergey Morozov for running the tests.
|
||||
* Wouter Bijlsma pointed out where to find the fp_utilities and endian
|
||||
* libraries headers inside the boost distribution. I would never have
|
||||
* found them so thank him it works out of the box since boost 1.36.
|
||||
*
|
||||
* \note With Version 3.0 the archives have been made portable across different
|
||||
* boost versions. For that purpose a header is added to the data that
|
||||
* supplies the underlying serialization library version. Backwards
|
||||
* compatibility is maintained by assuming library version boost 1.33 if
|
||||
* the iarchive is created using the no_header flag. Whether a header is
|
||||
* present or not can be guessed by peeking into the stream: the header's
|
||||
* first byte is the magic number 127 coinciding with 'e'|'o'|'s' :-)
|
||||
*
|
||||
* \note Version 2.1 removes several compiler warnings and enhances floating
|
||||
* point diagnostics to inform the user if some preconditions are violated
|
||||
* on his platform. We do not strive for the universally portable solution
|
||||
* in binary floating point serialization as desired by some boost users.
|
||||
* Instead we support only the most widely used IEEE 754 format and try to
|
||||
* detect when requirements are not met and hence our approach must fail.
|
||||
* Contributions we made by Johan Rade and Ákos Maróy.
|
||||
*
|
||||
* \note Version 2.0 fixes a serious bug that effectively transformed most
|
||||
* of negative integral values into positive values! For example the two
|
||||
* numbers -12 and 234 were stored in the same 8-bit pattern and later
|
||||
* always restored to 234. This was fixed in this version in a way that
|
||||
* does not change the interpretation of existing archives that did work
|
||||
* because there were no negative numbers. The other way round archives
|
||||
* created by version 2.0 and containing negative numbers will raise an
|
||||
* integer type size exception when reading it with version 1.0. Thanks
|
||||
* to Markus Frohnmaier for testing the archives and finding the bug.
|
||||
*
|
||||
* \copyright The boost software license applies.
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <istream>
|
||||
|
||||
// basic headers
|
||||
#include <boost/version.hpp>
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/archive/basic_binary_iprimitive.hpp>
|
||||
#include <boost/archive/basic_binary_iarchive.hpp>
|
||||
|
||||
#if BOOST_VERSION >= 103500 && BOOST_VERSION < 105600
|
||||
#include <boost/archive/shared_ptr_helper.hpp>
|
||||
#endif
|
||||
|
||||
// funny polymorphics
|
||||
#if BOOST_VERSION < 103500
|
||||
#include <boost/archive/detail/polymorphic_iarchive_impl.hpp>
|
||||
#define POLYMORPHIC(T) boost::archive::detail::polymorphic_iarchive_impl<T>
|
||||
|
||||
#elif BOOST_VERSION < 103600
|
||||
#include <boost/archive/detail/polymorphic_iarchive_dispatch.hpp>
|
||||
#define POLYMORPHIC(T) boost::archive::detail::polymorphic_iarchive_dispatch<T>
|
||||
|
||||
#else
|
||||
#include <boost/archive/detail/polymorphic_iarchive_route.hpp>
|
||||
#define POLYMORPHIC(T) boost::archive::detail::polymorphic_iarchive_route<T>
|
||||
#endif
|
||||
|
||||
// endian and fpclassify
|
||||
#if BOOST_VERSION < 103600
|
||||
#include <boost/integer/endian.hpp>
|
||||
#include <boost/math/fpclassify.hpp>
|
||||
#elif BOOST_VERSION < 104800
|
||||
#include <boost/spirit/home/support/detail/integer/endian.hpp>
|
||||
#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
|
||||
#else
|
||||
#include <boost/spirit/home/support/detail/endian/endian.hpp>
|
||||
#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
|
||||
#endif
|
||||
|
||||
// namespace alias
|
||||
#if BOOST_VERSION < 103800
|
||||
namespace fp = boost::math;
|
||||
#else
|
||||
namespace fp = boost::spirit::math;
|
||||
#endif
|
||||
|
||||
// namespace alias endian
|
||||
#if BOOST_VERSION < 104800
|
||||
namespace endian = boost::detail;
|
||||
#else
|
||||
namespace endian = boost::spirit::detail;
|
||||
#endif
|
||||
|
||||
#if BOOST_VERSION >= 104500 && !defined BOOST_NO_STD_WSTRING
|
||||
// used for wstring to utf8 conversion
|
||||
#include <boost/program_options/config.hpp>
|
||||
#include <boost/program_options/detail/convert.hpp>
|
||||
#endif
|
||||
|
||||
// generic type traits for numeric types
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
#include <boost/type_traits/is_unsigned.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
#include <boost/type_traits/is_floating_point.hpp>
|
||||
|
||||
#include "portable_archive_exception.hpp"
|
||||
|
||||
// hint from Johan Rade: on VMS there is still support for
|
||||
// the VAX floating point format and this macro detects it
|
||||
#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
|
||||
#error "VAX floating point format is not supported!"
|
||||
#endif
|
||||
|
||||
namespace eos {
|
||||
|
||||
// forward declaration
|
||||
class portable_iarchive;
|
||||
|
||||
typedef boost::archive::basic_binary_iprimitive<
|
||||
portable_iarchive
|
||||
#if BOOST_VERSION < 103400
|
||||
, std::istream
|
||||
#else
|
||||
, std::istream::char_type
|
||||
, std::istream::traits_type
|
||||
#endif
|
||||
> portable_iprimitive;
|
||||
|
||||
/**
|
||||
* \brief Portable binary input archive using little endian format.
|
||||
*
|
||||
* This archive addresses integer size, endianness and floating point types so
|
||||
* that data can be transferred across different systems. There may still be
|
||||
* constraints as to what systems are compatible and the user will have to take
|
||||
* care that e.g. a very large int being saved on a 64 bit machine will result
|
||||
* in a portable_archive_exception if loaded into an int on a 32 bit system.
|
||||
* A possible workaround to this would be to use fixed types like
|
||||
* boost::uint64_t in your serialization structures.
|
||||
*
|
||||
* \note The class is based on the portable binary example by Robert Ramey and
|
||||
* uses Beman Dawes endian library plus fp_utilities by Johan Rade.
|
||||
*/
|
||||
class portable_iarchive : public portable_iprimitive
|
||||
|
||||
// the example derives from common_oarchive but that lacks the
|
||||
// load_override functions so we chose to stay one level higher
|
||||
, public boost::archive::basic_binary_iarchive<portable_iarchive>
|
||||
|
||||
#if BOOST_VERSION >= 103500 && BOOST_VERSION < 105600
|
||||
// mix-in helper class for serializing shared_ptr
|
||||
, public boost::archive::detail::shared_ptr_helper
|
||||
#endif
|
||||
{
|
||||
// only needed for Robert's hack in basic_binary_iarchive::init
|
||||
friend class boost::archive::basic_binary_iarchive<portable_iarchive>;
|
||||
|
||||
// workaround for gcc: use a dummy struct
|
||||
// as additional argument type for overloading
|
||||
template <int> struct dummy { dummy(int) {}};
|
||||
|
||||
// loads directly from stream
|
||||
inline signed char load_signed_char()
|
||||
{
|
||||
signed char c;
|
||||
portable_iprimitive::load(c);
|
||||
return c;
|
||||
}
|
||||
|
||||
// archive initialization
|
||||
void init(unsigned flags)
|
||||
{
|
||||
using namespace boost::archive;
|
||||
archive_version_type input_library_version(3);
|
||||
|
||||
// it is vital to have version information!
|
||||
// if we don't have any we assume boost 1.33
|
||||
if (flags & no_header)
|
||||
set_library_version(input_library_version);
|
||||
|
||||
// extract and check the magic eos byte
|
||||
else if (load_signed_char() != magic_byte)
|
||||
throw archive_exception(archive_exception::invalid_signature);
|
||||
|
||||
else
|
||||
{
|
||||
// extract version information
|
||||
operator>>(input_library_version);
|
||||
|
||||
// throw if file version is newer than we are
|
||||
if (input_library_version > archive_version)
|
||||
throw archive_exception(archive_exception::unsupported_version);
|
||||
|
||||
// else set the library version accordingly
|
||||
else set_library_version(input_library_version);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
* \brief Constructor on a stream using ios::binary mode!
|
||||
*
|
||||
* We cannot call basic_binary_iprimitive::init which tries to detect
|
||||
* if the binary archive stems from a different platform by examining
|
||||
* type sizes.
|
||||
*
|
||||
* We could have called basic_binary_iarchive::init which would create
|
||||
* the boost::serialization standard archive header containing also the
|
||||
* library version. Due to efficiency we stick with our own.
|
||||
*/
|
||||
portable_iarchive(std::istream& is, unsigned flags = 0)
|
||||
#if BOOST_VERSION < 103400
|
||||
: portable_iprimitive(is, flags & boost::archive::no_codecvt)
|
||||
#else
|
||||
: portable_iprimitive(*is.rdbuf(), flags & boost::archive::no_codecvt)
|
||||
#endif
|
||||
, boost::archive::basic_binary_iarchive<portable_iarchive>(flags)
|
||||
{
|
||||
init(flags);
|
||||
}
|
||||
|
||||
#if BOOST_VERSION >= 103400
|
||||
portable_iarchive(std::streambuf& sb, unsigned flags = 0)
|
||||
: portable_iprimitive(sb, flags & boost::archive::no_codecvt)
|
||||
, boost::archive::basic_binary_iarchive<portable_iarchive>(flags)
|
||||
{
|
||||
init(flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
//! Load narrow strings.
|
||||
void load(std::string& s)
|
||||
{
|
||||
portable_iprimitive::load(s);
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
/**
|
||||
* \brief Load wide strings.
|
||||
*
|
||||
* This is rather tricky to get right for true portability as there
|
||||
* are so many different character encodings around. However, wide
|
||||
* strings that are encoded in one of the Unicode schemes only need
|
||||
* to be _transcoded_ which is a lot easier actually.
|
||||
*
|
||||
* We generate the output string to be encoded in the system's native
|
||||
* format, ie. UTF-16 on Windows and UTF-32 on Linux machines. Don't
|
||||
* know about Mac here so I can't really say about that.
|
||||
*/
|
||||
void load(std::wstring& s)
|
||||
{
|
||||
std::string utf8;
|
||||
load(utf8);
|
||||
s = boost::from_utf8(utf8);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \brief Loading bool type.
|
||||
*
|
||||
* Byte pattern is same as with integer types, so this function
|
||||
* is somewhat redundant but treating bool as integer generates
|
||||
* a lot of compiler warnings.
|
||||
*
|
||||
* \note If you cannot compile your application and it says something
|
||||
* about load(bool) cannot convert your type A& into bool& then you
|
||||
* should check your BOOST_CLASS_IMPLEMENTATION setting for A, as
|
||||
* portable_archive is not able to handle custom primitive types in
|
||||
* a general manner.
|
||||
*/
|
||||
void load(bool& b)
|
||||
{
|
||||
switch (signed char c = load_signed_char())
|
||||
{
|
||||
case 0: b = false; break;
|
||||
case 1: b = load_signed_char(); break;
|
||||
default: throw portable_archive_exception(c);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Load integer types.
|
||||
*
|
||||
* First we load the size information ie. the number of bytes that
|
||||
* hold the actual data. Then we retrieve the data and transform it
|
||||
* to the original value by using load_little_endian.
|
||||
*/
|
||||
template <typename T>
|
||||
typename boost::enable_if<boost::is_integral<T> >::type
|
||||
load(T & t, dummy<2> = 0)
|
||||
{
|
||||
// get the number of bytes in the stream
|
||||
if (signed char size = load_signed_char())
|
||||
{
|
||||
// check for negative value in unsigned type
|
||||
if (size < 0 && boost::is_unsigned<T>::value)
|
||||
throw portable_archive_exception();
|
||||
|
||||
// check that our type T is large enough
|
||||
else if ((unsigned) abs(size) > sizeof(T))
|
||||
throw portable_archive_exception(size);
|
||||
|
||||
// reconstruct the value
|
||||
T temp = size < 0 ? -1 : 0;
|
||||
load_binary(&temp, abs(size));
|
||||
|
||||
// load the value from little endian - it is then converted
|
||||
// to the target type T and fits it because size <= sizeof(T)
|
||||
t = endian::load_little_endian<T, sizeof(T)>(&temp);
|
||||
}
|
||||
|
||||
else t = 0; // zero optimization
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Load floating point types.
|
||||
*
|
||||
* We simply rely on fp_traits to set the bit pattern from the (unsigned)
|
||||
* integral type that was stored in the stream. Francois Mauger provided
|
||||
* standardized behaviour for special values like inf and NaN, that need to
|
||||
* be serialized in his application.
|
||||
*
|
||||
* \note by Johan Rade (author of the floating point utilities library):
|
||||
* Be warned that the math::detail::fp_traits<T>::type::get_bits() function
|
||||
* is *not* guaranteed to give you all bits of the floating point number. It
|
||||
* will give you all bits if and only if there is an integer type that has
|
||||
* the same size as the floating point you are copying from. It will not
|
||||
* give you all bits for double if there is no uint64_t. It will not give
|
||||
* you all bits for long double if sizeof(long double) > 8 or there is no
|
||||
* uint64_t.
|
||||
*
|
||||
* The member fp_traits<T>::type::coverage will tell you whether all bits
|
||||
* are copied. This is a typedef for either math::detail::all_bits or
|
||||
* math::detail::not_all_bits.
|
||||
*
|
||||
* If the function does not copy all bits, then it will copy the most
|
||||
* significant bits. So if you serialize and deserialize the way you
|
||||
* describe, and fp_traits<T>::type::coverage is math::detail::not_all_bits,
|
||||
* then your floating point numbers will be truncated. This will introduce
|
||||
* small rounding off errors.
|
||||
*/
|
||||
template <typename T>
|
||||
typename boost::enable_if<boost::is_floating_point<T> >::type
|
||||
load(T & t, dummy<3> = 0)
|
||||
{
|
||||
typedef typename fp::detail::fp_traits<T>::type traits;
|
||||
|
||||
// if you end here there are three possibilities:
|
||||
// 1. you're serializing a long double which is not portable
|
||||
// 2. you're serializing a double but have no 64 bit integer
|
||||
// 3. your machine is using an unknown floating point format
|
||||
// after reading the note above you still might decide to
|
||||
// deactivate this static assert and try if it works out.
|
||||
typename traits::bits bits;
|
||||
BOOST_STATIC_ASSERT(sizeof(bits) == sizeof(T));
|
||||
BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_iec559);
|
||||
|
||||
load(bits);
|
||||
traits::set_bits(t, bits);
|
||||
|
||||
// if the no_infnan flag is set we must throw here
|
||||
if (get_flags() & no_infnan && !fp::isfinite(t))
|
||||
throw portable_archive_exception(t);
|
||||
|
||||
// if you end here your floating point type does not support
|
||||
// denormalized numbers. this might be the case even though
|
||||
// your type conforms to IEC 559 (and thus to IEEE 754)
|
||||
if (std::numeric_limits<T>::has_denorm == std::denorm_absent
|
||||
&& fp::fpclassify(t) == (int) FP_SUBNORMAL) // GCC4
|
||||
throw portable_archive_exception(t);
|
||||
}
|
||||
|
||||
// in boost 1.44 version_type was splitted into library_version_type and
|
||||
// item_version_type, plus a whole bunch of additional strong typedefs.
|
||||
template <typename T>
|
||||
typename boost::disable_if<boost::is_arithmetic<T> >::type
|
||||
load(T& t, dummy<4> = 0)
|
||||
{
|
||||
// we provide a generic load routine for all types that feature
|
||||
// conversion operators into an unsigned integer value like those
|
||||
// created through BOOST_STRONG_TYPEDEF(X, some unsigned int) like
|
||||
// library_version_type, collection_size_type, item_version_type,
|
||||
// class_id_type, object_id_type, version_type and tracking_type
|
||||
load((typename boost::uint_t<sizeof(T)*CHAR_BIT>::least&)(t));
|
||||
}
|
||||
};
|
||||
|
||||
// polymorphic portable binary iarchive typedef
|
||||
typedef POLYMORPHIC(portable_iarchive) polymorphic_portable_iarchive;
|
||||
#undef POLYMORPHIC
|
||||
|
||||
} // namespace eos
|
||||
|
||||
// this is required by export which registers all of your
|
||||
// classes with all the inbuilt archives plus our archive.
|
||||
#if BOOST_VERSION < 103500
|
||||
#define BOOST_ARCHIVE_CUSTOM_IARCHIVE_TYPES eos::portable_iarchive
|
||||
#else
|
||||
BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::portable_iarchive)
|
||||
BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::polymorphic_portable_iarchive)
|
||||
#endif
|
||||
|
||||
// if you include this header multiple times and your compiler is picky
|
||||
// about multiple template instantiations (eg. gcc is) then you need to
|
||||
// define NO_EXPLICIT_TEMPLATE_INSTANTIATION before every include but one
|
||||
// or you move the instantiation section into an implementation file
|
||||
#ifndef NO_EXPLICIT_TEMPLATE_INSTANTIATION
|
||||
|
||||
#include <boost/archive/impl/basic_binary_iarchive.ipp>
|
||||
#include <boost/archive/impl/basic_binary_iprimitive.ipp>
|
||||
|
||||
#if BOOST_VERSION < 104000
|
||||
#include <boost/archive/impl/archive_pointer_iserializer.ipp>
|
||||
#elif !defined BOOST_ARCHIVE_SERIALIZER_INCLUDED
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
#define BOOST_ARCHIVE_SERIALIZER_INCLUDED
|
||||
#endif
|
||||
|
||||
namespace boost { namespace archive {
|
||||
|
||||
// explicitly instantiate for this type of binary stream
|
||||
template class basic_binary_iarchive<eos::portable_iarchive>;
|
||||
|
||||
template class basic_binary_iprimitive<
|
||||
eos::portable_iarchive
|
||||
#if BOOST_VERSION < 103400
|
||||
, std::istream
|
||||
#else
|
||||
, std::istream::char_type
|
||||
, std::istream::traits_type
|
||||
#endif
|
||||
>;
|
||||
|
||||
#if BOOST_VERSION < 104000
|
||||
template class detail::archive_pointer_iserializer<eos::portable_iarchive>;
|
||||
#else
|
||||
template class detail::archive_serializer_map<eos::portable_iarchive>;
|
||||
//template class detail::archive_serializer_map<eos::polymorphic_portable_iarchive>;
|
||||
#endif
|
||||
|
||||
} } // namespace boost::archive
|
||||
|
||||
#endif
|
||||
Executable
+470
@@ -0,0 +1,470 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* \file portable_oarchive.hpp
|
||||
* \brief Provides an archive to create portable binary files.
|
||||
* \author christian.pfligersdorffer@gmx.at
|
||||
* \version 5.1
|
||||
*
|
||||
* This pair of archives brings the advantages of binary streams to the cross
|
||||
* platform boost::serialization user. While being almost as fast as the native
|
||||
* binary archive it allows its files to be exchanged between cpu architectures
|
||||
* using different byte order (endianness). Speaking of speed: in serializing
|
||||
* numbers the (portable) binary approach is approximately ten times faster than
|
||||
* the ascii implementation (that is inherently portable)!
|
||||
*
|
||||
* Based on the portable archive example by Robert Ramey this implementation
|
||||
* uses Beman Dawes endian library and fp_utilities from Johan Rade, both being
|
||||
* in boost since 1.36. Prior to that you need to add them both (header only)
|
||||
* to your boost directory before you're able to use the archives provided.
|
||||
* Our archives have been tested successfully for boost versions 1.33 to 1.49!
|
||||
*
|
||||
* \note Correct behaviour has so far been confirmed using PowerPC-32, x86-32
|
||||
* and x86-64 platforms featuring different byte order. So there is a good
|
||||
* chance it will instantly work for your specific setup. If you encounter
|
||||
* problems or have suggestions please contact the author.
|
||||
*
|
||||
* \note Version 5.1 is now compatible with boost up to version 1.59. Thanks to
|
||||
* ecotax for pointing to the issue with shared_ptr_helper.
|
||||
*
|
||||
* \note Version 5.0 is now compatible with boost up to version 1.49 and enables
|
||||
* serialization of std::wstring by converting it to/from utf8 (thanks to
|
||||
* Arash Abghari for this suggestion). With that all unit tests from the
|
||||
* serialization library pass again with the notable exception of user
|
||||
* defined primitive types. Those are not supported and as a result any
|
||||
* user defined type to be used with the portable archives are required
|
||||
* to be at least object_serializable.
|
||||
*
|
||||
* \note Oliver Putz pointed out that -0.0 was not serialized correctly, so
|
||||
* version 4.3 provides a fix for that. Thanks Ollie!
|
||||
*
|
||||
* \note Version 4.2 maintains compatibility with the latest boost 1.45 and adds
|
||||
* serialization of special floating point values inf and NaN as proposed
|
||||
* by Francois Mauger.
|
||||
*
|
||||
* \note Version 4.1 makes the archives work together with boost 1.40 and 1.41.
|
||||
* Thanks to Francois Mauger for his suggestions.
|
||||
*
|
||||
* \note Version 4 removes one level of the inheritance hierarchy and directly
|
||||
* builds upon binary primitive and basic binary archive, thereby fixing
|
||||
* the last open issue regarding array serialization. Thanks to Robert
|
||||
* Ramey for the hint.
|
||||
*
|
||||
* \note A few fixes introduced in version 3.1 let the archives pass all of the
|
||||
* serialization tests. Thanks to Sergey Morozov for running the tests.
|
||||
* Wouter Bijlsma pointed out where to find the fp_utilities and endian
|
||||
* libraries headers inside the boost distribution. I would never have
|
||||
* found them so thank him it works out of the box since boost 1.36.
|
||||
*
|
||||
* \note With Version 3.0 the archives have been made portable across different
|
||||
* boost versions. For that purpose a header is added to the data that
|
||||
* supplies the underlying serialization library version. Backwards
|
||||
* compatibility is maintained by assuming library version boost 1.33 if
|
||||
* the iarchive is created using the no_header flag. Whether a header is
|
||||
* present or not can be guessed by peeking into the stream: the header's
|
||||
* first byte is the magic number 127 coinciding with 'e'|'o'|'s' :-)
|
||||
*
|
||||
* \note Version 2.1 removes several compiler warnings and enhances floating
|
||||
* point diagnostics to inform the user if some preconditions are violated
|
||||
* on his platform. We do not strive for the universally portable solution
|
||||
* in binary floating point serialization as desired by some boost users.
|
||||
* Instead we support only the most widely used IEEE 754 format and try to
|
||||
* detect when requirements are not met and hence our approach must fail.
|
||||
* Contributions we made by Johan Rade and Ákos Maróy.
|
||||
*
|
||||
* \note Version 2.0 fixes a serious bug that effectively transformed most
|
||||
* of negative integral values into positive values! For example the two
|
||||
* numbers -12 and 234 were stored in the same 8-bit pattern and later
|
||||
* always restored to 234. This was fixed in this version in a way that
|
||||
* does not change the interpretation of existing archives that did work
|
||||
* because there were no negative numbers. The other way round archives
|
||||
* created by version 2.0 and containing negative numbers will raise an
|
||||
* integer type size exception when reading it with version 1.0. Thanks
|
||||
* to Markus Frohnmaier for testing the archives and finding the bug.
|
||||
*
|
||||
* \copyright The boost software license applies.
|
||||
*/
|
||||
/*****************************************************************************/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <ostream>
|
||||
|
||||
// basic headers
|
||||
#include <boost/version.hpp>
|
||||
#include <boost/utility/enable_if.hpp>
|
||||
#include <boost/archive/basic_binary_oprimitive.hpp>
|
||||
#include <boost/archive/basic_binary_oarchive.hpp>
|
||||
|
||||
#if BOOST_VERSION >= 103500 && BOOST_VERSION < 105600
|
||||
#include <boost/archive/shared_ptr_helper.hpp>
|
||||
#endif
|
||||
|
||||
// funny polymorphics
|
||||
#if BOOST_VERSION < 103500
|
||||
#include <boost/archive/detail/polymorphic_oarchive_impl.hpp>
|
||||
#define POLYMORPHIC(T) boost::archive::detail::polymorphic_oarchive_impl<T>
|
||||
|
||||
#elif BOOST_VERSION < 103600
|
||||
#include <boost/archive/detail/polymorphic_oarchive_dispatch.hpp>
|
||||
#define POLYMORPHIC(T) boost::archive::detail::polymorphic_oarchive_dispatch<T>
|
||||
|
||||
#else
|
||||
#include <boost/archive/detail/polymorphic_oarchive_route.hpp>
|
||||
#define POLYMORPHIC(T) boost::archive::detail::polymorphic_oarchive_route<T>
|
||||
#endif
|
||||
|
||||
// endian and fpclassify
|
||||
#if BOOST_VERSION < 103600
|
||||
#include <boost/integer/endian.hpp>
|
||||
#include <boost/math/fpclassify.hpp>
|
||||
#elif BOOST_VERSION < 104800
|
||||
#include <boost/spirit/home/support/detail/integer/endian.hpp>
|
||||
#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
|
||||
#else
|
||||
#include <boost/spirit/home/support/detail/endian/endian.hpp>
|
||||
#include <boost/spirit/home/support/detail/math/fpclassify.hpp>
|
||||
#endif
|
||||
|
||||
// namespace alias fp_classify
|
||||
#if BOOST_VERSION < 103800
|
||||
namespace fp = boost::math;
|
||||
#else
|
||||
namespace fp = boost::spirit::math;
|
||||
#endif
|
||||
|
||||
// namespace alias endian
|
||||
#if BOOST_VERSION < 104800
|
||||
namespace endian = boost::detail;
|
||||
#else
|
||||
namespace endian = boost::spirit::detail;
|
||||
#endif
|
||||
|
||||
#if BOOST_VERSION >= 104500 && !defined BOOST_NO_STD_WSTRING
|
||||
// used for wstring to utf8 conversion
|
||||
#include <boost/program_options/config.hpp>
|
||||
#include <boost/program_options/detail/convert.hpp>
|
||||
#endif
|
||||
|
||||
// generic type traits for numeric types
|
||||
#include <boost/type_traits/is_integral.hpp>
|
||||
#include <boost/type_traits/is_signed.hpp>
|
||||
#include <boost/type_traits/is_arithmetic.hpp>
|
||||
#include <boost/type_traits/is_floating_point.hpp>
|
||||
|
||||
#include "portable_archive_exception.hpp"
|
||||
|
||||
// hint from Johan Rade: on VMS there is still support for
|
||||
// the VAX floating point format and this macro detects it
|
||||
#if defined(__vms) && defined(__DECCXX) && !__IEEE_FLOAT
|
||||
#error "VAX floating point format is not supported!"
|
||||
#endif
|
||||
|
||||
namespace eos {
|
||||
|
||||
// forward declaration
|
||||
class portable_oarchive;
|
||||
|
||||
typedef boost::archive::basic_binary_oprimitive<
|
||||
portable_oarchive
|
||||
#if BOOST_VERSION < 103400
|
||||
, std::ostream
|
||||
#else
|
||||
, std::ostream::char_type
|
||||
, std::ostream::traits_type
|
||||
#endif
|
||||
> portable_oprimitive;
|
||||
|
||||
/**
|
||||
* \brief Portable binary output archive using little endian format.
|
||||
*
|
||||
* This archive addresses integer size, endianness and floating point types so
|
||||
* that data can be transferred across different systems. The archive consists
|
||||
* primarily of three different save implementations for integral types,
|
||||
* floating point types and string types. Those functions are templates and use
|
||||
* enable_if to be correctly selected for overloading.
|
||||
*
|
||||
* \note The class is based on the portable binary example by Robert Ramey and
|
||||
* uses Beman Dawes endian library plus fp_utilities by Johan Rade.
|
||||
*/
|
||||
class portable_oarchive : public portable_oprimitive
|
||||
|
||||
// the example derives from common_oarchive but that lacks the
|
||||
// save_override functions so we chose to stay one level higher
|
||||
, public boost::archive::basic_binary_oarchive<portable_oarchive>
|
||||
|
||||
#if BOOST_VERSION >= 103500 && BOOST_VERSION < 105600
|
||||
// mix-in helper class for serializing shared_ptr
|
||||
, public boost::archive::detail::shared_ptr_helper
|
||||
#endif
|
||||
{
|
||||
// workaround for gcc: use a dummy struct
|
||||
// as additional argument type for overloading
|
||||
template<int> struct dummy { dummy(int) {}};
|
||||
|
||||
// stores a signed char directly to stream
|
||||
inline void save_signed_char(const signed char& c)
|
||||
{
|
||||
portable_oprimitive::save(c);
|
||||
}
|
||||
|
||||
// archive initialization
|
||||
void init(unsigned flags)
|
||||
{
|
||||
// it is vital to have version information if the archive is
|
||||
// to be parsed with a newer version of boost::serialization
|
||||
// therefor we create a header, no header means boost 1.33
|
||||
if (flags & boost::archive::no_header)
|
||||
BOOST_ASSERT(archive_version == 3);
|
||||
else
|
||||
{
|
||||
// write our minimalistic header (magic byte plus version)
|
||||
// the boost archives write a string instead - by calling
|
||||
// boost::archive::basic_binary_oarchive<derived_t>::init()
|
||||
save_signed_char(magic_byte);
|
||||
|
||||
// write current version
|
||||
// save<unsigned>(archive_version);
|
||||
operator<<(archive_version);
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
/**
|
||||
* \brief Constructor on a stream using ios::binary mode!
|
||||
*
|
||||
* We cannot call basic_binary_oprimitive::init which stores type
|
||||
* sizes to the archive in order to detect transfers to non-compatible
|
||||
* platforms.
|
||||
*
|
||||
* We could have called basic_binary_oarchive::init which would create
|
||||
* the boost::serialization standard archive header containing also the
|
||||
* library version. Due to efficiency we stick with our own.
|
||||
*/
|
||||
portable_oarchive(std::ostream& os, unsigned flags = 0)
|
||||
#if BOOST_VERSION < 103400
|
||||
: portable_oprimitive(os, flags & boost::archive::no_codecvt)
|
||||
#else
|
||||
: portable_oprimitive(*os.rdbuf(), flags & boost::archive::no_codecvt)
|
||||
#endif
|
||||
, boost::archive::basic_binary_oarchive<portable_oarchive>(flags)
|
||||
{
|
||||
init(flags);
|
||||
}
|
||||
|
||||
#if BOOST_VERSION >= 103400
|
||||
portable_oarchive(std::streambuf& sb, unsigned flags = 0)
|
||||
: portable_oprimitive(sb, flags & boost::archive::no_codecvt)
|
||||
, boost::archive::basic_binary_oarchive<portable_oarchive>(flags)
|
||||
{
|
||||
init(flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
//! Save narrow strings.
|
||||
void save(const std::string& s)
|
||||
{
|
||||
portable_oprimitive::save(s);
|
||||
}
|
||||
|
||||
#ifndef BOOST_NO_STD_WSTRING
|
||||
/**
|
||||
* \brief Save wide strings.
|
||||
*
|
||||
* This is rather tricky to get right for true portability as there
|
||||
* are so many different character encodings around. However, wide
|
||||
* strings that are encoded in one of the Unicode schemes only need
|
||||
* to be _transcoded_ which is a lot easier actually.
|
||||
*
|
||||
* We expect the input string to be encoded in the system's native
|
||||
* format, ie. UTF-16 on Windows and UTF-32 on Linux machines. Don't
|
||||
* know about Mac here so I can't really say about that.
|
||||
*/
|
||||
void save(const std::wstring& s)
|
||||
{
|
||||
save(boost::to_utf8(s));
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* \brief Saving bool type.
|
||||
*
|
||||
* Saving bool directly, not by const reference
|
||||
* because of tracking_type's operator (bool).
|
||||
*
|
||||
* \note If you cannot compile your application and it says something
|
||||
* about save(bool) cannot convert your type const A& into bool then
|
||||
* you should check your BOOST_CLASS_IMPLEMENTATION setting for A, as
|
||||
* portable_archive is not able to handle custom primitive types in
|
||||
* a general manner.
|
||||
*/
|
||||
void save(const bool& b)
|
||||
{
|
||||
save_signed_char(b);
|
||||
if (b) save_signed_char('T');
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Save integer types.
|
||||
*
|
||||
* First we save the size information ie. the number of bytes that hold the
|
||||
* actual data. We subsequently transform the data using store_little_endian
|
||||
* and store non-zero bytes to the stream.
|
||||
*/
|
||||
template <typename T>
|
||||
typename boost::enable_if<boost::is_integral<T> >::type
|
||||
save(const T & t, dummy<2> = 0)
|
||||
{
|
||||
if (T temp = t)
|
||||
{
|
||||
// examine the number of bytes
|
||||
// needed to represent the number
|
||||
signed char size = 0;
|
||||
do { temp >>= CHAR_BIT; ++size; }
|
||||
while (temp != 0 && temp != (T) -1);
|
||||
|
||||
// encode the sign bit into the size
|
||||
save_signed_char(t > 0 ? size : -size);
|
||||
BOOST_ASSERT(t > 0 || boost::is_signed<T>::value);
|
||||
|
||||
// we choose to use little endian because this way we just
|
||||
// save the first size bytes to the stream and skip the rest
|
||||
endian::store_little_endian<T, sizeof(T)>(&temp, t);
|
||||
|
||||
save_binary(&temp, size);
|
||||
}
|
||||
// zero optimization
|
||||
else save_signed_char(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Save floating point types.
|
||||
*
|
||||
* We simply rely on fp_traits to extract the bit pattern into an (unsigned)
|
||||
* integral type and store that into the stream. Francois Mauger provided
|
||||
* standardized behaviour for special values like inf and NaN, that need to
|
||||
* be serialized in his application.
|
||||
*
|
||||
* \note by Johan Rade (author of the floating point utilities library):
|
||||
* Be warned that the math::detail::fp_traits<T>::type::get_bits() function
|
||||
* is *not* guaranteed to give you all bits of the floating point number. It
|
||||
* will give you all bits if and only if there is an integer type that has
|
||||
* the same size as the floating point you are copying from. It will not
|
||||
* give you all bits for double if there is no uint64_t. It will not give
|
||||
* you all bits for long double if sizeof(long double) > 8 or there is no
|
||||
* uint64_t.
|
||||
*
|
||||
* The member fp_traits<T>::type::coverage will tell you whether all bits
|
||||
* are copied. This is a typedef for either math::detail::all_bits or
|
||||
* math::detail::not_all_bits.
|
||||
*
|
||||
* If the function does not copy all bits, then it will copy the most
|
||||
* significant bits. So if you serialize and deserialize the way you
|
||||
* describe, and fp_traits<T>::type::coverage is math::detail::not_all_bits,
|
||||
* then your floating point numbers will be truncated. This will introduce
|
||||
* small rounding off errors.
|
||||
*/
|
||||
template <typename T>
|
||||
typename boost::enable_if<boost::is_floating_point<T> >::type
|
||||
save(const T & t, dummy<3> = 0)
|
||||
{
|
||||
typedef typename fp::detail::fp_traits<T>::type traits;
|
||||
|
||||
// if the no_infnan flag is set we must throw here
|
||||
if (get_flags() & no_infnan && !fp::isfinite(t))
|
||||
throw portable_archive_exception(t);
|
||||
|
||||
// if you end here there are three possibilities:
|
||||
// 1. you're serializing a long double which is not portable
|
||||
// 2. you're serializing a double but have no 64 bit integer
|
||||
// 3. your machine is using an unknown floating point format
|
||||
// after reading the note above you still might decide to
|
||||
// deactivate this static assert and try if it works out.
|
||||
typename traits::bits bits;
|
||||
BOOST_STATIC_ASSERT(sizeof(bits) == sizeof(T));
|
||||
BOOST_STATIC_ASSERT(std::numeric_limits<T>::is_iec559);
|
||||
|
||||
// examine value closely
|
||||
switch (fp::fpclassify(t))
|
||||
{
|
||||
//case FP_ZERO: bits = 0; break;
|
||||
case FP_NAN: bits = traits::exponent | traits::mantissa; break;
|
||||
case FP_INFINITE: bits = traits::exponent | (t<0) * traits::sign; break;
|
||||
case FP_SUBNORMAL: assert(std::numeric_limits<T>::has_denorm); // pass
|
||||
case FP_ZERO: // note that floats can be ±0.0
|
||||
case FP_NORMAL: traits::get_bits(t, bits); break;
|
||||
default: throw portable_archive_exception(t);
|
||||
}
|
||||
|
||||
save(bits);
|
||||
}
|
||||
|
||||
// in boost 1.44 version_type was splitted into library_version_type and
|
||||
// item_version_type, plus a whole bunch of additional strong typedefs.
|
||||
template <typename T>
|
||||
typename boost::disable_if<boost::is_arithmetic<T> >::type
|
||||
save(const T& t, dummy<4> = 0)
|
||||
{
|
||||
// we provide a generic save routine for all types that feature
|
||||
// conversion operators into an unsigned integer value like those
|
||||
// created through BOOST_STRONG_TYPEDEF(X, some unsigned int) like
|
||||
// library_version_type, collection_size_type, item_version_type,
|
||||
// class_id_type, object_id_type, version_type and tracking_type
|
||||
save((typename boost::uint_t<sizeof(T)*CHAR_BIT>::least)(t));
|
||||
}
|
||||
};
|
||||
|
||||
// polymorphic portable binary oarchive typedef
|
||||
typedef POLYMORPHIC(portable_oarchive) polymorphic_portable_oarchive;
|
||||
#undef POLYMORPHIC
|
||||
|
||||
} // namespace eos
|
||||
|
||||
// required by export
|
||||
#if BOOST_VERSION < 103500
|
||||
#define BOOST_ARCHIVE_CUSTOM_OARCHIVE_TYPES eos::portable_oarchive
|
||||
#else
|
||||
BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::portable_oarchive)
|
||||
BOOST_SERIALIZATION_REGISTER_ARCHIVE(eos::polymorphic_portable_oarchive)
|
||||
#endif
|
||||
|
||||
// if you include this header multiple times and your compiler is picky
|
||||
// about multiple template instantiations (eg. gcc is) then you need to
|
||||
// define NO_EXPLICIT_TEMPLATE_INSTANTIATION before every include but one
|
||||
// or you move the instantiation section into an implementation file
|
||||
#ifndef NO_EXPLICIT_TEMPLATE_INSTANTIATION
|
||||
|
||||
#include <boost/archive/impl/basic_binary_oarchive.ipp>
|
||||
#include <boost/archive/impl/basic_binary_oprimitive.ipp>
|
||||
|
||||
#if BOOST_VERSION < 104000
|
||||
#include <boost/archive/impl/archive_pointer_oserializer.ipp>
|
||||
#elif !defined BOOST_ARCHIVE_SERIALIZER_INCLUDED
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
#define BOOST_ARCHIVE_SERIALIZER_INCLUDED
|
||||
#endif
|
||||
|
||||
namespace boost { namespace archive {
|
||||
|
||||
// explicitly instantiate for this type of binary stream
|
||||
template class basic_binary_oarchive<eos::portable_oarchive>;
|
||||
|
||||
template class basic_binary_oprimitive<
|
||||
eos::portable_oarchive
|
||||
#if BOOST_VERSION < 103400
|
||||
, std::ostream
|
||||
#else
|
||||
, std::ostream::char_type
|
||||
, std::ostream::traits_type
|
||||
#endif
|
||||
>;
|
||||
|
||||
#if BOOST_VERSION < 104000
|
||||
template class detail::archive_pointer_oserializer<eos::portable_oarchive>;
|
||||
#else
|
||||
template class detail::archive_serializer_map<eos::portable_oarchive>;
|
||||
//template class detail::archive_serializer_map<eos::polymorphic_portable_oarchive>;
|
||||
#endif
|
||||
|
||||
} } // namespace boost::archive
|
||||
|
||||
#endif
|
||||
@@ -65,10 +65,10 @@ protected:
|
||||
basic_text_oprimitive<std::ostream>::save(t);
|
||||
}
|
||||
void save(const version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
void save(const boost::serialization::item_version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
BOOST_ARCHIVE_DECL void
|
||||
save(const char * t);
|
||||
|
||||
@@ -78,10 +78,10 @@ protected:
|
||||
basic_text_oprimitive<std::wostream>::save(t);
|
||||
}
|
||||
void save(const version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
void save(const boost::serialization::item_version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
BOOST_WARCHIVE_DECL void
|
||||
save(const char * t);
|
||||
|
||||
@@ -65,11 +65,11 @@ protected:
|
||||
}
|
||||
void
|
||||
save(const version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
void
|
||||
save(const boost::serialization::item_version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
BOOST_ARCHIVE_DECL void
|
||||
save(const char * t);
|
||||
|
||||
@@ -62,7 +62,6 @@ protected:
|
||||
friend class basic_xml_iarchive<Archive>;
|
||||
friend class load_access;
|
||||
#endif
|
||||
std::locale archive_locale;
|
||||
boost::scoped_ptr<xml_wgrammar> gimpl;
|
||||
std::wistream & get_is(){
|
||||
return is;
|
||||
|
||||
@@ -74,11 +74,11 @@ protected:
|
||||
}
|
||||
void
|
||||
save(const version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
void
|
||||
save(const boost::serialization::item_version_type & t){
|
||||
save(static_cast<unsigned int>(t));
|
||||
save(static_cast<const unsigned int>(t));
|
||||
}
|
||||
BOOST_WARCHIVE_DECL void
|
||||
save(const char * t);
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef BOOST_SERIALIZATION_BOOST_ARRAY_HPP
|
||||
#define BOOST_SERIALIZATION_BOOST_ARRAY_HPP
|
||||
#ifndef BOOST_SERIALIZATION_ARRAY_HPP
|
||||
#define BOOST_SERIALIZATION_ARRAY_HPP
|
||||
|
||||
// (C) Copyright 2005 Matthias Troyer and Dave Abrahams
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
@@ -30,4 +30,4 @@ void serialize(Archive& ar, boost::array<T,N>& a, const unsigned int /* version
|
||||
} } // end namespace boost::serialization
|
||||
|
||||
|
||||
#endif //BOOST_SERIALIZATION_BOOST_ARRAY_HPP
|
||||
#endif //BOOST_SERIALIZATION_ARRAY_HPP
|
||||
|
||||
@@ -19,7 +19,6 @@
|
||||
// helper function templates for serialization of collections
|
||||
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
#include <boost/serialization/nvp.hpp>
|
||||
#include <boost/serialization/serialization.hpp>
|
||||
#include <boost/serialization/version.hpp>
|
||||
@@ -61,7 +60,7 @@ inline void save_collection(
|
||||
// note borland emits a no-op without the explicit namespace
|
||||
boost::serialization::save_construct_data_adl(
|
||||
ar,
|
||||
boost::addressof(*it),
|
||||
&(*it),
|
||||
item_version
|
||||
);
|
||||
ar << boost::serialization::make_nvp("item", *it++);
|
||||
|
||||
@@ -42,6 +42,8 @@
|
||||
|
||||
#include <boost/archive/detail/register_archive.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
@@ -28,8 +28,6 @@
|
||||
#include <boost/serialization/traits.hpp>
|
||||
#include <boost/serialization/wrapper.hpp>
|
||||
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
@@ -45,7 +43,7 @@ struct nvp :
|
||||
public:
|
||||
explicit nvp(const char * name_, T & t) :
|
||||
// note: added _ to suppress useless gcc warning
|
||||
std::pair<const char *, T *>(name_, boost::addressof(t))
|
||||
std::pair<const char *, T *>(name_, & t)
|
||||
{}
|
||||
|
||||
const char * name() const {
|
||||
|
||||
@@ -57,8 +57,7 @@ inline void load_set_collection(Archive & ar, Container &s)
|
||||
ar >> boost::serialization::make_nvp("item", t.reference());
|
||||
typename Container::iterator result =
|
||||
s.insert(hint, boost::move(t.reference()));
|
||||
const type * new_address = & (* result);
|
||||
ar.reset_object_address(new_address, & t.reference());
|
||||
ar.reset_object_address(& (* result), & t.reference());
|
||||
hint = result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
// Copyright Robert Ramey 2007. Changes made to permit
|
||||
// application throughout the serialization library.
|
||||
//
|
||||
// Copyright Alexander Grund 2018. Corrections to singleton lifetime
|
||||
//
|
||||
// Distributed under the Boost
|
||||
// Software License, Version 1.0. (See accompanying
|
||||
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||||
@@ -34,15 +32,15 @@
|
||||
// MS compatible compilers support #pragma once
|
||||
#if defined(_MSC_VER)
|
||||
# pragma once
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/noncopyable.hpp>
|
||||
#include <boost/serialization/force_include.hpp>
|
||||
#include <boost/serialization/config.hpp>
|
||||
|
||||
#include <boost/archive/detail/auto_link_archive.hpp>
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/detail/abi_prefix.hpp> // must be the last header
|
||||
|
||||
#ifdef BOOST_MSVC
|
||||
@@ -50,8 +48,8 @@
|
||||
# pragma warning(disable : 4511 4512)
|
||||
#endif
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
// Provides a dynamically-initialized (singleton) instance of T in a
|
||||
@@ -60,7 +58,7 @@ namespace serialization {
|
||||
// details.
|
||||
//
|
||||
|
||||
// Singletons created by this code are guaranteed to be unique
|
||||
// singletons created by this code are guarenteed to be unique
|
||||
// within the executable or shared library which creates them.
|
||||
// This is sufficient and in fact ideal for the serialization library.
|
||||
// The singleton is created when the module is loaded and destroyed
|
||||
@@ -76,22 +74,14 @@ namespace serialization {
|
||||
// Second, it provides a mechanism to detect when a non-const function
|
||||
// is called after initialization.
|
||||
|
||||
// Make a singleton to lock/unlock all singletons for alteration.
|
||||
// make a singleton to lock/unlock all singletons for alteration.
|
||||
// The intent is that all singletons created/used by this code
|
||||
// are to be initialized before main is called. A test program
|
||||
// can lock all the singletons when main is entered. Thus any
|
||||
// attempt to retrieve a mutable instance while locked will
|
||||
// generate an assertion if compiled for debug.
|
||||
// can lock all the singletons when main is entereed. This any
|
||||
// attempt to retieve a mutable instances while locked will
|
||||
// generate a assertion if compiled for debug.
|
||||
|
||||
// The singleton template can be used in 2 ways:
|
||||
// 1 (Recommended): Publicly inherit your type T from singleton<T>,
|
||||
// make its ctor protected and access it via T::get_const_instance()
|
||||
// 2: Simply access singleton<T> without changing T. Note that this only
|
||||
// provides a global instance accesible by singleton<T>::get_const_instance()
|
||||
// or singleton<T>::get_mutable_instance() to prevent using multiple instances
|
||||
// of T make its ctor protected
|
||||
|
||||
// Note on usage of BOOST_DLLEXPORT: These functions are in danger of
|
||||
// note usage of BOOST_DLLEXPORT. These functions are in danger of
|
||||
// being eliminated by the optimizer when building an application in
|
||||
// release mode. Usage of the macro is meant to signal the compiler/linker
|
||||
// to avoid dropping these functions which seem to be unreferenced.
|
||||
@@ -101,110 +91,68 @@ class BOOST_SYMBOL_VISIBLE singleton_module :
|
||||
public boost::noncopyable
|
||||
{
|
||||
private:
|
||||
BOOST_DLLEXPORT bool & get_lock() BOOST_USED {
|
||||
static bool lock = false;
|
||||
return lock;
|
||||
}
|
||||
|
||||
BOOST_DLLEXPORT static bool & get_lock() BOOST_USED;
|
||||
public:
|
||||
BOOST_DLLEXPORT void lock(){
|
||||
BOOST_DLLEXPORT static void lock(){
|
||||
get_lock() = true;
|
||||
}
|
||||
BOOST_DLLEXPORT void unlock(){
|
||||
BOOST_DLLEXPORT static void unlock(){
|
||||
get_lock() = false;
|
||||
}
|
||||
BOOST_DLLEXPORT bool is_locked(){
|
||||
BOOST_DLLEXPORT static bool is_locked(){
|
||||
return get_lock();
|
||||
}
|
||||
};
|
||||
|
||||
static inline singleton_module & get_singleton_module(){
|
||||
static singleton_module m;
|
||||
return m;
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
// This is the class actually instantiated and hence the real singleton.
|
||||
// So there will only be one instance of this class. This does not hold
|
||||
// for singleton<T> as a class derived from singleton<T> could be
|
||||
// instantiated multiple times.
|
||||
// It also provides a flag `is_destroyed` which returns true, when the
|
||||
// class was destructed. It is static and hence accesible even after
|
||||
// destruction. This can be used to check, if the singleton is still
|
||||
// accesible e.g. in destructors of other singletons.
|
||||
template<class T>
|
||||
class singleton_wrapper : public T
|
||||
{
|
||||
static bool & get_is_destroyed(){
|
||||
// Prefer a static function member to avoid LNK1179.
|
||||
// Note: As this is for a singleton (1 instance only) it must be set
|
||||
// never be reset (to false)!
|
||||
static bool is_destroyed_flag = false;
|
||||
return is_destroyed_flag;
|
||||
}
|
||||
public:
|
||||
singleton_wrapper(){
|
||||
BOOST_ASSERT(! is_destroyed());
|
||||
}
|
||||
~singleton_wrapper(){
|
||||
get_is_destroyed() = true;
|
||||
}
|
||||
static bool is_destroyed(){
|
||||
return get_is_destroyed();
|
||||
}
|
||||
};
|
||||
|
||||
} // detail
|
||||
|
||||
template <class T>
|
||||
class singleton {
|
||||
class singleton : public singleton_module
|
||||
{
|
||||
private:
|
||||
static T * m_instance;
|
||||
static T & m_instance;
|
||||
// include this to provoke instantiation at pre-execution time
|
||||
static void use(T const &) {}
|
||||
static void use(T const *) {}
|
||||
static T & get_instance() {
|
||||
// use a wrapper so that types T with protected constructors
|
||||
// can be used
|
||||
class singleton_wrapper : public T {};
|
||||
static singleton_wrapper t;
|
||||
// refer to instance, causing it to be instantiated (and
|
||||
// initialized at startup on working compilers)
|
||||
BOOST_ASSERT(! is_destroyed());
|
||||
|
||||
// use a wrapper so that types T with protected constructors can be used
|
||||
// Using a static function member avoids LNK1179
|
||||
static detail::singleton_wrapper< T > t;
|
||||
|
||||
// note that the following is absolutely essential.
|
||||
// commenting out this statement will cause compilers to fail to
|
||||
// construct the instance at pre-execution time. This would prevent
|
||||
// our usage/implementation of "locking" and introduce uncertainty into
|
||||
// the sequence of object initialization.
|
||||
// Unfortunately, this triggers detectors of undefine behavior
|
||||
// and reports an error. But I've been unable to find a different
|
||||
// of guarenteeing that the the singleton is created at pre-main time.
|
||||
use(* m_instance);
|
||||
|
||||
// the sequence of object initializaition.
|
||||
use(& m_instance);
|
||||
return static_cast<T &>(t);
|
||||
}
|
||||
protected:
|
||||
// Do not allow instantiation of a singleton<T>. But we want to allow
|
||||
// `class T: public singleton<T>` so we can't delete this ctor
|
||||
BOOST_DLLEXPORT singleton(){}
|
||||
static bool & get_is_destroyed(){
|
||||
static bool is_destroyed;
|
||||
return is_destroyed;
|
||||
}
|
||||
|
||||
public:
|
||||
BOOST_DLLEXPORT static T & get_mutable_instance(){
|
||||
BOOST_ASSERT(! get_singleton_module().is_locked());
|
||||
BOOST_ASSERT(! is_locked());
|
||||
return get_instance();
|
||||
}
|
||||
BOOST_DLLEXPORT static const T & get_const_instance(){
|
||||
return get_instance();
|
||||
}
|
||||
BOOST_DLLEXPORT static bool is_destroyed(){
|
||||
return detail::singleton_wrapper< T >::is_destroyed();
|
||||
return get_is_destroyed();
|
||||
}
|
||||
BOOST_DLLEXPORT singleton(){
|
||||
get_is_destroyed() = false;
|
||||
}
|
||||
BOOST_DLLEXPORT ~singleton() {
|
||||
get_is_destroyed() = true;
|
||||
}
|
||||
};
|
||||
|
||||
// Assigning the instance reference to a static member forces initialization
|
||||
// at startup time as described in
|
||||
// https://groups.google.com/forum/#!topic/microsoft.public.vc.language/kDVNLnIsfZk
|
||||
template<class T>
|
||||
T * singleton< T >::m_instance = & singleton< T >::get_instance();
|
||||
T & singleton< T >::m_instance = singleton< T >::get_instance();
|
||||
|
||||
} // namespace serialization
|
||||
} // namespace boost
|
||||
|
||||
@@ -18,7 +18,6 @@
|
||||
|
||||
#include <valarray>
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/core/addressof.hpp>
|
||||
|
||||
#include <boost/serialization/collections_save_imp.hpp>
|
||||
#include <boost/serialization/collections_load_imp.hpp>
|
||||
@@ -48,7 +47,7 @@ void save( Archive & ar, const STD::valarray<U> &t, const unsigned int /*file_ve
|
||||
if (t.size()){
|
||||
// explict template arguments to pass intel C++ compiler
|
||||
ar << serialization::make_array<const U, collection_size_type>(
|
||||
static_cast<const U *>( boost::addressof(t[0]) ),
|
||||
static_cast<const U *>(&t[0]),
|
||||
count
|
||||
);
|
||||
}
|
||||
@@ -63,7 +62,7 @@ void load( Archive & ar, STD::valarray<U> &t, const unsigned int /*file_version
|
||||
if (t.size()){
|
||||
// explict template arguments to pass intel C++ compiler
|
||||
ar >> serialization::make_array<U, collection_size_type>(
|
||||
static_cast<U *>( boost::addressof(t[0]) ),
|
||||
static_cast<U *>(&t[0]),
|
||||
count
|
||||
);
|
||||
}
|
||||
|
||||
@@ -43,8 +43,8 @@ namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
template<class Archive>
|
||||
struct variant_save_visitor :
|
||||
boost::static_visitor<>
|
||||
struct variant_save_visitor :
|
||||
boost::static_visitor<>
|
||||
{
|
||||
variant_save_visitor(Archive& ar) :
|
||||
m_ar(ar)
|
||||
@@ -100,8 +100,7 @@ struct variant_impl {
|
||||
head_type value;
|
||||
ar >> BOOST_SERIALIZATION_NVP(value);
|
||||
v = value;
|
||||
head_type * new_address = & boost::get<head_type>(v);
|
||||
ar.reset_object_address(new_address, & value);
|
||||
ar.reset_object_address(& boost::get<head_type>(v), & value);
|
||||
return;
|
||||
}
|
||||
typedef typename mpl::pop_front<S>::type type;
|
||||
@@ -156,23 +155,4 @@ inline void serialize(
|
||||
} // namespace serialization
|
||||
} // namespace boost
|
||||
|
||||
//template<typename T0_, BOOST_VARIANT_ENUM_SHIFTED_PARAMS(typename T)>
|
||||
|
||||
#include <boost/serialization/tracking.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
template<BOOST_VARIANT_ENUM_PARAMS(/* typename */ class T)>
|
||||
struct tracking_level<
|
||||
variant<BOOST_VARIANT_ENUM_PARAMS(T)>
|
||||
>{
|
||||
typedef mpl::integral_c_tag tag;
|
||||
typedef mpl::int_< ::boost::serialization::track_always> type;
|
||||
BOOST_STATIC_CONSTANT(int, value = type::value);
|
||||
};
|
||||
|
||||
} // namespace serialization
|
||||
} // namespace boost
|
||||
|
||||
#endif //BOOST_SERIALIZATION_VARIANT_HPP
|
||||
|
||||
@@ -181,14 +181,13 @@ void_caster_primitive<Derived, Base>::void_caster_primitive() :
|
||||
void_caster(
|
||||
& type_info_implementation<Derived>::type::get_const_instance(),
|
||||
& type_info_implementation<Base>::type::get_const_instance(),
|
||||
/* note about displacement:
|
||||
* displace 0: at least one compiler treated 0 by not shifting it at all
|
||||
* displace by small value (8): caused ICE on certain mingw gcc versions */
|
||||
// note:I wanted to displace from 0 here, but at least one compiler
|
||||
// treated 0 by not shifting it at all.
|
||||
reinterpret_cast<std::ptrdiff_t>(
|
||||
static_cast<Derived *>(
|
||||
reinterpret_cast<Base *>(1 << 20)
|
||||
reinterpret_cast<Base *>(8)
|
||||
)
|
||||
) - (1 << 20)
|
||||
) - 8
|
||||
)
|
||||
{
|
||||
recursive_register();
|
||||
|
||||
@@ -77,14 +77,6 @@ archive_exception::archive_exception(
|
||||
break;
|
||||
case input_stream_error:
|
||||
length = append(length, "input stream error");
|
||||
if(NULL != e1){
|
||||
length = append(length, "-");
|
||||
length = append(length, e1);
|
||||
}
|
||||
if(NULL != e2){
|
||||
length = append(length, "-");
|
||||
length = append(length, e2);
|
||||
}
|
||||
break;
|
||||
case invalid_class_name:
|
||||
length = append(length, "class name too long");
|
||||
@@ -113,14 +105,6 @@ archive_exception::archive_exception(
|
||||
break;
|
||||
case output_stream_error:
|
||||
length = append(length, "output stream error");
|
||||
if(NULL != e1){
|
||||
length = append(length, "-");
|
||||
length = append(length, e1);
|
||||
}
|
||||
if(NULL != e2){
|
||||
length = append(length, "-");
|
||||
length = append(length, e2);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
BOOST_ASSERT(false);
|
||||
|
||||
@@ -77,13 +77,10 @@ BOOST_ARCHIVE_SIGNATURE(){
|
||||
// 13- simplified visibility, removed Borland, removed pfto
|
||||
// 14- improved visibility, refactor map/set
|
||||
// 15- corrections to optional and collection loading
|
||||
// 16- eliminated dependency on <codecvt> which is buggy in some libraries
|
||||
// and now officially deprecated in the standard
|
||||
// 17- Boost 1.68 August 2018
|
||||
|
||||
BOOST_SYMBOL_VISIBLE library_version_type
|
||||
BOOST_ARCHIVE_VERSION(){
|
||||
return library_version_type(17);
|
||||
return library_version_type(15);
|
||||
}
|
||||
|
||||
} // namespace archive
|
||||
|
||||
@@ -106,9 +106,8 @@ class basic_oarchive_impl {
|
||||
m_class_id(class_id),
|
||||
m_initialized(false)
|
||||
{}
|
||||
cobject_type(const basic_oserializer & bos) :
|
||||
m_bos_ptr(& bos),
|
||||
m_initialized(false)
|
||||
cobject_type(const basic_oserializer & bos)
|
||||
: m_bos_ptr(& bos)
|
||||
{}
|
||||
cobject_type(
|
||||
const cobject_type & rhs
|
||||
|
||||
@@ -21,9 +21,6 @@
|
||||
# pragma warning(disable : 4244 4511 4512)
|
||||
#endif
|
||||
|
||||
#include <cerrno> // errno
|
||||
#include <cstring> // strerror(errno)
|
||||
|
||||
// spirit stuff
|
||||
#include <boost/spirit/include/classic_operators.hpp>
|
||||
#include <boost/spirit/include/classic_actions.hpp>
|
||||
@@ -34,6 +31,7 @@
|
||||
#endif
|
||||
|
||||
// for head_iterator test
|
||||
//#include <boost/bind.hpp>
|
||||
#include <boost/function.hpp>
|
||||
|
||||
#include <boost/io/ios_state.hpp>
|
||||
@@ -190,14 +188,8 @@ bool basic_xml_grammar<CharType>::my_parse(
|
||||
for(;;){
|
||||
CharType result;
|
||||
is.get(result);
|
||||
if(is.fail()){
|
||||
boost::serialization::throw_exception(
|
||||
boost::archive::archive_exception(
|
||||
archive_exception::input_stream_error,
|
||||
std::strerror(errno)
|
||||
)
|
||||
);
|
||||
}
|
||||
if(is.fail())
|
||||
return false;
|
||||
if(is.eof())
|
||||
return false;
|
||||
arg += result;
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
|
||||
std::codecvt_base::result
|
||||
BOOST_WARCHIVE_DECL std::codecvt_base::result
|
||||
codecvt_null<wchar_t>::do_out(
|
||||
std::mbstate_t & /*state*/,
|
||||
const wchar_t * first1,
|
||||
@@ -46,7 +46,7 @@ codecvt_null<wchar_t>::do_out(
|
||||
return std::codecvt_base::ok;
|
||||
}
|
||||
|
||||
std::codecvt_base::result
|
||||
BOOST_WARCHIVE_DECL std::codecvt_base::result
|
||||
codecvt_null<wchar_t>::do_in(
|
||||
std::mbstate_t & /*state*/,
|
||||
const char * first1,
|
||||
|
||||
@@ -125,10 +125,7 @@ BOOST_SERIALIZATION_DECL void
|
||||
extended_type_info::key_unregister() const{
|
||||
if(NULL == get_key())
|
||||
return;
|
||||
// note: it's been discovered that at least one platform is not guaranteed
|
||||
// to destroy singletons reverse order of construction. So we can't
|
||||
// use a runtime assert here. Leave this in a reminder not to do this!
|
||||
// BOOST_ASSERT(! singleton<detail::ktmap>::is_destroyed());
|
||||
BOOST_ASSERT(! singleton<detail::ktmap>::is_destroyed());
|
||||
if(! singleton<detail::ktmap>::is_destroyed()){
|
||||
detail::ktmap & x = singleton<detail::ktmap>::get_mutable_instance();
|
||||
detail::ktmap::iterator start = x.lower_bound(this);
|
||||
|
||||
@@ -95,22 +95,20 @@ BOOST_SERIALIZATION_DECL void
|
||||
extended_type_info_typeid_0::type_unregister()
|
||||
{
|
||||
if(NULL != m_ti){
|
||||
// note: previously this conditional was a runtime assertion with
|
||||
// BOOST_ASSERT. We've changed it because we've discovered that at
|
||||
// least one platform is not guaranteed to destroy singletons in
|
||||
// reverse order of distruction.
|
||||
// BOOST_ASSERT(! singleton<tkmap>::is_destroyed());
|
||||
BOOST_ASSERT(! singleton<tkmap>::is_destroyed());
|
||||
if(! singleton<tkmap>::is_destroyed()){
|
||||
tkmap & x = singleton<tkmap>::get_mutable_instance();
|
||||
tkmap::iterator start = x.lower_bound(this);
|
||||
tkmap::iterator end = x.upper_bound(this);
|
||||
BOOST_ASSERT(start != end);
|
||||
|
||||
// remove all entries in map which corresponds to this type
|
||||
// make sure that we don't use any invalidated iterators
|
||||
for(;;){
|
||||
const tkmap::iterator & it = x.find(this);
|
||||
if(it == x.end())
|
||||
break;
|
||||
x.erase(it);
|
||||
};
|
||||
// remove entry in map which corresponds to this type
|
||||
do{
|
||||
if(this == *start)
|
||||
x.erase(start++);
|
||||
else
|
||||
++start;
|
||||
}while(start != end);
|
||||
}
|
||||
}
|
||||
m_ti = NULL;
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_binary_iarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_binary_iarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class archive_serializer_map<polymorphic_binary_iarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_binary_oarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_binary_oarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class detail::archive_serializer_map<polymorphic_binary_oarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_text_iarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_text_iarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class archive_serializer_map<polymorphic_text_iarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_text_oarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_text_oarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class detail::archive_serializer_map<polymorphic_text_oarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_text_wiarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_text_wiarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class archive_serializer_map<polymorphic_text_wiarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_text_woarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_text_woarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class detail::archive_serializer_map<polymorphic_text_woarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_xml_iarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_xml_iarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class archive_serializer_map<polymorphic_xml_iarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_xml_oarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_xml_oarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class detail::archive_serializer_map<polymorphic_xml_oarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_xml_wiarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_xml_wiarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class archive_serializer_map<polymorphic_xml_wiarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -1,30 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// polymorphic_xml_woarchive.cpp:
|
||||
|
||||
// (C) Copyright 2018 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
|
||||
#if (defined _MSC_VER) && (_MSC_VER == 1200)
|
||||
# pragma warning (disable : 4786) // too long name, harmless warning
|
||||
#endif
|
||||
|
||||
#define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/archive/polymorphic_xml_woarchive.hpp>
|
||||
|
||||
// explicitly instantiate for this type of text stream
|
||||
#include <boost/archive/impl/archive_serializer_map.ipp>
|
||||
|
||||
namespace boost {
|
||||
namespace archive {
|
||||
namespace detail {
|
||||
|
||||
template class detail::archive_serializer_map<polymorphic_xml_woarchive>;
|
||||
|
||||
} // detail
|
||||
} // archive
|
||||
} // boost
|
||||
@@ -0,0 +1,26 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// singleton.cpp
|
||||
//
|
||||
// Copyright (c) 201 5 Robert Ramey, Indiana University (garcia@osl.iu.edu)
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
//
|
||||
|
||||
// it marks our code with proper attributes as being exported when
|
||||
// we're compiling it while marking it import when just the headers
|
||||
// is being included.
|
||||
#define BOOST_SERIALIZATION_SOURCE
|
||||
#include <boost/serialization/config.hpp>
|
||||
#include <boost/serialization/singleton.hpp>
|
||||
|
||||
namespace boost {
|
||||
namespace serialization {
|
||||
|
||||
BOOST_SERIALIZATION_DECL bool & singleton_module::get_lock(){
|
||||
static bool lock = false;
|
||||
return lock;
|
||||
}
|
||||
|
||||
} // namespace serialization
|
||||
} // namespace boost
|
||||
+15
-11
@@ -9,14 +9,18 @@
|
||||
#error "wide char i/o not supported on this platform"
|
||||
#endif
|
||||
|
||||
// include boost implementation of utf8 codecvt facet
|
||||
# define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/archive/detail/decl.hpp>
|
||||
#define BOOST_UTF8_BEGIN_NAMESPACE \
|
||||
namespace boost { namespace archive { namespace detail {
|
||||
#define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL
|
||||
#define BOOST_UTF8_END_NAMESPACE }}}
|
||||
#include <boost/detail/utf8_codecvt_facet.ipp>
|
||||
#undef BOOST_UTF8_END_NAMESPACE
|
||||
#undef BOOST_UTF8_DECL
|
||||
#undef BOOST_UTF8_BEGIN_NAMESPACE
|
||||
// std::codecvt_utf8 doesn't seem to work for any versions of msvc
|
||||
#if defined(_MSC_VER) \
|
||||
|| defined( BOOST_NO_CXX11_HDR_CODECVT )
|
||||
// include boost implementation of utf8 codecvt facet
|
||||
# define BOOST_ARCHIVE_SOURCE
|
||||
#include <boost/archive/detail/decl.hpp>
|
||||
#define BOOST_UTF8_BEGIN_NAMESPACE \
|
||||
namespace boost { namespace archive { namespace detail {
|
||||
#define BOOST_UTF8_DECL BOOST_ARCHIVE_DECL
|
||||
#define BOOST_UTF8_END_NAMESPACE }}}
|
||||
#include <boost/detail/utf8_codecvt_facet.ipp>
|
||||
#undef BOOST_UTF8_END_NAMESPACE
|
||||
#undef BOOST_UTF8_DECL
|
||||
#undef BOOST_UTF8_BEGIN_NAMESPACE
|
||||
#endif
|
||||
|
||||
+1
-4
@@ -276,10 +276,7 @@ void_caster::recursive_register(bool includes_virtual_base) const {
|
||||
|
||||
BOOST_SERIALIZATION_DECL void
|
||||
void_caster::recursive_unregister() const {
|
||||
// note: it's been discovered that at least one platform is not guaranteed
|
||||
// to destroy singletons reverse order of construction. So we can't
|
||||
// use a runtime assert here. Leave this in a reminder not to do this!
|
||||
// BOOST_ASSERT(! void_caster_registry::is_destroyed());
|
||||
BOOST_ASSERT(! void_caster_registry::is_destroyed());
|
||||
if(void_caster_registry::is_destroyed())
|
||||
return;
|
||||
|
||||
|
||||
+9
-10
@@ -48,7 +48,7 @@ void accumulate(std::size_t & s, const T & t){
|
||||
s += *tptr++;
|
||||
}
|
||||
}
|
||||
A_DLL_DECL
|
||||
|
||||
A::operator std::size_t () const {
|
||||
std::size_t retval = 0;
|
||||
accumulate(retval, b);
|
||||
@@ -78,12 +78,11 @@ A::operator std::size_t () const {
|
||||
#pragma warning(disable : 4244) // Disable possible loss of data warning
|
||||
#endif
|
||||
|
||||
A_DLL_DECL
|
||||
A::A() :
|
||||
b(true),
|
||||
#ifndef BOOST_NO_INT64_T
|
||||
f(static_cast<boost::int64_t>(std::rand()) * static_cast<boost::int64_t>(std::rand())),
|
||||
g(static_cast<boost::uint64_t>(std::rand()) * static_cast<boost::uint64_t>(std::rand())),
|
||||
f(std::rand() * std::rand()),
|
||||
g(std::rand() * std::rand()),
|
||||
#endif
|
||||
l(static_cast<enum h>(std::rand() % 3)),
|
||||
m(std::rand()),
|
||||
@@ -112,8 +111,8 @@ A::A() :
|
||||
#pragma warning(pop) // Restore warnings to previous state.
|
||||
#endif
|
||||
|
||||
A_DLL_DECL bool
|
||||
A::operator==(const A &rhs) const {
|
||||
bool A::operator==(const A &rhs) const
|
||||
{
|
||||
if(b != rhs.b)
|
||||
return false;
|
||||
if(l != rhs.l)
|
||||
@@ -161,13 +160,13 @@ A::operator==(const A &rhs) const {
|
||||
return true;
|
||||
}
|
||||
|
||||
A_DLL_DECL bool
|
||||
A::operator!=(const A &rhs) const {
|
||||
bool A::operator!=(const A &rhs) const
|
||||
{
|
||||
return ! (*this == rhs);
|
||||
}
|
||||
|
||||
A_DLL_DECL bool
|
||||
A::operator<(const A &rhs) const {
|
||||
bool A::operator<(const A &rhs) const
|
||||
{
|
||||
if(b != rhs.b)
|
||||
return b < rhs.b;
|
||||
#ifndef BOOST_NO_INT64_T
|
||||
|
||||
+7
-11
@@ -32,17 +32,13 @@ namespace std{
|
||||
#include <boost/serialization/access.hpp>
|
||||
#include <boost/serialization/string.hpp>
|
||||
|
||||
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
|
||||
#if defined(A_IMPORT)
|
||||
#define A_DLL_DECL BOOST_SYMBOL_IMPORT
|
||||
#pragma message("A imported")
|
||||
#elif defined(A_EXPORT)
|
||||
#define A_DLL_DECL BOOST_SYMBOL_EXPORT
|
||||
#pragma message ("A exported")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef A_DLL_DECL
|
||||
#if defined(A_IMPORT)
|
||||
#define A_DLL_DECL BOOST_SYMBOL_IMPORT
|
||||
#pragma message("A imported")
|
||||
#elif defined(A_EXPORT)
|
||||
#define A_DLL_DECL BOOST_SYMBOL_EXPORT
|
||||
#pragma message ("A exported")
|
||||
#else
|
||||
#define A_DLL_DECL
|
||||
#endif
|
||||
|
||||
|
||||
+41
-43
@@ -9,13 +9,13 @@
|
||||
project libs/serialization/test
|
||||
: id serialization_test
|
||||
: requirements <source>/boost/filesystem
|
||||
: requirements <source>/boost/system
|
||||
;
|
||||
|
||||
# import rules for testing conditional on config file variables
|
||||
import ../../config/checks/config : requires ;
|
||||
|
||||
# import rules from the boost serialization test
|
||||
# import ../util/test : test-bsl-run-no-lib ;
|
||||
import ../util/test :
|
||||
run-template
|
||||
run-invoke
|
||||
@@ -24,33 +24,38 @@ import ../util/test :
|
||||
test-bsl-run
|
||||
test-bsl-run_archive
|
||||
test-bsl-run_files
|
||||
test-bsl-run_polymorphic_files
|
||||
test-bsl-run_polymorphic_archive
|
||||
;
|
||||
|
||||
BOOST_ARCHIVE_LIST = [ modules.peek : BOOST_ARCHIVE_LIST ] ;
|
||||
|
||||
lib dll_a
|
||||
|
||||
lib dll_a_lib
|
||||
:
|
||||
dll_a.cpp
|
||||
../build//boost_serialization
|
||||
:
|
||||
<link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
|
||||
;
|
||||
lib dll_polymorphic_base
|
||||
:
|
||||
polymorphic_base.cpp
|
||||
../build//boost_serialization
|
||||
:
|
||||
<link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
|
||||
;
|
||||
|
||||
lib dll_polymorphic_derived2
|
||||
:
|
||||
polymorphic_derived2.cpp
|
||||
dll_polymorphic_base
|
||||
lib dll_base_lib
|
||||
:
|
||||
dll_base.cpp
|
||||
../build//boost_serialization
|
||||
:
|
||||
;
|
||||
|
||||
lib dll_derived2_lib
|
||||
:
|
||||
dll_derived2.cpp
|
||||
dll_base_lib
|
||||
../build//boost_serialization
|
||||
:
|
||||
;
|
||||
|
||||
lib dll_polymorphic_derived2_lib
|
||||
:
|
||||
polymorphic_derived2.cpp
|
||||
../build//boost_serialization
|
||||
:
|
||||
<link>shared:<define>BOOST_SERIALIZATION_DYN_LINK=1
|
||||
;
|
||||
|
||||
test-suite "serialization" :
|
||||
@@ -71,6 +76,7 @@ test-suite "serialization" :
|
||||
[ test-bsl-run_files test_derived_class_ptr : A ]
|
||||
[ test-bsl-run_files test_diamond ]
|
||||
[ test-bsl-run_files test_diamond_complex ]
|
||||
[ test-bsl-run_files test_exported : polymorphic_base ]
|
||||
[ test-bsl-run_files test_forward_list : A : : [ requires cxx11_hdr_forward_list ] ] # BOOST_NO_CXX11_HDR_FORWARD_LIST
|
||||
[ test-bsl-run_files test_forward_list_ptrs : A : : [ requires cxx11_hdr_forward_list ] ] # BOOST_NO_CXX11_HDR_FORWARD_LIST
|
||||
[ test-bsl-run_files test_helper_support ]
|
||||
@@ -84,6 +90,7 @@ test-suite "serialization" :
|
||||
[ test-bsl-run_files test_mi ]
|
||||
[ test-bsl-run_files test_multiple_ptrs : A ]
|
||||
[ test-bsl-run_files test_multiple_inheritance ]
|
||||
[ test-bsl-run_files test_no_rtti : polymorphic_base polymorphic_derived1 ]
|
||||
[ test-bsl-run_files test_non_intrusive ]
|
||||
[ test-bsl-run_files test_non_default_ctor ]
|
||||
[ test-bsl-run_files test_non_default_ctor2 ]
|
||||
@@ -116,13 +123,9 @@ test-suite "serialization" :
|
||||
[ test-bsl-run_files test_shared_ptr ]
|
||||
[ test-bsl-run_files test_shared_ptr_multi_base ]
|
||||
[ test-bsl-run_files test_shared_ptr_132 : : : [ requires auto_ptr ] ] # BOOST_NO_AUTO_PTR
|
||||
|
||||
[ test-bsl-run_polymorphic_files test_dll_exported : polymorphic_derived1 : dll_polymorphic_base dll_polymorphic_derived2 ]
|
||||
[ test-bsl-run_polymorphic_files test_no_rtti : polymorphic_base polymorphic_derived1 polymorphic_derived2 ]
|
||||
[ test-bsl-run_polymorphic_files test_exported : polymorphic_base polymorphic_derived1 polymorphic_derived2 ]
|
||||
[ test-bsl-run_polymorphic_files test_polymorphic : test_polymorphic_A A ]
|
||||
[ test-bsl-run_polymorphic_files test_polymorphic2 : test_polymorphic2imp ]
|
||||
[ test-bsl-run_polymorphic_files test_polymorphic_helper ]
|
||||
[ test-bsl-run_polymorphic_archive test_polymorphic : test_polymorphic_A A ]
|
||||
[ test-bsl-run_polymorphic_archive test_polymorphic2 : test_polymorphic2imp ]
|
||||
[ test-bsl-run_polymorphic_archive test_polymorphic_helper ]
|
||||
|
||||
# should compile
|
||||
[ compile test_strong_typedef.cpp ]
|
||||
@@ -130,17 +133,13 @@ test-suite "serialization" :
|
||||
|
||||
if ! $(BOOST_ARCHIVE_LIST) {
|
||||
test-suite "serialization2" :
|
||||
[ test-bsl-run test_inclusion ]
|
||||
[ test-bsl-run test_inclusion2 ]
|
||||
# boost build has the feature that the building if libraries vs dll is automatic
|
||||
# in that dependent libraries are built the same way - shared/static - that
|
||||
# the application is. On some platforms (e.g windows) this is required to avoid
|
||||
# problems of linking incompatible versions of the runtime library. So
|
||||
# we suppress tests of our dlls when using static libraries
|
||||
|
||||
[ test-bsl-run test_dll_simple : : dll_a : ]
|
||||
# [ test-bsl-run test_dll_plugin : : dll_derived2 : <link>static:<build>no <target-os>linux:<linkflags>-ldl ]
|
||||
|
||||
[ test-bsl-run-no-lib test_inclusion ]
|
||||
[ test-bsl-run test_dll_exported : : dll_polymorphic_derived2_lib ]
|
||||
[ test-bsl-run test_dll_simple : : dll_a_lib ]
|
||||
[ compile test_dll_plugin.cpp ]
|
||||
# Running the following test requires that the test know the directory
|
||||
# in which the dll is stored. I don't know how to extract this from bjam
|
||||
# [ test-bsl-run test_dll_plugin : : dll_polymorphic_derived2_lib ]
|
||||
[ test-bsl-run test_private_ctor ]
|
||||
[ test-bsl-run test_reset_object_address : A ]
|
||||
[ test-bsl-run test_void_cast ]
|
||||
@@ -148,12 +147,13 @@ if ! $(BOOST_ARCHIVE_LIST) {
|
||||
[ test-bsl-run test_iterators ]
|
||||
[ test-bsl-run test_iterators_base64 ]
|
||||
[ test-bsl-run test_smart_cast ]
|
||||
[ test-bsl-run test_codecvt_null ]
|
||||
[ test-bsl-run test_singleton ]
|
||||
[ test-bsl-run test_singleton_inherited ]
|
||||
[ test-bsl-run test_singleton_plain ]
|
||||
|
||||
# [ test-bsl-run test_z ]
|
||||
[ test-bsl-run test_codecvt_null
|
||||
: ../src/codecvt_null
|
||||
:
|
||||
: [ requires std_wstreambuf ]
|
||||
]
|
||||
|
||||
#[ test-bsl-run test_z ]
|
||||
|
||||
# should fail compilation
|
||||
[ compile-fail test_not_serializable.cpp ]
|
||||
@@ -171,7 +171,6 @@ if ! $(BOOST_ARCHIVE_LIST) {
|
||||
[ compile test_const_save_warn1.cpp ]
|
||||
[ compile test_const_save_warn2.cpp ]
|
||||
[ compile test_const_save_warn3.cpp ]
|
||||
|
||||
# note - library unable to detect these errors for now
|
||||
#[ compile test_const_save_warn1_nvp.cpp ]
|
||||
#[ compile test_const_save_warn2_nvp.cpp ]
|
||||
@@ -182,4 +181,3 @@ if ! $(BOOST_ARCHIVE_LIST) {
|
||||
[ compile test_const_pass.cpp ]
|
||||
;
|
||||
}
|
||||
|
||||
|
||||
+8
-5
@@ -26,7 +26,8 @@ A_DLL_DECL void A::serialize(
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
template
|
||||
A_DLL_DECL void A::serialize(
|
||||
A_DLL_DECL
|
||||
void A::serialize(
|
||||
boost::archive::text_iarchive &ar,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
@@ -37,13 +38,15 @@ A_DLL_DECL void A::serialize(
|
||||
#include <boost/archive/polymorphic_iarchive.hpp>
|
||||
|
||||
template
|
||||
A_DLL_DECL void A::serialize(
|
||||
boost::archive::polymorphic_oarchive &,
|
||||
A_DLL_DECL
|
||||
void A::serialize(
|
||||
boost::archive::polymorphic_oarchive &ar,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
template
|
||||
A_DLL_DECL void A::serialize(
|
||||
boost::archive::polymorphic_iarchive &,
|
||||
A_DLL_DECL
|
||||
void A::serialize(
|
||||
boost::archive::polymorphic_iarchive &ar,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// test_multi_shared_lib.cpp: test that implementation of extented_type_info
|
||||
// works when using multiple shared libraries
|
||||
|
||||
// (C) Copyright 2018 Alexander Grund
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/archive/text_oarchive.hpp>
|
||||
#include <iostream>
|
||||
|
||||
struct X1{
|
||||
template<class Archive>
|
||||
void serialize(Archive &, const unsigned int){}
|
||||
};
|
||||
|
||||
BOOST_CLASS_IMPLEMENTATION(X1, boost::serialization::object_class_info)
|
||||
|
||||
BOOST_SYMBOL_EXPORT bool f(){
|
||||
boost::archive::text_oarchive(std::cout) & X1();
|
||||
return true;
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
/////////1/////////2/////////3/////////4/////////5/////////6/////////7/////////8
|
||||
// multi_shared2.cpp: library simply using extended_type_info_typeid
|
||||
|
||||
// (C) Copyright 2018 Alexander Grund
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
#include <boost/archive/text_oarchive.hpp>
|
||||
#include <iostream>
|
||||
|
||||
struct X2{
|
||||
template<class Archive>
|
||||
void serialize(Archive &, const unsigned int){}
|
||||
};
|
||||
|
||||
BOOST_CLASS_IMPLEMENTATION(X2, boost::serialization::object_class_info)
|
||||
|
||||
BOOST_SYMBOL_EXPORT bool g(){
|
||||
boost::archive::text_oarchive(std::cout) & X2();
|
||||
return true;
|
||||
}
|
||||
@@ -10,30 +10,6 @@
|
||||
|
||||
#include <boost/serialization/export.hpp>
|
||||
|
||||
#define POLYMORPHIC_BASE_EXPORT
|
||||
#include "polymorphic_base.hpp"
|
||||
|
||||
template<class Archive>
|
||||
POLYMORPHIC_BASE_DLL_DECL void polymorphic_base::serialize(
|
||||
Archive &ar,
|
||||
const unsigned int /* file_version */
|
||||
){}
|
||||
|
||||
POLYMORPHIC_BASE_DLL_DECL
|
||||
polymorphic_base::polymorphic_base(){}
|
||||
POLYMORPHIC_BASE_DLL_DECL
|
||||
polymorphic_base::~polymorphic_base(){}
|
||||
|
||||
#include <boost/archive/polymorphic_oarchive.hpp>
|
||||
#include <boost/archive/polymorphic_iarchive.hpp>
|
||||
|
||||
template
|
||||
POLYMORPHIC_BASE_DLL_DECL void polymorphic_base::serialize(
|
||||
boost::archive::polymorphic_oarchive &,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
template POLYMORPHIC_BASE_DLL_DECL void polymorphic_base::serialize(
|
||||
boost::archive::polymorphic_iarchive &,
|
||||
const unsigned int
|
||||
);
|
||||
BOOST_CLASS_EXPORT_IMPLEMENT(polymorphic_base)
|
||||
|
||||
@@ -24,35 +24,20 @@
|
||||
#include <boost/serialization/type_info_implementation.hpp>
|
||||
#include <boost/serialization/extended_type_info_no_rtti.hpp>
|
||||
|
||||
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
|
||||
#if defined(POLYMORPHIC_BASE_IMPORT)
|
||||
#define POLYMORPHIC_BASE_DLL_DECL BOOST_SYMBOL_IMPORT
|
||||
#pragma message ("polymorphic_base imported")
|
||||
#elif defined(POLYMORPHIC_BASE_EXPORT)
|
||||
#define POLYMORPHIC_BASE_DLL_DECL BOOST_SYMBOL_EXPORT
|
||||
#pragma message ("polymorphic_base exported")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef POLYMORPHIC_BASE_DLL_DECL
|
||||
#define POLYMORPHIC_BASE_DLL_DECL
|
||||
#endif
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_base
|
||||
{
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
POLYMORPHIC_BASE_DLL_DECL void serialize(
|
||||
void serialize(
|
||||
Archive & /* ar */,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
){}
|
||||
public:
|
||||
// note that since this class uses the "no_rtti"
|
||||
// extended_type_info implementation, it MUST
|
||||
// implement this function
|
||||
virtual const char * get_key() const = 0;
|
||||
POLYMORPHIC_BASE_DLL_DECL polymorphic_base();
|
||||
POLYMORPHIC_BASE_DLL_DECL virtual ~polymorphic_base();
|
||||
virtual ~polymorphic_base(){};
|
||||
};
|
||||
|
||||
BOOST_SERIALIZATION_ASSUME_ABSTRACT(polymorphic_base)
|
||||
@@ -62,7 +47,7 @@ BOOST_CLASS_EXPORT_KEY(polymorphic_base)
|
||||
|
||||
BOOST_CLASS_TYPE_INFO(
|
||||
polymorphic_base,
|
||||
extended_type_info_no_rtti<polymorphic_base>
|
||||
boost::serialization::extended_type_info_no_rtti<polymorphic_base>
|
||||
)
|
||||
|
||||
#endif // POLYMORPHIC_BASE_HPP
|
||||
|
||||
@@ -20,18 +20,4 @@ const char * polymorphic_derived1::get_key() const {
|
||||
>::type::get_const_instance().get_key();
|
||||
}
|
||||
|
||||
#include <boost/archive/polymorphic_oarchive.hpp>
|
||||
#include <boost/archive/polymorphic_iarchive.hpp>
|
||||
|
||||
template
|
||||
void polymorphic_derived1::serialize(
|
||||
boost::archive::polymorphic_oarchive &,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
template
|
||||
void polymorphic_derived1::serialize(
|
||||
boost::archive::polymorphic_iarchive &,
|
||||
const unsigned int
|
||||
);
|
||||
|
||||
BOOST_CLASS_EXPORT_IMPLEMENT(polymorphic_derived1)
|
||||
|
||||
@@ -12,40 +12,49 @@
|
||||
#include <boost/serialization/extended_type_info_no_rtti.hpp>
|
||||
#include <boost/serialization/export.hpp>
|
||||
|
||||
#define POLYMORPHIC_BASE_IMPORT
|
||||
#include "polymorphic_base.hpp"
|
||||
|
||||
#define POLYMORPHIC_DERIVED2_EXPORT
|
||||
#include "polymorphic_derived2.hpp"
|
||||
|
||||
template<class Archive>
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL void polymorphic_derived2::serialize(
|
||||
Archive &ar,
|
||||
void polymorphic_derived2::serialize(
|
||||
Archive &ar,
|
||||
const unsigned int /* file_version */
|
||||
){
|
||||
ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(polymorphic_base);
|
||||
}
|
||||
|
||||
const char * polymorphic_derived2::get_key() const {
|
||||
return "polymorphic_derived2";
|
||||
}
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
polymorphic_derived2::polymorphic_derived2(){}
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
polymorphic_derived2::~polymorphic_derived2(){}
|
||||
|
||||
#include <boost/archive/polymorphic_oarchive.hpp>
|
||||
#include <boost/archive/polymorphic_iarchive.hpp>
|
||||
// instantiate code for text archives
|
||||
#include <boost/archive/text_oarchive.hpp>
|
||||
#include <boost/archive/text_iarchive.hpp>
|
||||
|
||||
template
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL void polymorphic_derived2::serialize(
|
||||
boost::archive::polymorphic_oarchive &,
|
||||
const unsigned int /* file_version */
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
void polymorphic_derived2::serialize(
|
||||
boost::archive::text_oarchive & ar,
|
||||
const unsigned int version
|
||||
);
|
||||
template
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL void polymorphic_derived2::serialize(
|
||||
boost::archive::polymorphic_iarchive &,
|
||||
const unsigned int
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
void polymorphic_derived2::serialize(
|
||||
boost::archive::text_iarchive & ar,
|
||||
const unsigned int version
|
||||
);
|
||||
|
||||
// instantiate code for polymorphic archives
|
||||
#include <boost/archive/polymorphic_iarchive.hpp>
|
||||
#include <boost/archive/polymorphic_oarchive.hpp>
|
||||
|
||||
template
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
void polymorphic_derived2::serialize(
|
||||
boost::archive::polymorphic_oarchive & ar,
|
||||
const unsigned int version
|
||||
);
|
||||
template
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
void polymorphic_derived2::serialize(
|
||||
boost::archive::polymorphic_iarchive & ar,
|
||||
const unsigned int version
|
||||
);
|
||||
|
||||
// MWerks users can do this to make their code work
|
||||
@@ -53,3 +62,13 @@ BOOST_SERIALIZATION_MWERKS_BASE_AND_DERIVED(polymorphic_base, polymorphic_derive
|
||||
|
||||
// note: export has to be AFTER #includes for all archive classes
|
||||
BOOST_CLASS_EXPORT_IMPLEMENT(polymorphic_derived2)
|
||||
|
||||
#if 0
|
||||
#include <boost/serialization/factory.hpp>
|
||||
BOOST_SERIALIZATION_FACTORY_0(polymorphic_derived2)
|
||||
|
||||
template
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
void polymorphic_derived2 *
|
||||
boost::serialization::factory<polymorphic_derived2, 0>(std::va_list ap);
|
||||
#endif
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#ifndef BOOST_SERIALIZATION_TEST_POLYMORPHIC_DERIVED2_HPP
|
||||
#define BOOST_SERIALIZATION_TEST_POLYMORPHIC_DERIVED2_HPP
|
||||
#ifndef POLYMORPHIC_DERIVED2_HPP
|
||||
#define POLYMORPHIC_DERIVED2_HPP
|
||||
|
||||
// MS compatible compilers support #pragma once
|
||||
#if defined(_MSC_VER)
|
||||
@@ -24,36 +24,30 @@
|
||||
#include <boost/serialization/type_info_implementation.hpp>
|
||||
#include <boost/serialization/extended_type_info_typeid.hpp>
|
||||
|
||||
#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SERIALIZATION_DYN_LINK)
|
||||
#if defined(POLYMORPHIC_DERIVED2_IMPORT)
|
||||
#define POLYMORPHIC_DERIVED2_DLL_DECL BOOST_SYMBOL_IMPORT
|
||||
#pragma message ("polymorphic_derived2 imported")
|
||||
#elif defined(POLYMORPHIC_DERIVED2_EXPORT)
|
||||
#define POLYMORPHIC_DERIVED2_DLL_DECL BOOST_SYMBOL_EXPORT
|
||||
#pragma message ("polymorphic_derived2 exported")
|
||||
#endif
|
||||
#endif
|
||||
#include "polymorphic_base.hpp"
|
||||
|
||||
#ifndef POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
#if defined(POLYMORPHIC_DERIVED2_IMPORT)
|
||||
#define POLYMORPHIC_DERIVED2_DLL_DECL BOOST_SYMBOL_IMPORT
|
||||
#pragma message ("polymorphic_derived2 imported")
|
||||
#elif defined(POLYMORPHIC_DERIVED2_EXPORT)
|
||||
#define POLYMORPHIC_DERIVED2_DLL_DECL BOOST_SYMBOL_EXPORT
|
||||
#pragma message ("polymorphic_derived2 exported")
|
||||
#else
|
||||
#define POLYMORPHIC_DERIVED2_DLL_DECL
|
||||
#endif
|
||||
|
||||
#define POLYMORPHIC_BASE_IMPORT
|
||||
#include "polymorphic_base.hpp"
|
||||
|
||||
class BOOST_SYMBOL_VISIBLE polymorphic_derived2 :
|
||||
class POLYMORPHIC_DERIVED2_DLL_DECL polymorphic_derived2 :
|
||||
public polymorphic_base
|
||||
{
|
||||
friend class boost::serialization::access;
|
||||
template<class Archive>
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL void serialize(
|
||||
Archive &ar,
|
||||
void serialize(
|
||||
Archive &ar,
|
||||
const unsigned int /* file_version */
|
||||
);
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL const char * get_key() const;
|
||||
public:
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL polymorphic_derived2();
|
||||
POLYMORPHIC_DERIVED2_DLL_DECL ~polymorphic_derived2();
|
||||
virtual const char * get_key() const {
|
||||
return "polymorphic_derived2";
|
||||
}
|
||||
};
|
||||
|
||||
// we use this because we want to assign a key to this type
|
||||
@@ -69,5 +63,5 @@ BOOST_CLASS_TYPE_INFO(
|
||||
boost::serialization::extended_type_info_typeid<polymorphic_derived2>
|
||||
)
|
||||
|
||||
#endif // BOOST_SERIALIZATION_TEST_POLYMORPHIC_DERIVED2_HPP
|
||||
#endif // POLYMORPHIC_DERIVED2_HPP
|
||||
|
||||
|
||||
Executable
+35
@@ -0,0 +1,35 @@
|
||||
/*****************************************************************************/
|
||||
/**
|
||||
* \file polymorphic_portable_archive.hpp
|
||||
* \brief Needed for unit tests on portable archives.
|
||||
* \author christian.pfligersdorffer@gmx.at
|
||||
*
|
||||
* Header for testing portable archives with all of the serialization tests.
|
||||
* Before use copy all hpp files from this directory to your boost folder
|
||||
* boost_.../libs/serialization/test and run from there a visual studio
|
||||
* prompt with b2 oder bjam -sBOOST_ARCHIVE_LIST=portable_archive.hpp
|
||||
*
|
||||
* \note Since portable archives version 5.0 we depend on program_options!
|
||||
* Edit libs/serialization/test/Jamfile.v2 and change the requirements to
|
||||
* : requirements <source>/boost/filesystem <source>/boost/program_options
|
||||
*/
|
||||
/****************************************************************************/
|
||||
|
||||
#pragma warning( disable:4217 4127 4310 4244 4800 4267 )
|
||||
|
||||
// portable_archive test header
|
||||
// include output archive header
|
||||
#include <boost/archive/portable_oarchive.hpp>
|
||||
// set name of test output archive
|
||||
typedef eos::polymorphic_portable_oarchive test_oarchive;
|
||||
// set name of test output stream
|
||||
typedef std::ofstream test_ostream;
|
||||
|
||||
// repeat the above for input archive
|
||||
#include <boost/archive/portable_iarchive.hpp>
|
||||
typedef eos::polymorphic_portable_iarchive test_iarchive;
|
||||
typedef std::ifstream test_istream;
|
||||
|
||||
// define open mode for streams
|
||||
// binary archives should use std::ios_base::binary
|
||||
#define TEST_STREAM_FLAGS std::ios_base::binary
|
||||
@@ -0,0 +1,25 @@
|
||||
// (C) Copyright 2002-4 Robert Ramey - http://www.rrsd.com .
|
||||
// Use, modification and distribution is subject to the Boost Software
|
||||
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
|
||||
// http://www.boost.org/LICENSE_1_0.txt)
|
||||
|
||||
// See http://www.boost.org for updates, documentation, and revision history.
|
||||
// file includes for testing a custom archive.
|
||||
// as an example this tests the portable binary archive
|
||||
|
||||
#include <fstream>
|
||||
|
||||
// #include output archive header
|
||||
#include <boost/archive/portable_oarchive.hpp>
|
||||
// define output archive class to be used
|
||||
typedef eos::portable_oarchive test_oarchive;
|
||||
// and corresponding stream
|
||||
typedef std::ofstream test_ostream;
|
||||
|
||||
// repeat the above for correspondng input archive
|
||||
#include <boost/archive/portable_iarchive.hpp>
|
||||
typedef eos::portable_iarchive test_iarchive;
|
||||
typedef std::ifstream test_istream;
|
||||
|
||||
// and stream open flags
|
||||
#define TEST_STREAM_FLAGS std::ios::binary
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user