translation for russian starts #85

Merged
andrey merged 18 commits from doxygen-ru into master 2022-03-25 12:12:36 +03:00
162 changed files with 3847 additions and 2187 deletions

View File

@@ -3,7 +3,7 @@ cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(pip) project(pip)
set(pip_MAJOR 2) set(pip_MAJOR 2)
set(pip_MINOR 34) set(pip_MINOR 34)
set(pip_REVISION 0) set(pip_REVISION 1)
set(pip_SUFFIX ) set(pip_SUFFIX )
set(pip_COMPANY SHS) set(pip_COMPANY SHS)
set(pip_DOMAIN org.SHS) set(pip_DOMAIN org.SHS)
@@ -553,13 +553,21 @@ if ((NOT PIP_FREERTOS) AND (NOT CROSSTOOLS))
set(DOXY_PROJECT_NUMBER "${pip_VERSION}") set(DOXY_PROJECT_NUMBER "${pip_VERSION}")
set(DOXY_QHP_CUST_FILTER_ATTRS "\"PIP ${pip_VERSION}\"") set(DOXY_QHP_CUST_FILTER_ATTRS "\"PIP ${pip_VERSION}\"")
set(DOXY_QHP_SECT_FILTER_ATTRS "\"PIP ${pip_VERSION}\"") set(DOXY_QHP_SECT_FILTER_ATTRS "\"PIP ${pip_VERSION}\"")
set(DOXY_EXAMPLE_PATH "\"${CMAKE_CURRENT_SOURCE_DIR}/doc/examples\"") set(DOXY_EXAMPLE_PATH "\"${CMAKE_CURRENT_SOURCE_DIR}/doc/examples\"")
set(DOXY_IMAGE_PATH "\"${CMAKE_CURRENT_SOURCE_DIR}/doc/images\"") set(DOXY_IMAGE_PATH "\"${CMAKE_CURRENT_SOURCE_DIR}/doc/images\"")
set(DOXY_EXCLUDE "\"${CMAKE_CURRENT_SOURCE_DIR}/libs/lua/3rd\"") set(DOXY_LOGO_PATH "\"${CMAKE_CURRENT_SOURCE_DIR}/doc/pip.png\"")
set(DOXY_EXCLUDE "\"${CMAKE_CURRENT_SOURCE_DIR}/libs/lua/3rd\"")
set(DOXY_DOMAIN "${pip_DOMAIN}.${PROJECT_NAME}.doc")
if ("x${DOC_LANG}" STREQUAL "x")
set(DOXY_OUTPUT_LANGUAGE English)
set(DOXY_OUTPUT_DIR en)
else()
set(DOXY_OUTPUT_LANGUAGE ${DOC_LANG})
set(DOXY_OUTPUT_DIR ${DOC_DIR})
endif()
if(DOXYGEN_DOT_EXECUTABLE) if(DOXYGEN_DOT_EXECUTABLE)
string(REPLACE "\\" "" _DOT_PATH "${DOXYGEN_DOT_PATH}") string(REPLACE "\\" "/" _DOT_PATH "${DOXYGEN_DOT_PATH}")
set(DOXY_DOT_PATH "\"${_DOT_PATH}\"") set(DOXY_DOT_PATH "\"${_DOT_PATH}\"")
set(DOXY_MSCGEN_PATH "\"${_DOT_PATH}\"")
set(DOXY_DIA_PATH "\"${_DOT_PATH}\"") set(DOXY_DIA_PATH "\"${_DOT_PATH}\"")
endif() endif()
set(DOXY_INPUT) set(DOXY_INPUT)

View File

@@ -33,4 +33,6 @@ You should add ${<out_var>} to your target.
## Documentation ## Documentation
[Online documentation](https://shs.tools/pip/html/index.html) [Online documentation](https://shs.tools/pip/html/en/index.html)
[Документация на Русском языке](https://shs.tools/pip/html/ru/index.html)

View File

@@ -1,7 +1,7 @@
macro(ADD_DOCUMENTATION TARGET DOXYGEN_CONFIG_FILE) macro(ADD_DOCUMENTATION TARGET DOXYGEN_CONFIG_FILE)
if(DOXYGEN_FOUND) if(DOXYGEN_FOUND)
configure_file("${PROJECT_SOURCE_DIR}/${DOXYGEN_CONFIG_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/doxyfile-${TARGET}") configure_file("${PROJECT_SOURCE_DIR}/${DOXYGEN_CONFIG_FILE}" "${CMAKE_CURRENT_BINARY_DIR}/doxyfile-${TARGET}")
add_custom_target("genereate.${TARGET}" COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxyfile-${TARGET}) add_custom_target("genereate.${TARGET}" COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/doc/html" COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/doxyfile-${TARGET})
add_custom_target("${TARGET}" COMMAND ${CMAKE_COMMAND} -D COMPONENT=doc -P cmake_install.cmake) add_custom_target("${TARGET}" COMMAND ${CMAKE_COMMAND} -D COMPONENT=doc -P cmake_install.cmake)
add_dependencies("${TARGET}" "genereate.${TARGET}") add_dependencies("${TARGET}" "genereate.${TARGET}")
else(DOXYGEN_FOUND) else(DOXYGEN_FOUND)

View File

@@ -1,4 +1,4 @@
# Doxyfile 1.8.15 # Doxyfile 1.9.1
# This file describes the settings to be used by the documentation system # This file describes the settings to be used by the documentation system
# doxygen (www.doxygen.org) for a project. # doxygen (www.doxygen.org) for a project.
@@ -51,7 +51,7 @@ PROJECT_BRIEF = "Platform-Independent Primitives"
# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy # pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
# the logo to the output directory. # the logo to the output directory.
PROJECT_LOGO = PROJECT_LOGO = ${DOXY_LOGO_PATH}
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
# into which the generated documentation will be written. If a relative path is # into which the generated documentation will be written. If a relative path is
@@ -91,7 +91,7 @@ ALLOW_UNICODE_NAMES = NO
# Ukrainian and Vietnamese. # Ukrainian and Vietnamese.
# The default value is: English. # The default value is: English.
OUTPUT_LANGUAGE = English OUTPUT_LANGUAGE = ${DOXY_OUTPUT_LANGUAGE}
# The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all # The OUTPUT_TEXT_DIRECTION tag is used to specify the direction in which all
# documentation generated by doxygen is written. Doxygen will use this # documentation generated by doxygen is written. Doxygen will use this
@@ -158,7 +158,7 @@ INLINE_INHERITED_MEMB = NO
# shortest path that makes the file name unique will be used # shortest path that makes the file name unique will be used
# The default value is: YES. # The default value is: YES.
FULL_PATH_NAMES = YES FULL_PATH_NAMES = NO
# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. # The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
# Stripping is only done if one of the specified strings matches the left-hand # Stripping is only done if one of the specified strings matches the left-hand
@@ -197,10 +197,20 @@ SHORT_NAMES = NO
JAVADOC_AUTOBRIEF = NO JAVADOC_AUTOBRIEF = NO
# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
# such as
# /***************
# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
# Javadoc-style will behave just like regular comments and it will not be
# interpreted by doxygen.
# The default value is: NO.
JAVADOC_BANNER = NO
# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first # If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
# line (until the first dot) of a Qt-style comment as the brief description. If # line (until the first dot) of a Qt-style comment as the brief description. If
# set to NO, the Qt-style will behave just like regular Qt-style comments (thus # set to NO, the Qt-style will behave just like regular Qt-style comments (thus
# requiring an explicit @brief command for a brief description.) # requiring an explicit \brief command for a brief description.)
# The default value is: NO. # The default value is: NO.
QT_AUTOBRIEF = NO QT_AUTOBRIEF = NO
@@ -215,7 +225,15 @@ QT_AUTOBRIEF = NO
# not recognized any more. # not recognized any more.
# The default value is: NO. # The default value is: NO.
MULTILINE_CPP_IS_BRIEF = NO MULTILINE_CPP_IS_BRIEF = YES
# By default Python docstrings are displayed as preformatted text and doxygen's
# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
# doxygen's special commands can be used and the contents of the docstring
# documentation blocks is shown as doxygen documentation.
# The default value is: YES.
PYTHON_DOCSTRING = YES
# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the # If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
# documentation from any documented member that it re-implements. # documentation from any documented member that it re-implements.
@@ -256,12 +274,6 @@ ALIASES = "handlers=\name Handlers" \
"events=\name Events" \ "events=\name Events" \
"ioparams=\name Configurable parameters" "ioparams=\name Configurable parameters"
# This tag can be used to specify a number of word-keyword mappings (TCL only).
# A mapping has the form "name=value". For example adding "class=itcl::class"
# will allow you to use the command class in the itcl::class meaning.
TCL_SUBST =
# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources # Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
# only. Doxygen will then generate output that is more tailored for C. For # only. Doxygen will then generate output that is more tailored for C. For
# instance, some of the names that are used will be different. The list of all # instance, some of the names that are used will be different. The list of all
@@ -302,19 +314,22 @@ OPTIMIZE_OUTPUT_SLICE = NO
# parses. With this tag you can assign which parser to use for a given # parses. With this tag you can assign which parser to use for a given
# extension. Doxygen has a built-in mapping, but you can override or extend it # extension. Doxygen has a built-in mapping, but you can override or extend it
# using this tag. The format is ext=language, where ext is a file extension, and # using this tag. The format is ext=language, where ext is a file extension, and
# language is one of the parsers supported by doxygen: IDL, Java, Javascript, # language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
# Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, # Csharp (C#), C, C++, D, PHP, md (Markdown), Objective-C, Python, Slice, VHDL,
# Fortran (fixed format Fortran: FortranFixed, free formatted Fortran: # Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser # FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
# tries to guess whether the code is fixed or free formatted code, this is the # tries to guess whether the code is fixed or free formatted code, this is the
# default for Fortran type files), VHDL, tcl. For instance to make doxygen treat # default for Fortran type files). For instance to make doxygen treat .inc files
# .inc files as Fortran files (default is PHP), and .f files as C (default is # as Fortran files (default is PHP), and .f files as C (default is Fortran),
# Fortran), use: inc=Fortran f=C. # use: inc=Fortran f=C.
# #
# Note: For files without extension you can use no_extension as a placeholder. # Note: For files without extension you can use no_extension as a placeholder.
# #
# Note that for custom extensions you also need to set FILE_PATTERNS otherwise # Note that for custom extensions you also need to set FILE_PATTERNS otherwise
# the files are not read by doxygen. # the files are not read by doxygen. When specifying no_extension you should add
# * to the FILE_PATTERNS.
#
# Note see also the list of default file extension mappings.
EXTENSION_MAPPING = EXTENSION_MAPPING =
@@ -332,7 +347,7 @@ MARKDOWN_SUPPORT = YES
# to that level are automatically included in the table of contents, even if # to that level are automatically included in the table of contents, even if
# they do not have an id attribute. # they do not have an id attribute.
# Note: This feature currently applies only to Markdown headings. # Note: This feature currently applies only to Markdown headings.
# Minimum value: 0, maximum value: 99, default value: 0. # Minimum value: 0, maximum value: 99, default value: 5.
# This tag requires that the tag MARKDOWN_SUPPORT is set to YES. # This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
TOC_INCLUDE_HEADINGS = 0 TOC_INCLUDE_HEADINGS = 0
@@ -353,7 +368,7 @@ AUTOLINK_SUPPORT = YES
# diagrams that involve STL classes more complete and accurate. # diagrams that involve STL classes more complete and accurate.
# The default value is: NO. # The default value is: NO.
BUILTIN_STL_SUPPORT = NO BUILTIN_STL_SUPPORT = YES
# If you use Microsoft's C++/CLI language, you should set this option to YES to # If you use Microsoft's C++/CLI language, you should set this option to YES to
# enable parsing support. # enable parsing support.
@@ -448,6 +463,19 @@ TYPEDEF_HIDES_STRUCT = NO
LOOKUP_CACHE_SIZE = 0 LOOKUP_CACHE_SIZE = 0
# The NUM_PROC_THREADS specifies the number threads doxygen is allowed to use
# during processing. When set to 0 doxygen will based this on the number of
# cores available in the system. You can set it explicitly to a value larger
# than 0 to get more control over the balance between CPU load and processing
# speed. At this moment only the input processing can be done using multiple
# threads. Since this is still an experimental feature the default is set to 1,
# which efficively disables parallel processing. Please report any issues you
# encounter. Generating dot graphs in parallel is controlled by the
# DOT_NUM_THREADS setting.
# Minimum value: 0, maximum value: 32, default value: 1.
NUM_PROC_THREADS = 1
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Build related configuration options # Build related configuration options
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -468,6 +496,12 @@ EXTRACT_ALL = NO
EXTRACT_PRIVATE = NO EXTRACT_PRIVATE = NO
# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
# methods of a class will be included in the documentation.
# The default value is: NO.
EXTRACT_PRIV_VIRTUAL = YES
# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal # If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
# scope will be included in the documentation. # scope will be included in the documentation.
# The default value is: NO. # The default value is: NO.
@@ -505,6 +539,13 @@ EXTRACT_LOCAL_METHODS = YES
EXTRACT_ANON_NSPACES = NO EXTRACT_ANON_NSPACES = NO
# If this flag is set to YES, the name of an unnamed parameter in a declaration
# will be determined by the corresponding definition. By default unnamed
# parameters remain unnamed in the output.
# The default value is: YES.
RESOLVE_UNNAMED_PARAMS = YES
# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all # If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
# undocumented members inside documented classes or files. If set to NO these # undocumented members inside documented classes or files. If set to NO these
# members will be included in the various overviews, but no documentation # members will be included in the various overviews, but no documentation
@@ -522,8 +563,8 @@ HIDE_UNDOC_MEMBERS = YES
HIDE_UNDOC_CLASSES = YES HIDE_UNDOC_CLASSES = YES
# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend # If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
# (class|struct|union) declarations. If set to NO, these declarations will be # declarations. If set to NO, these declarations will be included in the
# included in the documentation. # documentation.
# The default value is: NO. # The default value is: NO.
HIDE_FRIEND_COMPOUNDS = YES HIDE_FRIEND_COMPOUNDS = YES
@@ -542,11 +583,18 @@ HIDE_IN_BODY_DOCS = NO
INTERNAL_DOCS = NO INTERNAL_DOCS = NO
# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file # With the correct setting of option CASE_SENSE_NAMES doxygen will better be
# names in lower-case letters. If set to YES, upper-case letters are also # able to match the capabilities of the underlying filesystem. In case the
# allowed. This is useful if you have classes or files whose names only differ # filesystem is case sensitive (i.e. it supports files in the same directory
# in case and if your file system supports case sensitive file names. Windows # whose names only differ in casing), the option must be set to YES to properly
# and Mac users are advised to set this option to NO. # deal with such files in case they appear in the input. For filesystems that
# are not case sensitive the option should be be set to NO to properly deal with
# output files written for symbols that only differ in casing, such as for two
# classes, one named CLASS and the other named Class, and to also support
# references to files without having to specify the exact matching casing. On
# Windows (including Cygwin) and MacOS, users should typically set this option
# to NO, whereas on Linux or other Unix flavors it should typically be set to
# YES.
# The default value is: system dependent. # The default value is: system dependent.
CASE_SENSE_NAMES = NO CASE_SENSE_NAMES = NO
@@ -576,7 +624,7 @@ SHOW_INCLUDE_FILES = NO
# which file to include in order to use the member. # which file to include in order to use the member.
# The default value is: NO. # The default value is: NO.
SHOW_GROUPED_MEMB_INC = NO SHOW_GROUPED_MEMB_INC = YES
# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include # If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
# files with double quotes in the documentation rather than with sharp brackets. # files with double quotes in the documentation rather than with sharp brackets.
@@ -785,7 +833,10 @@ WARN_IF_DOC_ERROR = YES
WARN_NO_PARAMDOC = NO WARN_NO_PARAMDOC = NO
# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when # If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
# a warning is encountered. # a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
# at the end of the doxygen process doxygen will return with a non-zero status.
# Possible values are: NO, YES and FAIL_ON_WARNINGS.
# The default value is: NO. # The default value is: NO.
WARN_AS_ERROR = NO WARN_AS_ERROR = NO
@@ -821,8 +872,8 @@ INPUT = ${DOXY_INPUT}
# This tag can be used to specify the character encoding of the source files # This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses # that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
# libiconv (or the iconv built into libc) for the transcoding. See the libiconv # libiconv (or the iconv built into libc) for the transcoding. See the libiconv
# documentation (see: https://www.gnu.org/software/libiconv/) for the list of # documentation (see:
# possible encodings. # https://www.gnu.org/software/libiconv/) for the list of possible encodings.
# The default value is: UTF-8. # The default value is: UTF-8.
INPUT_ENCODING = UTF-8 INPUT_ENCODING = UTF-8
@@ -835,46 +886,20 @@ INPUT_ENCODING = UTF-8
# need to set EXTENSION_MAPPING for the extension otherwise the files are not # need to set EXTENSION_MAPPING for the extension otherwise the files are not
# read by doxygen. # read by doxygen.
# #
# Note the list of default checked file patterns might differ from the list of
# default file extension mappings.
#
# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp, # If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, # *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
# *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, # *.hh, *.hxx, *.hpp, *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc,
# *.m, *.markdown, *.md, *.mm, *.dox, *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, # *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C comment),
# *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, *.qsf and *.ice. # *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd, *.vhdl,
# *.ucf, *.qsf and *.ice.
FILE_PATTERNS = *.c \ FILE_PATTERNS = *.c \
*.cc \
*.cxx \
*.cpp \ *.cpp \
*.c++ \
*.d \
*.java \
*.ii \
*.ixx \
*.ipp \
*.i++ \
*.inl \
*.h \ *.h \
*.hh \ *.md
*.hxx \
*.hpp \
*.h++ \
*.idl \
*.odl \
*.cs \
*.php \
*.php3 \
*.inc \
*.m \
*.markdown \
*.md \
*.mm \
*.dox \
*.py \
*.f90 \
*.f \
*.for \
*.vhd \
*.vhdl
# The RECURSIVE tag can be used to specify whether or not subdirectories should # The RECURSIVE tag can be used to specify whether or not subdirectories should
# be searched for input files as well. # be searched for input files as well.
@@ -1087,16 +1112,22 @@ USE_HTAGS = NO
VERBATIM_HEADERS = NO VERBATIM_HEADERS = NO
# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the # If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the
# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the # clang parser (see:
# cost of reduced performance. This can be particularly helpful with template # http://clang.llvm.org/) for more accurate parsing at the cost of reduced
# rich C++ code for which doxygen's built-in parser lacks the necessary type # performance. This can be particularly helpful with template rich C++ code for
# information. # which doxygen's built-in parser lacks the necessary type information.
# Note: The availability of this option depends on whether or not doxygen was # Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake. # generated with the -Duse_libclang=ON option for CMake.
# The default value is: NO. # The default value is: NO.
CLANG_ASSISTED_PARSING = NO CLANG_ASSISTED_PARSING = NO
# If clang assisted parsing is enabled and the CLANG_ADD_INC_PATHS tag is set to
# YES then doxygen will add the directory of each input to the include path.
# The default value is: YES.
CLANG_ADD_INC_PATHS = YES
# If clang assisted parsing is enabled you can provide the compiler with command # If clang assisted parsing is enabled you can provide the compiler with command
# line options that you would normally use when invoking the compiler. Note that # line options that you would normally use when invoking the compiler. Note that
# the include paths will already be set by doxygen for the files and directories # the include paths will already be set by doxygen for the files and directories
@@ -1106,10 +1137,13 @@ CLANG_ASSISTED_PARSING = NO
CLANG_OPTIONS = CLANG_OPTIONS =
# If clang assisted parsing is enabled you can provide the clang parser with the # If clang assisted parsing is enabled you can provide the clang parser with the
# path to the compilation database (see: # path to the directory containing a file called compile_commands.json. This
# http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) used when the files # file is the compilation database (see:
# were built. This is equivalent to specifying the "-p" option to a clang tool, # http://clang.llvm.org/docs/HowToSetupToolingForLLVM.html) containing the
# such as clang-check. These options will then be passed to the parser. # options used when the source files were built. This is equivalent to
# specifying the -p option to a clang tool, such as clang-check. These options
# will then be passed to the parser. Any options specified with CLANG_OPTIONS
# will be added as well.
# Note: The availability of this option depends on whether or not doxygen was # Note: The availability of this option depends on whether or not doxygen was
# generated with the -Duse_libclang=ON option for CMake. # generated with the -Duse_libclang=ON option for CMake.
@@ -1126,13 +1160,6 @@ CLANG_DATABASE_PATH =
ALPHABETICAL_INDEX = YES ALPHABETICAL_INDEX = YES
# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in
# which the alphabetical index list will be split.
# Minimum value: 1, maximum value: 20, default value: 5.
# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
COLS_IN_ALPHA_INDEX = 5
# In case all classes in a project start with a common prefix, all classes will # In case all classes in a project start with a common prefix, all classes will
# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag # be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
# can be used to specify a prefix (or a list of prefixes) that should be ignored # can be used to specify a prefix (or a list of prefixes) that should be ignored
@@ -1156,7 +1183,7 @@ GENERATE_HTML = YES
# The default directory is: html. # The default directory is: html.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_OUTPUT = html HTML_OUTPUT = html/${DOXY_OUTPUT_DIR}
# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each # The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
# generated HTML page (for example: .htm, .php, .asp). # generated HTML page (for example: .htm, .php, .asp).
@@ -1239,7 +1266,7 @@ HTML_EXTRA_FILES =
# Minimum value: 0, maximum value: 359, default value: 220. # Minimum value: 0, maximum value: 359, default value: 220.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_HUE = 246 HTML_COLORSTYLE_HUE = 221
# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors # The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
# in the HTML output. For a value of 0 the output will use grayscales only. A # in the HTML output. For a value of 0 the output will use grayscales only. A
@@ -1247,7 +1274,7 @@ HTML_COLORSTYLE_HUE = 246
# Minimum value: 0, maximum value: 255, default value: 100. # Minimum value: 0, maximum value: 255, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_COLORSTYLE_SAT = 79 HTML_COLORSTYLE_SAT = 100
# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the # The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
# luminance component of the colors in the HTML output. Values below 100 # luminance component of the colors in the HTML output. Values below 100
@@ -1271,9 +1298,9 @@ HTML_TIMESTAMP = YES
# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML # If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
# documentation will contain a main index with vertical navigation menus that # documentation will contain a main index with vertical navigation menus that
# are dynamically created via Javascript. If disabled, the navigation index will # are dynamically created via JavaScript. If disabled, the navigation index will
# consists of multiple levels of tabs that are statically embedded in every HTML # consists of multiple levels of tabs that are statically embedded in every HTML
# page. Disable this option to support browsers that do not have Javascript, # page. Disable this option to support browsers that do not have JavaScript,
# like the Qt help browser. # like the Qt help browser.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
@@ -1299,14 +1326,15 @@ HTML_DYNAMIC_SECTIONS = NO
# Minimum value: 0, maximum value: 9999, default value: 100. # Minimum value: 0, maximum value: 9999, default value: 100.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
HTML_INDEX_NUM_ENTRIES = 100 HTML_INDEX_NUM_ENTRIES = 1
# If the GENERATE_DOCSET tag is set to YES, additional index files will be # If the GENERATE_DOCSET tag is set to YES, additional index files will be
# generated that can be used as input for Apple's Xcode 3 integrated development # generated that can be used as input for Apple's Xcode 3 integrated development
# environment (see: https://developer.apple.com/xcode/), introduced with OSX # environment (see:
# 10.5 (Leopard). To create a documentation set, doxygen will generate a # https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
# Makefile in the HTML output directory. Running make will produce the docset in # create a documentation set, doxygen will generate a Makefile in the HTML
# that directory and running make install will install the docset in # output directory. Running make will produce the docset in that directory and
# running make install will install the docset in
# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at # ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy # startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
# genXcode/_index.html for more information. # genXcode/_index.html for more information.
@@ -1329,7 +1357,7 @@ DOCSET_FEEDNAME = "Doxygen generated docs"
# The default value is: org.doxygen.Project. # The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_DOCSET is set to YES. # This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_BUNDLE_ID = org.doxygen.Project DOCSET_BUNDLE_ID = ${DOXY_DOMAIN}
# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify # The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
# the documentation publisher. This should be a reverse domain-name style # the documentation publisher. This should be a reverse domain-name style
@@ -1337,19 +1365,19 @@ DOCSET_BUNDLE_ID = org.doxygen.Project
# The default value is: org.doxygen.Publisher. # The default value is: org.doxygen.Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES. # This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_PUBLISHER_ID = org.doxygen.Publisher DOCSET_PUBLISHER_ID = ${DOXY_DOMAIN}
# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. # The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
# The default value is: Publisher. # The default value is: Publisher.
# This tag requires that the tag GENERATE_DOCSET is set to YES. # This tag requires that the tag GENERATE_DOCSET is set to YES.
DOCSET_PUBLISHER_NAME = Publisher DOCSET_PUBLISHER_NAME = PIP
# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three # If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
# additional HTML index files: index.hhp, index.hhc, and index.hhk. The # additional HTML index files: index.hhp, index.hhc, and index.hhk. The
# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop # index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
# (see: https://www.microsoft.com/en-us/download/details.aspx?id=21138) on # (see:
# Windows. # https://www.microsoft.com/en-us/download/details.aspx?id=21138) on Windows.
# #
# The HTML Help Workshop contains a compiler that can convert all HTML output # The HTML Help Workshop contains a compiler that can convert all HTML output
# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML # generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
@@ -1379,7 +1407,7 @@ CHM_FILE =
HHC_LOCATION = HHC_LOCATION =
# The GENERATE_CHI flag controls if a separate .chi index file is generated # The GENERATE_CHI flag controls if a separate .chi index file is generated
# (YES) or that it should be included in the master .chm file (NO). # (YES) or that it should be included in the main .chm file (NO).
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTMLHELP is set to YES. # This tag requires that the tag GENERATE_HTMLHELP is set to YES.
@@ -1420,11 +1448,12 @@ GENERATE_QHP = YES
# the HTML output folder. # the HTML output folder.
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
QCH_FILE = pip.qch QCH_FILE = pip_${DOXY_OUTPUT_DIR}.qch
# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help # The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
# Project output. For more information please see Qt Help Project / Namespace # Project output. For more information please see Qt Help Project / Namespace
# (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace). # (see:
# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
# The default value is: org.doxygen.Project. # The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1432,8 +1461,8 @@ QHP_NAMESPACE = PIP
# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt # The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
# Help Project output. For more information please see Qt Help Project / Virtual # Help Project output. For more information please see Qt Help Project / Virtual
# Folders (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual- # Folders (see:
# folders). # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
# The default value is: doc. # The default value is: doc.
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
@@ -1441,30 +1470,30 @@ QHP_VIRTUAL_FOLDER = PIP
# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom # If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
# filter to add. For more information please see Qt Help Project / Custom # filter to add. For more information please see Qt Help Project / Custom
# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # Filters (see:
# filters). # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_NAME = PIP QHP_CUST_FILTER_NAME = PIP
# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the # The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
# custom filter to add. For more information please see Qt Help Project / Custom # custom filter to add. For more information please see Qt Help Project / Custom
# Filters (see: http://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom- # Filters (see:
# filters). # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
QHP_CUST_FILTER_ATTRS = ${DOXY_QHP_CUST_FILTER_ATTRS} QHP_CUST_FILTER_ATTRS = ${DOXY_QHP_CUST_FILTER_ATTRS}
# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this # The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
# project's filter section matches. Qt Help Project / Filter Attributes (see: # project's filter section matches. Qt Help Project / Filter Attributes (see:
# http://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes). # https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
QHP_SECT_FILTER_ATTRS = ${DOXY_QHP_SECT_FILTER_ATTRS} QHP_SECT_FILTER_ATTRS = ${DOXY_QHP_SECT_FILTER_ATTRS}
# The QHG_LOCATION tag can be used to specify the location of Qt's # The QHG_LOCATION tag can be used to specify the location (absolute path
# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the # including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
# generated .qhp file. # run qhelpgenerator on the generated .qhp file.
# This tag requires that the tag GENERATE_QHP is set to YES. # This tag requires that the tag GENERATE_QHP is set to YES.
QHG_LOCATION = qhelpgenerator QHG_LOCATION = qhelpgenerator
@@ -1487,7 +1516,7 @@ GENERATE_ECLIPSEHELP = NO
# The default value is: org.doxygen.Project. # The default value is: org.doxygen.Project.
# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. # This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
ECLIPSE_DOC_ID = org.doxygen.Project ECLIPSE_DOC_ID = PIP
# If you want full control over the layout of the generated HTML pages it might # If you want full control over the layout of the generated HTML pages it might
# be necessary to disable the index and replace it with your own. The # be necessary to disable the index and replace it with your own. The
@@ -1515,7 +1544,7 @@ DISABLE_INDEX = NO
# The default value is: NO. # The default value is: NO.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
GENERATE_TREEVIEW = YES GENERATE_TREEVIEW = NO
# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that # The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
# doxygen will group on one line in the generated HTML documentation. # doxygen will group on one line in the generated HTML documentation.
@@ -1541,6 +1570,17 @@ TREEVIEW_WIDTH = 250
EXT_LINKS_IN_WINDOW = NO EXT_LINKS_IN_WINDOW = NO
# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
# the HTML output. These images will generally look nicer at scaled resolutions.
# Possible values are: png (the default) and svg (looks nicer but requires the
# pdf2svg or inkscape tool).
# The default value is: png.
# This tag requires that the tag GENERATE_HTML is set to YES.
HTML_FORMULA_FORMAT = png
# Use this tag to change the font size of LaTeX formulas included as images in # Use this tag to change the font size of LaTeX formulas included as images in
# the HTML documentation. When you change the font size after a successful # the HTML documentation. When you change the font size after a successful
# doxygen run you need to manually remove any form_*.png images from the HTML # doxygen run you need to manually remove any form_*.png images from the HTML
@@ -1561,8 +1601,14 @@ FORMULA_FONTSIZE = 10
FORMULA_TRANSPARENT = YES FORMULA_TRANSPARENT = YES
# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
# to create new LaTeX commands to be used in formulas as building blocks. See
# the section "Including formulas" for details.
FORMULA_MACROFILE =
# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see # Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
# https://www.mathjax.org) which uses client side Javascript for the rendering # https://www.mathjax.org) which uses client side JavaScript for the rendering
# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX # instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
# installed or if you want to formulas look prettier in the HTML output. When # installed or if you want to formulas look prettier in the HTML output. When
# enabled you may also need to install MathJax separately and configure the path # enabled you may also need to install MathJax separately and configure the path
@@ -1574,7 +1620,7 @@ USE_MATHJAX = NO
# When MathJax is enabled you can set the default output format to be used for # When MathJax is enabled you can set the default output format to be used for
# the MathJax output. See the MathJax site (see: # the MathJax output. See the MathJax site (see:
# http://docs.mathjax.org/en/latest/output.html) for more details. # http://docs.mathjax.org/en/v2.7-latest/output.html) for more details.
# Possible values are: HTML-CSS (which is slower, but has the best # Possible values are: HTML-CSS (which is slower, but has the best
# compatibility), NativeMML (i.e. MathML) and SVG. # compatibility), NativeMML (i.e. MathML) and SVG.
# The default value is: HTML-CSS. # The default value is: HTML-CSS.
@@ -1590,7 +1636,7 @@ MATHJAX_FORMAT = HTML-CSS
# Content Delivery Network so you can quickly see the result without installing # Content Delivery Network so you can quickly see the result without installing
# MathJax. However, it is strongly recommended to install a local copy of # MathJax. However, it is strongly recommended to install a local copy of
# MathJax from https://www.mathjax.org before deployment. # MathJax from https://www.mathjax.org before deployment.
# The default value is: https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.5/. # The default value is: https://cdn.jsdelivr.net/npm/mathjax@2.
# This tag requires that the tag USE_MATHJAX is set to YES. # This tag requires that the tag USE_MATHJAX is set to YES.
MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest
@@ -1604,7 +1650,8 @@ MATHJAX_EXTENSIONS =
# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces # The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
# of code that will be used on startup of the MathJax code. See the MathJax site # of code that will be used on startup of the MathJax code. See the MathJax site
# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an # (see:
# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
# example see the documentation. # example see the documentation.
# This tag requires that the tag USE_MATHJAX is set to YES. # This tag requires that the tag USE_MATHJAX is set to YES.
@@ -1629,10 +1676,10 @@ MATHJAX_CODEFILE =
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag GENERATE_HTML is set to YES. # This tag requires that the tag GENERATE_HTML is set to YES.
SEARCHENGINE = NO SEARCHENGINE = YES
# When the SERVER_BASED_SEARCH tag is enabled the search engine will be # When the SERVER_BASED_SEARCH tag is enabled the search engine will be
# implemented using a web server instead of a web client using Javascript. There # implemented using a web server instead of a web client using JavaScript. There
# are two flavors of web server based searching depending on the EXTERNAL_SEARCH # are two flavors of web server based searching depending on the EXTERNAL_SEARCH
# setting. When disabled, doxygen will generate a PHP script for searching and # setting. When disabled, doxygen will generate a PHP script for searching and
# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing # an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
@@ -1651,7 +1698,8 @@ SERVER_BASED_SEARCH = NO
# #
# Doxygen ships with an example indexer (doxyindexer) and search engine # Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library # (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: https://xapian.org/). # Xapian (see:
# https://xapian.org/).
# #
# See the section "External Indexing and Searching" for details. # See the section "External Indexing and Searching" for details.
# The default value is: NO. # The default value is: NO.
@@ -1664,8 +1712,9 @@ EXTERNAL_SEARCH = NO
# #
# Doxygen ships with an example indexer (doxyindexer) and search engine # Doxygen ships with an example indexer (doxyindexer) and search engine
# (doxysearch.cgi) which are based on the open source search engine library # (doxysearch.cgi) which are based on the open source search engine library
# Xapian (see: https://xapian.org/). See the section "External Indexing and # Xapian (see:
# Searching" for details. # https://xapian.org/). See the section "External Indexing and Searching" for
# details.
# This tag requires that the tag SEARCHENGINE is set to YES. # This tag requires that the tag SEARCHENGINE is set to YES.
SEARCHENGINE_URL = SEARCHENGINE_URL =
@@ -1736,13 +1785,14 @@ LATEX_CMD_NAME = latex
MAKEINDEX_CMD_NAME = makeindex MAKEINDEX_CMD_NAME = makeindex
# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to # The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
# generate index for LaTeX. # generate index for LaTeX. In case there is no backslash (\) as first character
# it will be automatically added in the LaTeX code.
# Note: This tag is used in the generated output file (.tex). # Note: This tag is used in the generated output file (.tex).
# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat. # See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
# The default value is: \makeindex. # The default value is: makeindex.
# This tag requires that the tag GENERATE_LATEX is set to YES. # This tag requires that the tag GENERATE_LATEX is set to YES.
LATEX_MAKEINDEX_CMD = \makeindex LATEX_MAKEINDEX_CMD = makeindex
# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX # If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
# documents. This may be useful for small projects and may help to save some # documents. This may be useful for small projects and may help to save some
@@ -1828,9 +1878,11 @@ LATEX_EXTRA_FILES =
PDF_HYPERLINKS = YES PDF_HYPERLINKS = YES
# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate # If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
# the PDF file directly from the LaTeX files. Set this option to YES, to get a # specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
# higher quality PDF documentation. # files. Set this option to YES, to get a higher quality PDF documentation.
#
# See also section LATEX_CMD_NAME for selecting the engine.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag GENERATE_LATEX is set to YES. # This tag requires that the tag GENERATE_LATEX is set to YES.
@@ -2209,7 +2261,7 @@ TAGFILES =
# tag file that is based on the input files it reads. See section "Linking to # tag file that is based on the input files it reads. See section "Linking to
# external documentation" for more information about the usage of tag files. # external documentation" for more information about the usage of tag files.
GENERATE_TAGFILE = doc/pip.cfg GENERATE_TAGFILE = doc/html/${DOXY_OUTPUT_DIR}/pip.cfg
# If the ALLEXTERNALS tag is set to YES, all external class will be listed in # If the ALLEXTERNALS tag is set to YES, all external class will be listed in
# the class index. If set to NO, only the inherited external classes will be # the class index. If set to NO, only the inherited external classes will be
@@ -2232,12 +2284,6 @@ EXTERNAL_GROUPS = YES
EXTERNAL_PAGES = YES EXTERNAL_PAGES = YES
# The PERL_PATH should be the absolute path and name of the perl script
# interpreter (i.e. the result of 'which perl').
# The default file (with absolute path) is: /usr/bin/perl.
PERL_PATH = /usr/bin/perl
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
# Configuration options related to the dot tool # Configuration options related to the dot tool
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------
@@ -2251,15 +2297,6 @@ PERL_PATH = /usr/bin/perl
CLASS_DIAGRAMS = YES CLASS_DIAGRAMS = YES
# You can define message sequence charts within doxygen comments using the \msc
# command. Doxygen will then run the mscgen tool (see:
# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the
# documentation. The MSCGEN_PATH tag allows you to specify the directory where
# the mscgen tool resides. If left empty the tool is assumed to be found in the
# default search path.
MSCGEN_PATH = ${DOXY_MSCGEN_PATH}
# You can include diagrams made with dia in doxygen documentation. Doxygen will # You can include diagrams made with dia in doxygen documentation. Doxygen will
# then run dia to produce the diagram and insert it in the documentation. The # then run dia to produce the diagram and insert it in the documentation. The
# DIA_PATH tag allows you to specify the directory where the dia binary resides. # DIA_PATH tag allows you to specify the directory where the dia binary resides.
@@ -2357,10 +2394,32 @@ UML_LOOK = NO
# but if the number exceeds 15, the total amount of fields shown is limited to # but if the number exceeds 15, the total amount of fields shown is limited to
# 10. # 10.
# Minimum value: 0, maximum value: 100, default value: 10. # Minimum value: 0, maximum value: 100, default value: 10.
# This tag requires that the tag HAVE_DOT is set to YES. # This tag requires that the tag UML_LOOK is set to YES.
UML_LIMIT_NUM_FIELDS = 12 UML_LIMIT_NUM_FIELDS = 12
# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
# tag is set to YES, doxygen will add type and arguments for attributes and
# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
# will not generate fields with class member information in the UML graphs. The
# class diagrams will look similar to the default class diagrams but using UML
# notation for the relationships.
# Possible values are: NO, YES and NONE.
# The default value is: NO.
# This tag requires that the tag UML_LOOK is set to YES.
DOT_UML_DETAILS = NO
# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
# to display on a single line. If the actual line length exceeds this threshold
# significantly it will wrapped across multiple lines. Some heuristics are apply
# to avoid ugly line breaks.
# Minimum value: 0, maximum value: 1000, default value: 17.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_WRAP_THRESHOLD = 17
# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and # If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
# collaboration graphs will show the relations between templates and their # collaboration graphs will show the relations between templates and their
# instances. # instances.
@@ -2550,9 +2609,11 @@ DOT_MULTI_TARGETS = YES
GENERATE_LEGEND = YES GENERATE_LEGEND = YES
# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot # If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
# files that are used to generate the various graphs. # files that are used to generate the various graphs.
#
# Note: This setting is not only used for dot files but also for msc and
# plantuml temporary files.
# The default value is: YES. # The default value is: YES.
# This tag requires that the tag HAVE_DOT is set to YES.
DOT_CLEANUP = YES DOT_CLEANUP = YES

View File

@@ -4,14 +4,17 @@ void _() {
//! [foreach] //! [foreach]
PIVector<int> vec; PIVector<int> vec;
vec << 1 << 2 << 3; vec << 1 << 2 << 3;
piForeach (int & i, vec)
cout << i << ", "; piForeach (int & i, vec) piCout << i;
// 1, 2, 3, // 1
piForeach (int & i, vec) // 2
i++; // 3
piForeach (int & i, vec)
cout << i << ", "; piForeach (int & i, vec) i++;
// 2, 3, 4, piForeach (int & i, vec) piCout << i;
// 2
// 3
// 4
//! [foreach] //! [foreach]
//! [foreachC] //! [foreachC]
PIVector<int> vec; PIVector<int> vec;

View File

@@ -5,8 +5,8 @@ class ObjectA: public PIObject {
PIOBJECT(ObjectA) PIOBJECT(ObjectA)
public: public:
EVENT_HANDLER1(void, handlerA, const PIString & , str) {piCoutObj << "handler A:" << str;} EVENT_HANDLER1(void, handlerA, const PIString & , str) {piCoutObj << "handler A:" << str;}
EVENT2(eventA2, int, i, float, f);
EVENT1(eventA1, const PIString & , str); EVENT1(eventA1, const PIString & , str);
EVENT2(eventA2, int, i, float, f);
}; };
class ObjectB: public PIObject { class ObjectB: public PIObject {
@@ -26,7 +26,11 @@ int main(int argc, char * argv[]) {
CONNECT1(void, PIString, &obj_b, eventB, &obj_a, handlerA); CONNECT1(void, PIString, &obj_b, eventB, &obj_a, handlerA);
obj_b.eventB("event to handler"); obj_b.eventB("event to handler");
CONNECT1(void, PIString, &obj_a, eventA1, &obj_b, eventB); CONNECTU(&obj_a, eventA1, &obj_b, eventB);
obj_a.eventA1("event to event"); obj_a.eventA1("event to event");
obj_a.piDisconnect("eventA1");
CONNECTL(&obj_a, eventA1, ([](const PIString & str){piCout << str;}));
obj_a.eventA1("event to lambda");
}; };
//! [main] //! [main]

BIN
doc/pip.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -142,7 +142,7 @@ void PIScreen::SystemConsole::resize(int w, int h) {
pcells.resize(height); pcells.resize(height);
for (int i = 0; i < height; ++i) { for (int i = 0; i < height; ++i) {
cells[i].resize(width); cells[i].resize(width);
pcells[i].resize(width, Cell(0)); pcells[i].resize(width, Cell(PIChar()));
} }
#ifdef WINDOWS #ifdef WINDOWS
PRIVATE->sbi.srWindow = PRIVATE->csbi.srWindow; PRIVATE->sbi.srWindow = PRIVATE->csbi.srWindow;

View File

@@ -691,7 +691,7 @@ bool TileInput::keyEvent(PIKbdListener::KeyEvent key) {
default: default:
PIChar tc PIChar tc
#ifdef WINDOWS #ifdef WINDOWS
= PIChar(key.key); = PIChar((ushort)key.key);
#else #else
= PIChar::fromUTF8((char *)&(key.key)); = PIChar::fromUTF8((char *)&(key.key));
#endif #endif

View File

@@ -239,9 +239,9 @@ void PITerminal::write(PIKbdListener::KeyEvent ke) {
else { else {
PIByteArray ba; PIByteArray ba;
#ifdef WINDOWS #ifdef WINDOWS
ba << uchar(PIChar(ke.key).toConsole1Byte()); ba << uchar(PIChar((ushort)ke.key).toConsole1Byte());
#else #else
ba = PIString(PIChar(ke.key)).toUTF8(); ba = PIString(PIChar((ushort)ke.key)).toUTF8();
#endif #endif
write(ba); write(ba);
} }

View File

@@ -128,7 +128,7 @@ PIAuth::State PIAuth::receive(PIByteArray & ba) {
passwordRequest(&ps); passwordRequest(&ps);
if (ps.isEmpty()) return disconnect(ba, "Canceled by user"); if (ps.isEmpty()) return disconnect(ba, "Canceled by user");
ph = crypt.passwordHash(ps, PIString("PIAuth").toByteArray()); ph = crypt.passwordHash(ps, PIString("PIAuth").toByteArray());
ps.fill(PIChar(0)); ps.fill(PIChar());
tba.clear(); tba.clear();
tba << ph << auth_sign << sign_pk; tba << ph << auth_sign << sign_pk;
tba = crypt.crypt(tba, box_pk, box_sk); tba = crypt.crypt(tba, box_pk, box_sk);

View File

@@ -1,5 +1,5 @@
/*! @file pifft_p.h /*! \file pifft_p.h
* @brief Class for FFT, IFFT and Hilbert transformations * \brief Class for FFT, IFFT and Hilbert transformations
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -20,7 +20,7 @@
#include "pibroadcast.h" #include "pibroadcast.h"
/** \class PIBroadcast /** \class PIBroadcast
* @brief Broadcast for all interfaces, including loopback * \brief Broadcast for all interfaces, including loopback
* *
* \section PIBroadcast_synopsis Synopsis * \section PIBroadcast_synopsis Synopsis
* %PIBroadcast used as multichannel IO device. It can use * %PIBroadcast used as multichannel IO device. It can use

View File

@@ -23,7 +23,7 @@
#endif #endif
/** \class PIEthUtilBase /** \class PIEthUtilBase
* @brief Base class for ethernet utils * \brief Base class for ethernet utils
* *
* \section PIEthUtilBase_synopsis Synopsis * \section PIEthUtilBase_synopsis Synopsis
* %PIEthUtilBase provides crypt layer for derived classes: * %PIEthUtilBase provides crypt layer for derived classes:

View File

@@ -28,7 +28,7 @@
#endif #endif
/** \class PIStreamPacker /** \class PIStreamPacker
* @brief Simple packet wrap aroud any PIIODevice * \brief Simple packet wrap aroud any PIIODevice
* *
* \section PIStreamPacker_synopsis Synopsis * \section PIStreamPacker_synopsis Synopsis
* %PIStreamPacker provides simple pack/unpack logic for any data packets. * %PIStreamPacker provides simple pack/unpack logic for any data packets.

View File

@@ -1,5 +1,5 @@
/*! @file picloudbase.h /*! \file picloudbase.h
* @brief PICloud Base - Base class for PICloudClient and PICloud Server * \brief PICloud Base - Base class for PICloudClient and PICloud Server
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file picloudclient.h /*! \file picloudclient.h
* @brief PICloud Client * \brief PICloud Client
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -27,7 +27,7 @@
#include "piconditionvar.h" #include "piconditionvar.h"
//! @brief PICloudClient //! \brief PICloudClient
class PIP_CLOUD_EXPORT PICloudClient: public PIIODevice, public PICloudBase class PIP_CLOUD_EXPORT PICloudClient: public PIIODevice, public PICloudBase
{ {

View File

@@ -1,5 +1,5 @@
/*! @file picloudserver.h /*! \file picloudserver.h
* @brief PICloud Server * \brief PICloud Server
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file picloudtcp.h /*! \file picloudtcp.h
* @brief PICloud TCP transport * \brief PICloud TCP transport
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file picodeinfo.h /*! \file picodeinfo.h
* @brief C++ code info structs * \brief C++ code info structs
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -51,7 +51,7 @@ PIString PICodeParser::Macro::expand(PIString args_, bool * ok) const {
const PIString & an(args[i]), av(arg_vals[i]); const PIString & an(args[i]), av(arg_vals[i]);
int ind(-1); int ind(-1);
while ((ind = ret.find(an, ind + 1)) >= 0) { while ((ind = ret.find(an, ind + 1)) >= 0) {
PIChar ppc(0), pc(0), nc(0); PIChar ppc, pc, nc;
if (ind > 1) ppc = ret[ind - 2]; if (ind > 1) ppc = ret[ind - 2];
if (ind > 0) pc = ret[ind - 1]; if (ind > 0) pc = ret[ind - 1];
if (ind + an.size_s() < ret.size_s()) nc = ret.mid(ind + an.size_s(),1)[0]; if (ind + an.size_s() < ret.size_s()) nc = ret.mid(ind + an.size_s(),1)[0];
@@ -279,7 +279,7 @@ bool PICodeParser::parseFileContent(PIString & fc, bool main) {
piForeachC (Define & d, defines) { piForeachC (Define & d, defines) {
int ind(-1); int ind(-1);
while ((ind = pfc.find(d.first, ind + 1)) >= 0) { while ((ind = pfc.find(d.first, ind + 1)) >= 0) {
PIChar pc(0), nc(0); PIChar pc, nc;
if (ind > 0) pc = pfc[ind - 1]; if (ind > 0) pc = pfc[ind - 1];
if (ind + d.first.size_s() < pfc.size_s()) nc = pfc.mid(ind + d.first.size_s(),1)[0]; if (ind + d.first.size_s() < pfc.size_s()) nc = pfc.mid(ind + d.first.size_s(),1)[0];
if (_isCChar(pc) || _isCChar(nc) || nc.isDigit()) continue; if (_isCChar(pc) || _isCChar(nc) || nc.isDigit()) continue;
@@ -291,7 +291,7 @@ bool PICodeParser::parseFileContent(PIString & fc, bool main) {
piForeachC (Macro & m, macros) { piForeachC (Macro & m, macros) {
int ind(-1); int ind(-1);
while ((ind = pfc.find(m.name, ind + 1)) >= 0) { while ((ind = pfc.find(m.name, ind + 1)) >= 0) {
PIChar pc(0), nc(0); PIChar pc, nc;
if (ind > 0) pc = pfc[ind - 1]; if (ind > 0) pc = pfc[ind - 1];
if (ind + m.name.size_s() < pfc.size_s()) nc = pfc.mid(ind + m.name.size_s(),1)[0]; if (ind + m.name.size_s() < pfc.size_s()) nc = pfc.mid(ind + m.name.size_s(),1)[0];
if (_isCChar(pc) || _isCChar(nc) || nc.isDigit()) continue; if (_isCChar(pc) || _isCChar(nc) || nc.isDigit()) continue;

View File

@@ -1,5 +1,5 @@
/*! @file picodeparser.h /*! \file picodeparser.h
* @brief C++ code parser * \brief C++ code parser
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file picompress.h /*! \file picompress.h
* @brief Compress class using zlib * \brief Compress class using zlib
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -26,7 +26,7 @@
#endif #endif
/** \class PIKbdListener /** \class PIKbdListener
* @brief Keyboard console input listener * \brief Keyboard console input listener
* \details This class provide listening of console keyboard input. * \details This class provide listening of console keyboard input.
* There is two ways to receive pressed key: * There is two ways to receive pressed key:
* * external static function with format "void func(char key, void * data_)" * * external static function with format "void func(char key, void * data_)"

View File

@@ -1,5 +1,5 @@
/*! @file pikbdlistener.h /*! \file pikbdlistener.h
* @brief Keyboard console input listener * \brief Keyboard console input listener
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -181,20 +181,20 @@ public:
//! \{ //! \{
//! \fn void enableExitCapture(int key = 'Q') //! \fn void enableExitCapture(int key = 'Q')
//! @brief Enable exit key "key" awaiting //! \brief Enable exit key "key" awaiting
//! \fn void disableExitCapture() //! \fn void disableExitCapture()
//! @brief Disable exit key awaiting //! \brief Disable exit key awaiting
//! \fn void setActive(bool yes = true) //! \fn void setActive(bool yes = true)
//! @brief Set keyboard listening is active or not //! \brief Set keyboard listening is active or not
//! \} //! \}
//! \events //! \events
//! \{ //! \{
//! \fn void keyPressed(PIKbdListener::KeyEvent key, void * data) //! \fn void keyPressed(PIKbdListener::KeyEvent key, void * data)
//! @brief Raise on key "key" pressed, "data" is custom data //! \brief Raise on key "key" pressed, "data" is custom data
//! \} //! \}

View File

@@ -1,5 +1,5 @@
/*! @file piscreen.h /*! \file piscreen.h
* @brief Console GUI class * \brief Console GUI class
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -80,23 +80,23 @@ public:
//! \{ //! \{
//! \fn void waitForFinish() //! \fn void waitForFinish()
//! @brief block until finished (exit key will be pressed) //! \brief block until finished (exit key will be pressed)
//! \fn void start(bool wait = false) //! \fn void start(bool wait = false)
//! @brief Start console output and if "wait" block until finished (exit key will be pressed) //! \brief Start console output and if "wait" block until finished (exit key will be pressed)
//! \fn void stop(bool clear = false) //! \fn void stop(bool clear = false)
//! @brief Stop console output and if "clear" clear the screen //! \brief Stop console output and if "clear" clear the screen
//! \} //! \}
//! \events //! \events
//! \{ //! \{
//! \fn void keyPressed(PIKbdListener::KeyEvent key, void * data) //! \fn void keyPressed(PIKbdListener::KeyEvent key, void * data)
//! @brief Raise on key "key" pressed, "data" is pointer to %PIConsole object //! \brief Raise on key "key" pressed, "data" is pointer to %PIConsole object
//! \fn void tileEvent(PIScreenTile * tile, PIScreenTypes::TileEvent e) //! \fn void tileEvent(PIScreenTile * tile, PIScreenTypes::TileEvent e)
//! @brief Raise on some event "e" from tile "tile" //! \brief Raise on some event "e" from tile "tile"
//! \} //! \}

View File

@@ -1,5 +1,5 @@
/*! @file piscreenconsole.h /*! \file piscreenconsole.h
* @brief Tile for PIScreen with PIConsole API * \brief Tile for PIScreen with PIConsole API
* *
* This file declares TileVars * This file declares TileVars
*/ */

View File

@@ -1,5 +1,5 @@
/*! @file piscreendrawer.h /*! \file piscreendrawer.h
* @brief Drawer for PIScreen * \brief Drawer for PIScreen
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file piscreentile.h /*! \file piscreentile.h
* @brief Basic PIScreen tile * \brief Basic PIScreen tile
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file piscreentiles.h /*! \file piscreentiles.h
* @brief Various tiles for PIScreen * \brief Various tiles for PIScreen
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file piscreentypes.h /*! \file piscreentypes.h
* @brief Types for PIScreen * \brief Types for PIScreen
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file piterminal.h /*! \file piterminal.h
* @brief Virtual terminal * \brief Virtual terminal
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,12 +1,20 @@
/*! @file picontainers.h /*! \addtogroup Containers
* @brief Base for generic containers * \{
* * \file picontainers.h
* This file declare all containers and useful macros * \brief
* to use them * \~english Base macros for generic containers
*/ * \~russian Базовые макросы для контейнеров
* \~\authors
* \~english
* Ivan Pelipenko peri4ko@yandex.ru;
* Andrey Bychkov work.a.b@yandex.ru;
* \~russian
* Иван Пелипенко peri4ko@yandex.ru;
* Андрей Бычков work.a.b@yandex.ru;
* \~\} */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Base for generic containers Base macros for generic containers
Ivan Pelipenko peri4ko@yandex.ru Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -37,87 +45,122 @@
#include <type_traits> #include <type_traits>
#include <string.h> #include <string.h>
#include <new> #include <new>
#ifndef PIP_MEMALIGN_BYTES
# define PIP_MEMALIGN_BYTES (sizeof(void*)*4)
#endif
#ifdef WINDOWS
# ifdef CC_GCC
# define amalloc(s) __mingw_aligned_malloc(s, PIP_MEMALIGN_BYTES)
# define afree(p) __mingw_aligned_free(p)
# else
# ifdef CC_VC
# define amalloc(s) _aligned_malloc(s, PIP_MEMALIGN_BYTES)
# define afree(p) _aligned_free(p)
# endif
# endif
#else
# define amalloc(s) aligned_alloc(PIP_MEMALIGN_BYTES, s)
# define afree(p) free(p)
#endif
#ifdef DOXYGEN
/*!@brief Macro for iterate any container
* \details Use this macros instead of standard "for"
* to get read/write access to each element of container.
* Pass direction is direct \n
* Example: \snippet picontainers.cpp foreach
*/
# define piForeach(i,c)
/*!@brief Macro for iterate any container only for read
* \details Use this macros instead of standard "for"
* to get read access to each element of container.
* Pass direction is direct \n
* Example: \snippet picontainers.cpp foreachC
*/
# define piForeachC(i,c)
/*!@brief Macro for iterate any container with reverse direction
* \details Use this macros instead of standard "for"
* to get read/write access to each element of container.
* Pass direction is reverse \n
* Example: \snippet picontainers.cpp foreachR
*/
# define piForeachR(i,c)
/*!@brief Macro for iterate any container only for read with reverse direction
* \details Use this macros instead of standard "for"
* to get read access to each element of container.
* Pass direction is reverse \n
* Example: \snippet picontainers.cpp foreachCR
*/
# define piForeachCR(i,c)
#else
template <typename C> template <typename C>
struct _reverse_wrapper { class _PIReverseWrapper {
C & c_; public:
_reverse_wrapper(C & c): c_(c) {} _PIReverseWrapper(C & c): c_(c) {}
_reverse_wrapper(const C & c): c_(const_cast<C&>(c)) {} _PIReverseWrapper(const C & c): c_(const_cast<C&>(c)) {}
typename C::reverse_iterator begin() {return c_.rbegin();} typename C::reverse_iterator begin() {return c_.rbegin();}
typename C::reverse_iterator end() {return c_.rend(); } typename C::reverse_iterator end() {return c_.rend(); }
typename C::const_reverse_iterator begin() const {return c_.rbegin();} typename C::const_reverse_iterator begin() const {return c_.rbegin();}
typename C::const_reverse_iterator end() const {return c_.rend(); } typename C::const_reverse_iterator end() const {return c_.rend(); }
private:
C & c_;
}; };
template <typename C> _reverse_wrapper<C> _reverse_wrap(C & c) {return _reverse_wrapper<C>(c);}
template <typename C> _reverse_wrapper<C> _reverse_wrap(const C & c) {return _reverse_wrapper<C>(c);} /*! \brief
* \~english Template reverse wrapper over any container
* \~russian Шаблонная функция обертки любого контейнера для обратного доступа через итераторы
*/
template <typename C> _PIReverseWrapper<C> PIReverseWrap(C & c) {return _PIReverseWrapper<C>(c);}
template <typename C> _PIReverseWrapper<C> PIReverseWrap(const C & c) {return _PIReverseWrapper<C>(c);}
# define piForTimes(c) for(int _i##c = 0; _i##c < c; ++_i##c) /*! \brief
* \~english Macro for short replacement of standart "for"
* \~russian Макрос для короткой записи стандартного цикла "for"
* \~\param c
* \~english Iteration times in loop
* \~russian Количество итераций цикла
*/
#define piForTimes(c) for(int _i##c = 0; _i##c < c; ++_i##c)
# define piForeach(i,c) for(i : c)
# define piForeachC(i,c) for(const i : c)
# define piForeachR(i,c) for(i : _reverse_wrap(c))
# define piForeachRC(i,c) for(const i : _reverse_wrap(c))
# define piForeachCR piForeachRC /*! \brief
* \~english Macro for iterate any container
* \~russian Макрос для перебора любых контейнеров
* \~\deprecated
* \~english Deprecated, using only for backward compatibility. Use
* [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for).
* \~russian Устарело, используется только для обратной совместимости. Используйте
* [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for).
* \~\details
* \~english Get read/write access to each element of container.
* Iterating in forward direction.
* Example of using:
* \~russian Перебор всех элементов контейнера с доступом на чтение и запись.
* Перебор осуществляется в прямом порядке.
* Пример использования:
* \~\code
* PIVector<int> vec;
* vec << 1 << 2 << 3;
* piForeach(int & i, vec) piCout << i;
* // 1
* // 2
* // 3
* piForeach(int & i, vec) i++;
* piForeach(int & i, vec) piCout << i;
* // 2
* // 3
* // 4
* \endcode
* \sa \a piForeachC, \a piForeachR, \a piForeachRC
*/
#define piForeach(i, c) for(i : c)
#endif // DOXYGEN /*! \brief
* \~english Macro for iterate any container
* \~russian Макрос для перебора любых контейнеров
* \~\deprecated
* \~english Deprecated, using only for backward compatibility. Use
* [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for).
* \~russian Устарело, используется только для обратной совместимости. Используйте
* [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for).
* \~\details
* \~english Get read only access to each element of container.
* Iterating in forward direction.
* \~russian Перебор всех элементов контейнера с доступом только на чтение.
* Перебор осуществляется в прямом порядке.
* \~ \sa \a piForeach, \a piForeachR, \a piForeachRC
*/
#define piForeachC(i, c) for(const i : c)
/*! \brief
* \~english Macro for iterate any container
* \~russian Макрос для перебора любых контейнеров
* \~\deprecated
* \~english Deprecated, using only for backward compatibility. Use
* [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for).
* \~russian Устарело, используется только для обратной совместимости. Используйте
* [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for).
* \~\details
* \~english Get read/write access to each element of container.
* Iterating in backward direction.
* \~russian Перебор всех элементов контейнера с доступом на чтение и запись.
* Перебор осуществляется в обратном порядке.
* \~ \sa \a piForeach, \a piForeachC, \a piForeachRC
*/
#define piForeachR(i, c) for(i : PIReverseWrap(c))
/*! \brief
* \~english Macro for iterate any container
* \~russian Макрос для перебора любых контейнеров
* \~\deprecated
* \~english Deprecated, using only for backward compatibility. Use
* [C++ Range-based for loop](https://en.cppreference.com/w/cpp/language/range-for).
* \~russian Устарело, используется только для обратной совместимости. Используйте
* [C++ Range-based for loop](https://ru.cppreference.com/w/cpp/language/range-for).
* \~\details
* \~english Get read only access to each element of container.
* Iterating in backward direction. Also has alias **piForeachCR**
* \~russian Перебор всех элементов контейнера с доступом только на чтение.
* Перебор осуществляется в обратном порядке. Также можно писать **piForeachCR**
* \~ \sa \a piForeach, \a piForeachC, \a piForeachR
*/
#define piForeachRC(i, c) for(const i : PIReverseWrap(c))
#define piForeachCR piForeachRC
#endif // PICONTAINERS_H #endif // PICONTAINERS_H

View File

@@ -1,6 +1,6 @@
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Module includes Containers
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -16,6 +16,30 @@
You should have received a copy of the GNU Lesser General Public License You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** \defgroup Containers
* \~\brief
* \~english This module contains various standart containers realization.
* \~russian Модуль содержит основные классы контейнеров.
*
* \~\details
* Scope | Use
* ----- | -------
* C++ | #include <picontainersmodule.h>
* CMake | PIP
*
* \~english This includes
* \~russian В него входят
* \~ \a PIVector, \a PIDeque, \a PIMap, \a PISet,
* \a PIStack, \a PIQueue, \a PIPair, \a PIVector2D.
*
* \authors
* \~english
* Ivan Pelipenko peri4ko@yandex.ru;
* Andrey Bychkov work.a.b@yandex.ru;
* \~russian
* Иван Пелипенко peri4ko@yandex.ru;
* Андрей Бычков work.a.b@yandex.ru;
*/
#ifndef PICONTAINERSMODULE_H #ifndef PICONTAINERSMODULE_H
#define PICONTAINERSMODULE_H #define PICONTAINERSMODULE_H

View File

@@ -1,5 +1,5 @@
/*! @file pideque.h /*! \file pideque.h
* @brief Dynamic array of any type * \brief Dynamic array of any type
* *
* This file declares PIDeque * This file declares PIDeque
*/ */

View File

@@ -1,5 +1,5 @@
/** \class PIMap /** \class PIMap
* @brief Associative array * \brief Associative array
* \details This class used to store Key = Value array of any * \details This class used to store Key = Value array of any
* type of data. \a value() returns value for key and leave map * type of data. \a value() returns value for key and leave map
* unchaged in any case. \a operator [] create entry in map if * unchaged in any case. \a operator [] create entry in map if
@@ -9,97 +9,97 @@
* \a makeIterator() and \a makeReverseIterator(). * \a makeIterator() and \a makeReverseIterator().
* \fn PIMap::PIMap(); * \fn PIMap::PIMap();
* @brief Contructs an empty map * \brief Contructs an empty map
* \fn PIMap::PIMap(const PIMap & other); * \fn PIMap::PIMap(const PIMap & other);
* @brief Contructs a copy of "other" * \brief Contructs a copy of "other"
* \fn PIMap & PIMap::operator =(const PIMap & other); * \fn PIMap & PIMap::operator =(const PIMap & other);
* @brief Copy operator * \brief Copy operator
* \fn PIMap::PIMap(const PIMap & other); * \fn PIMap::PIMap(const PIMap & other);
* @brief Contructs a copy of "other" * \brief Contructs a copy of "other"
* \fn PIMapIterator PIMap::makeIterator() const * \fn PIMapIterator PIMap::makeIterator() const
* @brief Returns PIMapIterator for this map * \brief Returns PIMapIterator for this map
* \fn PIMapIterator PIMap::makeReverseIterator() const * \fn PIMapIterator PIMap::makeReverseIterator() const
* @brief Returns reverse PIMapIterator for this map * \brief Returns reverse PIMapIterator for this map
* \fn size_t PIMap::size() const * \fn size_t PIMap::size() const
* @brief Returns entries count * \brief Returns entries count
* \fn int PIMap::size_s() const * \fn int PIMap::size_s() const
* @brief Returns entries count * \brief Returns entries count
* \fn size_t PIMap::length() const * \fn size_t PIMap::length() const
* @brief Returns entries count * \brief Returns entries count
* \fn bool PIMap::isEmpty() const * \fn bool PIMap::isEmpty() const
* @brief Returns if map is empty * \brief Returns if map is empty
* \fn T & PIMap::operator [](const Key & key) * \fn T & PIMap::operator [](const Key & key)
* @brief Returns value for key "key". If there is no key in map, create one. * \brief Returns value for key "key". If there is no key in map, create one.
* \fn const T PIMap::operator [](const Key & key) const * \fn const T PIMap::operator [](const Key & key) const
* @brief Returns value for key "key". If there is no key in map, returns default T(). * \brief Returns value for key "key". If there is no key in map, returns default T().
* \fn T & PIMap::at(const Key & key) * \fn T & PIMap::at(const Key & key)
* @brief Equivalent to operator [] * \brief Equivalent to operator []
* \fn const T PIMap::at(const Key & key) const * \fn const T PIMap::at(const Key & key) const
* @brief Equivalent to operator [] * \brief Equivalent to operator []
* \fn PIMap & PIMap::operator <<(const PIMap & other) * \fn PIMap & PIMap::operator <<(const PIMap & other)
* @brief Insert all etries of "other" to this map. Override existing values. * \brief Insert all etries of "other" to this map. Override existing values.
* \fn bool PIMap::operator ==(const PIMap & t) const * \fn bool PIMap::operator ==(const PIMap & t) const
* @brief Compare operator * \brief Compare operator
* \fn bool PIMap::operator !=(const PIMap & t) const * \fn bool PIMap::operator !=(const PIMap & t) const
* @brief Compare operator * \brief Compare operator
* \fn bool PIMap::contains(const Key & key) const * \fn bool PIMap::contains(const Key & key) const
* @brief Returns "true" if map contains entry with key "key" * \brief Returns "true" if map contains entry with key "key"
* \fn PIMap & PIMap::reserve(size_t new_size) * \fn PIMap & PIMap::reserve(size_t new_size)
* @brief Reserve space for "new_size" entries * \brief Reserve space for "new_size" entries
* \fn PIMap & PIMap::removeOne(const Key & key) * \fn PIMap & PIMap::removeOne(const Key & key)
* @brief Remove entry with key "key" * \brief Remove entry with key "key"
* \fn PIMap & PIMap::remove(const Key & key) * \fn PIMap & PIMap::remove(const Key & key)
* @brief Equivalent \a removeOne(key) * \brief Equivalent \a removeOne(key)
* \fn PIMap & PIMap::erase(const Key & key) * \fn PIMap & PIMap::erase(const Key & key)
* @brief Equivalent \a removeOne(key) * \brief Equivalent \a removeOne(key)
* \fn PIMap & PIMap::clear() * \fn PIMap & PIMap::clear()
* @brief Clear map * \brief Clear map
* \fn void PIMap::swap(PIMap & other) * \fn void PIMap::swap(PIMap & other)
* @brief Swap map with "other" * \brief Swap map with "other"
* \fn PIMap & PIMap::insert(const Key & key, const T & value) * \fn PIMap & PIMap::insert(const Key & key, const T & value)
* @brief Insert or rewrite entry with key "key" and value "value" * \brief Insert or rewrite entry with key "key" and value "value"
* \fn const T PIMap::value(const Key & key, const T & default = T()) * \fn const T PIMap::value(const Key & key, const T & default = T())
* @brief Returns value for key "key". If there is no key in map, returns "default". * \brief Returns value for key "key". If there is no key in map, returns "default".
* \fn PIVector<T> PIMap::values() const * \fn PIVector<T> PIMap::values() const
* @brief Returns all values as PIVector * \brief Returns all values as PIVector
* \fn Key PIMap::key(const T & value, const Key & default = Key()) const * \fn Key PIMap::key(const T & value, const Key & default = Key()) const
* @brief Returns key for first founded value "value". If there is no such value in map, returns "default". * \brief Returns key for first founded value "value". If there is no such value in map, returns "default".
* \fn PIVector<Key> PIMap::keys() const * \fn PIVector<Key> PIMap::keys() const
* @brief Returns all keys as PIVector * \brief Returns all keys as PIVector
* */ * */
@@ -107,7 +107,7 @@
/** \class PIMapIterator /** \class PIMapIterator
* @brief Helper class to iterate over PIMap * \brief Helper class to iterate over PIMap
* \details This class used to access keys and values in PIMap. * \details This class used to access keys and values in PIMap.
* You can use constructor to create iterator, or use \a PIMap::makeIterator() * You can use constructor to create iterator, or use \a PIMap::makeIterator()
* and \a PIMap::makeReverseIterator() methods. * and \a PIMap::makeReverseIterator() methods.
@@ -164,24 +164,24 @@
* \endcode * \endcode
* \fn PIMapIterator(const PIMap & map, bool reverse = false) * \fn PIMapIterator(const PIMap & map, bool reverse = false)
* @brief Contructs iterator for "map". Current position is invalid. * \brief Contructs iterator for "map". Current position is invalid.
* \fn const Key & PIMapIterator::key() const * \fn const Key & PIMapIterator::key() const
* @brief Returns current entry key * \brief Returns current entry key
* \fn const T & PIMapIterator::value() const * \fn const T & PIMapIterator::value() const
* @brief Returns current entry value * \brief Returns current entry value
* \fn T & PIMapIterator::valueRef() const * \fn T & PIMapIterator::valueRef() const
* @brief Returns reference to current entry value * \brief Returns reference to current entry value
* \fn bool PIMapIterator::hasNext() * \fn bool PIMapIterator::hasNext()
* @brief Returns if iterator can jump to next entry * \brief Returns if iterator can jump to next entry
* \fn bool PIMapIterator::next() * \fn bool PIMapIterator::next()
* @brief Jump to next entry and return if new position is valid. * \brief Jump to next entry and return if new position is valid.
* \fn void PIMapIterator::reset() * \fn void PIMapIterator::reset()
* @brief Reset iterator to initial position. * \brief Reset iterator to initial position.
* */ * */

View File

@@ -1,5 +1,5 @@
/*! @file pimap.h /*! \file pimap.h
* @brief Associative array with custom types of key and value * \brief Associative array with custom types of key and value
* *
* This file declares PIMap * This file declares PIMap
*/ */

View File

@@ -1,5 +1,5 @@
/*! @file pipair.h /*! \file pipair.h
* @brief pair * \brief pair
* *
* This file declare PIPair * This file declare PIPair
*/ */

View File

@@ -1,5 +1,5 @@
/*! @file pideque.h /*! \file pideque.h
* @brief Queue container * \brief Queue container
* *
* This file declare PIQueue * This file declare PIQueue
*/ */

View File

@@ -1,5 +1,5 @@
/*! @file piset.h /*! \file piset.h
* @brief Set container * \brief Set container
* *
* This file declare PISet * This file declare PISet
*/ */
@@ -27,7 +27,7 @@
#include "pimap.h" #include "pimap.h"
/*! @brief Set of any type /*! \brief Set of any type
* \details This class used to store collection of unique elements * \details This class used to store collection of unique elements
* of any type. You can only add values to set with \a operator<< or * of any type. You can only add values to set with \a operator<< or
* with function \a insert(). You can discover if value already in * with function \a insert(). You can discover if value already in
@@ -129,16 +129,16 @@ public:
}; };
//! \relatesalso PISet @brief Returns unite of two sets //! \relatesalso PISet \brief Returns unite of two sets
template <typename T> PISet<T> operator +(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.unite(v1); return ret;} template <typename T> PISet<T> operator +(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.unite(v1); return ret;}
//! \relatesalso PISet @brief Returns subtraction of two sets //! \relatesalso PISet \brief Returns subtraction of two sets
template <typename T> PISet<T> operator -(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.subtract(v1); return ret;} template <typename T> PISet<T> operator -(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.subtract(v1); return ret;}
//! \relatesalso PISet @brief Returns unite of two sets //! \relatesalso PISet \brief Returns unite of two sets
template <typename T> PISet<T> operator |(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.unite(v1); return ret;} template <typename T> PISet<T> operator |(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.unite(v1); return ret;}
//! \relatesalso PISet @brief Returns intersetion of two sets //! \relatesalso PISet \brief Returns intersetion of two sets
template <typename T> PISet<T> operator &(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.intersect(v1); return ret;} template <typename T> PISet<T> operator &(const PISet<T> & v0, const PISet<T> & v1) {PISet<T> ret(v0); ret.intersect(v1); return ret;}

View File

@@ -1,5 +1,5 @@
/*! @file pistack.h /*! \file pistack.h
* @brief Stack container * \brief Stack container
* *
* This file declare PIStack * This file declare PIStack
*/ */

View File

@@ -1,170 +0,0 @@
/** \class PIVector
* @brief Dynamic array of any type
* \details This class used to store dynamic array of any
* type of data. In memory data stored linear. You can insert
* item in any place of remove some items from any place.
* For quick add elements this is stream operator <<.
* \fn PIVector::PIVector();
* Contructs an empty vector
* \fn PIVector::PIVector(size_t size, const T & value = T());
* @brief Contructs vector with size "size" filled elements "value"
* \details Example: \snippet picontainers.cpp PIVector::PIVector
* \fn PIVector::PIVector(std::initializer_list list);
* @brief Contructs vector from C++11 initializer list
* \details Example: \snippet picontainers.cpp PIVector::PIVector
* \fn const T & PIVector::at(size_t index) const;
* @brief Read-only access to element by index "index"
* \details Example: \snippet picontainers.cpp PIVector::at_c
* \sa \a operator[]
* \fn T & PIVector::at(size_t index);
* @brief Full access to element by index "index"
* \details Example: \snippet picontainers.cpp PIVector::at
* \sa \a operator[]
* \fn const T * PIVector::data(size_t index = 0) const;
* @brief Read-only pointer to element by index "index"
* \details Example: \snippet picontainers.cpp PIVector::data_c
* \fn T * PIVector::data(size_t index = 0);
* @brief Pointer to element by index "index"
* \details Example: \snippet picontainers.cpp PIVector::data
* \fn size_t PIVector::size() const;
* @brief Elements count
* \fn ssize_t PIVector::size_s() const;
* @brief Elements count
* \fn bool PIVector::isEmpty() const;
* @brief Return \c "true" if vector is empty, i.e. size = 0
* \fn bool PIVector::has(const T & t) const;
* \fn bool PIVector::contains(const T & v) const;
* @brief Return \c "true" if vector has at least one element equal "t"
* \fn int PIVector::etries(const T & t) const;
* @brief Return how many times element "t" appears in vector
* \fn ssize_t PIVector::indexOf(const T & t) const;
* @brief Return index of first element equal "t" or -1 if there is no such element
* \fn ssize_t PIVector::lastIndexOf(const T & t) const;
* @brief Return index of last element equal "t" or -1 if there is no such element
* \fn static int PIVector::compare_func(const T * t0, const T * t1);
* @brief Standard compare function for type "T". Return 0 if t0 = t1, -1 if t0 < t1 and 1 if t0 > t1.
* \fn void PIVector::resize(size_t size, const T & new_type = T());
* @brief Resize vector to size "size"
* \details Elements removed from end of vector if new size < old size, or added new elements = "new_type" if new size > old size.\n
* Example: \snippet picontainers.cpp PIVector::resize
* \sa \a size(), \a clear()
* \fn PIVector & PIVector::enlarge(size_t size);
* @brief Increase vector size with "size" elements
* \fn void PIVector::clear();
* @brief Clear vector. Equivalent to call <tt>"resize(0)"</tt>
* \fn PIVector & PIVector::sort(CompareFunc compare = compare_func);
* @brief Sort vector using quick sort algorithm and standard compare function
* \details Example: \snippet picontainers.cpp PIVector::sort_0
* With custom compare function: \snippet picontainers.cpp PIVector::sort_1
* \fn PIVector & PIVector::fill(const T & t);
* @brief Fill vector with elements "t" leave size is unchanged and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::fill
* \fn PIVector & PIVector::assign(const T & t = T());
* @brief Synonym of \a fill(t)
* \fn PIVector & PIVector::assign(size_t new_size, const T & t);
* @brief Resize to "new_size", then fill with "t"
* \fn T & PIVector::back();
* @brief Last element of the vector
* \fn const T & PIVector::back() const;
* @brief Last element of the vector
* \fn T & PIVector::front();
* @brief First element of the vector
* \fn const T & PIVector::front() const;
* @brief First element of the vector
* \fn PIVector & PIVector::push_back(const T & t);
* @brief Add new element "t" at the end of vector and return reference to vector
* \fn PIVector & PIVector::push_front(const T & t);
* @brief Add new element "t" at the beginning of vector and return reference to vector
* \fn PIVector & PIVector::pop_back();
* @brief Remove one element from the end of vector and return reference to vector
* \fn PIVector & PIVector::pop_front();
* @brief Remove one element from the beginning of vector and return reference to vector
* \fn T PIVector::take_back();
* @brief Remove one element from the end of vector and return it
* \fn T PIVector::take_front();
* @brief Remove one element from the beginning of vector and return it
* \fn PIVector & PIVector::remove(size_t index);
* @brief Remove one element by index "index" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::remove_0
* \sa \a removeOne(), \a removeAll()
* \fn PIVector & PIVector::remove(size_t index, size_t count);
* @brief Remove "count" elements by first index "index" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::remove_1
* \sa \a removeOne(), \a removeAll()
* \fn PIVector & PIVector::removeOne(const T & v);
* @brief Remove no more than one element equal "v" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::removeOne
* \sa \a remove(), \a removeAll()
* \fn PIVector & PIVector::removeAll(const T & v);
* @brief Remove all elements equal "v" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::removeAll
* \sa \a remove(), \a removeOne()
* \fn PIVector & PIVector::insert(size_t pos, const T & t);
* @brief Insert element "t" after index "pos" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::insert_0
* \fn PIVector & PIVector::insert(size_t pos, const PIVector & t);
* @brief Insert other vector "t" after index "pos" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::insert_1
* \fn T & PIVector::operator [](size_t index);
* @brief Full access to element by index "index"
* \details Example: \snippet picontainers.cpp PIVector::()
* \sa \a at()
* \fn const T & PIVector::operator [](size_t index) const;
* @brief Read-only access to element by index "index"
* \details Example: \snippet picontainers.cpp PIVector::()_c
* \sa \a at()
* \fn PIVector & PIVector::operator <<(const T & t);
* @brief Add new element "t" at the end of vector and return reference to vector
* \fn PIVector & PIVector::operator <<(const PIVector & t);
* @brief Add vector "t" at the end of vector and return reference to vector
* \fn bool PIVector::operator ==(const PIVector & t);
* @brief Compare with vector "t"
* \fn bool PIVector::operator !=(const PIVector & t);
* @brief Compare with vector "t"
* */

View File

@@ -1,11 +1,20 @@
/*! @file pivector.h /*! \addtogroup Containers
* @brief Dynamic array of any type * \{
* * \file pivector.h
* This file declares PIVector * \brief
*/ * \~english Declares \a PIVector
* \~russian Объявление \a PIVector
* \~\authors
* \~english
* Ivan Pelipenko peri4ko@yandex.ru;
* Andrey Bychkov work.a.b@yandex.ru;
* \~russian
* Иван Пелипенко peri4ko@yandex.ru;
* Андрей Бычков work.a.b@yandex.ru;
* \~\} */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Dynamic array of any type Sequence linear container aka dynamic size array of any type
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
@@ -27,13 +36,70 @@
#include "picontainers.h" #include "picontainers.h"
/*! \addtogroup Containers
* \{
* \class PIVector pivector.h
* \brief
* \~english Sequence linear container - dynamic size array of any type
* \~russian Последовательный контейнер с линейной памятью - динамический массив любого типа
* \~\}
* \details
* \~english
* The elements are stored contiguously,
* which means that elements can be accessed not only through iterators,
* but also using offsets to regular pointers to elements.
* This means that a pointer to an element of a vector may be passed to any function
* that expects a pointer to an element of an array.
*
* The storage of the vector is handled automatically,
* being expanded and contracted as needed.
* Vectors usually occupy more space than static arrays,
* because more memory is allocated to handle future growth.
* This way a vector does not need to reallocate each time an element is inserted,
* but only when the additional memory is exhausted.
* The total amount of allocated memory can be queried using \a capacity() function.
* Reallocations are usually costly operations in terms of performance.
* The \a reserve() function can be used to eliminate reallocations
* if the number of elements is known beforehand.
*
* The complexity (efficiency) of common operations on vectors is as follows:
* - Random access - constant 𝓞(1)
* - Insertion or removal of elements at the end - amortized constant 𝓞(1)
* - Insertion or removal of elements - linear in the distance to the end of the vector 𝓞(n)
*
* \~russian
* Элементы хранятся непрерывно, а значит доступны не только через итераторы,
* но и с помощью смещений для обычных указателей на элементы.
* Это означает, что указатель на элемент вектора может передаваться в любую функцию,
* ожидающую указатель на элемент массива.
*
* Память вектора обрабатывается автоматически,
* расширяясь и сжимаясь по мере необходимости.
* Векторы обычно занимают больше места, чем статические массивы,
* поскольку больше памяти выделяется для обработки будущего роста.
* Таким образом, память для вектора требуется выделять
* не при каждой вставке элемента,
* а только после исчерпания дополнительной памяти.
* Общий объём выделенной памяти можно получить с помощью функции \a capacity().
*
* Выделение памяти обычно является дорогостоящей операцией
* с точки зрения производительности.
* Функцию \a reserve() можно использовать для исключения выделения памяти,
* если количество элементов известно заранее.
*
* Сложность (эффективность) обычных операций над векторами следующая:
* - Произвольный доступ — постоянная 𝓞(1)
* - Вставка и удаление элементов в конце — амортизированная постоянная 𝓞(1)
* - Вставка и удаление элементов — линейная по расстоянию до конца вектора 𝓞(n)
*/
template <typename T> template <typename T>
class PIVector { class PIVector {
public: public:
//! Contructs an empty vector
inline PIVector(): piv_data(0), piv_size(0), piv_rsize(0) { inline PIVector(): piv_data(0), piv_size(0), piv_rsize(0) {
PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T)) PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T))
} }
//! \brief Contructs vector with size "size" filled elements "value"
inline PIVector(const T * data, size_t size): piv_data(0), piv_size(0), piv_rsize(0) { inline PIVector(const T * data, size_t size): piv_data(0), piv_size(0), piv_rsize(0) {
PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T)) PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T))
alloc(size); alloc(size);
@@ -44,6 +110,7 @@ public:
alloc(v.piv_size); alloc(v.piv_size);
newT(piv_data, v.piv_data, piv_size); newT(piv_data, v.piv_data, piv_size);
} }
//! \brief Contructs vector from C++11 initializer list
inline PIVector(std::initializer_list<T> init_list): piv_data(0), piv_size(0), piv_rsize(0) { inline PIVector(std::initializer_list<T> init_list): piv_data(0), piv_size(0), piv_rsize(0) {
PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T)) PIINTROSPECTION_CONTAINER_NEW(T, sizeof(T))
alloc(init_list.size()); alloc(init_list.size());
@@ -83,8 +150,6 @@ public:
return *this; return *this;
} }
typedef T value_type;
enum ReshapeOrder { enum ReshapeOrder {
byRow, byRow,
byColumn byColumn
@@ -463,6 +528,10 @@ public:
return *this; return *this;
} }
/*! \brief Remove no more than one element equal "v" and return reference to vector
* \details Example: \snippet picontainers.cpp PIVector::removeOne
* \sa \a remove(), \a removeAll()
*/
inline PIVector<T> & removeOne(const T & e) { inline PIVector<T> & removeOne(const T & e) {
for (size_t i = 0; i < piv_size; ++i) { for (size_t i = 0; i < piv_size; ++i) {
if (piv_data[i] == e) { if (piv_data[i] == e) {
@@ -586,7 +655,7 @@ public:
return ret; return ret;
} }
inline PIVector<PIVector<T>> reshape(size_t rows, size_t cols, int order = byRow) const { inline PIVector<PIVector<T>> reshape(size_t rows, size_t cols, ReshapeOrder order = byRow) const {
PIVector<PIVector<T>> ret; PIVector<PIVector<T>> ret;
if (isEmpty()) return ret; if (isEmpty()) return ret;
assert(rows*cols == piv_size); assert(rows*cols == piv_size);
@@ -610,7 +679,7 @@ public:
template<typename C, typename std::enable_if< template<typename C, typename std::enable_if<
std::is_same<T, PIVector<C>>::value std::is_same<T, PIVector<C>>::value
, int>::type = 0> , int>::type = 0>
inline PIVector<C> reshape(int order = byRow) const { inline PIVector<C> reshape(ReshapeOrder order = byRow) const {
PIVector<C> ret; PIVector<C> ret;
if (isEmpty()) return ret; if (isEmpty()) return ret;
size_t rows = size(); size_t rows = size();

View File

@@ -1,5 +1,5 @@
/*! @file pivector2d.h /*! \file pivector2d.h
* @brief 2D wrapper around PIVector * \brief 2D wrapper around PIVector
* *
* This file declares PIVector * This file declares PIVector
*/ */
@@ -27,7 +27,7 @@
#include "pivector.h" #include "pivector.h"
/*! @brief 2D array, /*! \brief 2D array,
* \details This class used to store 2D array of any type elements as plain vector. * \details This class used to store 2D array of any type elements as plain vector.
* You can read/write any element via operators [][], first dimension - row, second - column. * You can read/write any element via operators [][], first dimension - row, second - column.
* The first dimension is Row, and you can operate with Row as PIVector<T>: modify any element, assign to another Row and etc. * The first dimension is Row, and you can operate with Row as PIVector<T>: modify any element, assign to another Row and etc.

View File

@@ -1,8 +1,16 @@
/*! @file pibase.h /*! \file pibase.h
* @brief Base types and functions * \ingroup Core
* \~\brief
* \~english Base types and functions
* \~russian Базовые типы и методы
* *
* \~\details
* \~english
* This file implements first layer above the system and * This file implements first layer above the system and
* declares some basic useful functions * declares some basic useful functions
* \~russian
* Этот файл реализует первый слой после системы и объявляет
* несколько базовых полезных методов
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -31,90 +39,163 @@
#include "pip_export.h" #include "pip_export.h"
#include "pip_defs.h" #include "pip_defs.h"
#include "string.h" #include "string.h"
//! \~english
//! Meta-information section for any entity. //! Meta-information section for any entity.
//! Parsing by \a pip_cmg and can be accessed by \a PICodeInfo. //! Parsing by \a pip_cmg and can be accessed by \a PICodeInfo.
//! Contains sequence of key=value pairs, e.g. //! Contains sequence of key=value pairs, e.g.
//! \~russian
//! Секция метаинформации для любой сущности.
//! Парсится \a pip_cmg и доступна с помощью \a PICodeInfo.
//! Содержит набор пар ключ=значение, например
//! \~
//! PIMETA(id=12345,tag="my string") //! PIMETA(id=12345,tag="my string")
#define PIMETA(...) #define PIMETA(...)
#ifdef DOXYGEN #ifdef DOXYGEN
//! Major value of PIP version //! \~\brief
//! \~english Major value of PIP version
//! \~russian Мажорная версия PIP
# define PIP_VERSION_MAJOR # define PIP_VERSION_MAJOR
//! Minor value of PIP version //! \~\brief
//! \~english Minor value of PIP version
//! \~russian Минорная версия PIP
# define PIP_VERSION_MINOR # define PIP_VERSION_MINOR
//! Revision value of PIP version //! \~\brief
//! \~english Revision value of PIP version
//! \~russian Ревизия версии PIP
# define PIP_VERSION_REVISION # define PIP_VERSION_REVISION
//! Suffix of PIP version //! \~\brief
//! \~english Suffix of PIP version
//! \~russian Суффикс версии PIP
# define PIP_VERSION_SUFFIX # define PIP_VERSION_SUFFIX
//! Version of PIP in hex - 0x##(Major)##(Minor)##(Revision) //! \~\brief
//! \~english Version of PIP in hex - 0x##(Major)##(Minor)##(Revision)
//! \~russian Версия PIP в hex - 0x##(Major)##(Minor)##(Revision)
# define PIP_VERSION # define PIP_VERSION
//! Macro is defined when compile-time debug is enabled //! \~\brief
//! \~english Macro is defined when compile-time debug is enabled
//! \~russian Макрос объявлен когда включена compile-time отладка
# define PIP_DEBUG # define PIP_DEBUG
//! Macro is defined when host is any Windows //! \~\brief
//! \~english Macro is defined when operation system is any Windows
//! \~russian Макрос объявлен когда операционная система Windows
# define WINDOWS # define WINDOWS
//! Macro is defined when host is QNX or Blackberry //! \~\brief
//! \~english Macro is defined when operation system is QNX or Blackberry
//! \~russian Макрос объявлен когда операционная система QNX или Blackberry
# define QNX # define QNX
//! Macro is defined when host is Blackberry //! \~\brief
//! \~english Macro is defined when operation system is Blackberry
//! \~russian Макрос объявлен когда операционная система Blackberry
# define BLACKBERRY # define BLACKBERRY
//! Macro is defined when host is FreeBSD //! \~\brief
//! \~english Macro is defined when operation system is FreeBSD
//! \~russian Макрос объявлен когда операционная система FreeBSD
# define FREE_BSD # define FREE_BSD
//! Macro is defined when host is Mac OS //! \~\brief
//! \~english Macro is defined when operation system is Mac OS
//! \~russian Макрос объявлен когда операционная система Mac OS
# define MAC_OS # define MAC_OS
//! Macro is defined when host is Android //! \~\brief
//! \~english Macro is defined when operation system is Android
//! \~russian Макрос объявлен когда операционная система Android
# define ANDROID # define ANDROID
//! Macro is defined when host is any Linux //! \~\brief
//! \~english Macro is defined when operation system is any Linux
//! \~russian Макрос объявлен когда операционная система Linux
# define LINUX # define LINUX
//! Macro is defined when compiler is GCC or MinGW //! \~\brief
//! \~english Macro is defined when operation system is FreeRTOS
//! \~russian Макрос объявлен когда операционная система FreeRTOS
# define FREERTOS
//! \~\brief
//! \~english Macro is defined when compiler is GCC or MinGW
//! \~russian Макрос объявлен когда компилятор GCC или MinGW
# define CC_GCC # define CC_GCC
//! Macro is defined when PIP is decided that host is support language //! \~\brief
//! \~english Macro is defined when PIP is decided that host is support language
//! \~russian Макрос объявлен когда PIP решил что система поддерживает локализацию
# define HAS_LOCALE # define HAS_LOCALE
//! Macro is defined when compiler is Visual Studio //! \~\brief
//! \~english Macro is defined when PIP is building for embedded systems
//! \~russian Макрос объявлен когда PIP собирается для встраиваемых систем
# define MICRO_PIP
//! \~\brief
//! \~english Macro is defined when compiler is Visual Studio
//! \~russian Макрос объявлен когда компилятор Visual Studio
# define CC_VC # define CC_VC
//! Macro is defined when compiler is unknown //! \~\brief
//! \~english Macro is defined when compiler is AVR GCC
//! \~russian Макрос объявлен когда компилятор AVR GCC
# define CC_AVR_GCC
//! \~\brief
//! \~english Macro is defined when compiler is unknown
//! \~russian Макрос объявлен когда компилятор неизвестен
# define CC_OTHER # define CC_OTHER
//! Macro is defined when PIP can use "rt" library for "PITimer::ThreadRT" timers implementation //! \~\brief
//! \~english Macro is defined when PIP can use "rt" library for \a PITimer::ThreadRT timers implementation
//! \~russian Макрос объявлен когда PIP может использовать библиотеку "rt" для \a PITimer::ThreadRT реализации таймера
# define PIP_TIMER_RT # define PIP_TIMER_RT
//! Macro to declare private section, export is optional //! \~\brief
//! \~english Macro to declare private section, "export" is optional
//! \~russian Макрос для объявления частной секции, "export" необязателен
# define PRIVATE_DECLARATION(export) # define PRIVATE_DECLARATION(export)
//! Macro to start definition of private section //! \~\brief
//! \~english Macro to start definition of private section
//! \~russian Макрос для начала реализации частной секции
# define PRIVATE_DEFINITION_START(Class) # define PRIVATE_DEFINITION_START(Class)
//! Macro to end definition of private section //! \~\brief
//! \~english Macro to end definition of private section
//! \~russian Макрос для окончания реализации частной секции
# define PRIVATE_DEFINITION_END(Class) # define PRIVATE_DEFINITION_END(Class)
//! Macro to access private section by pointer //! \~\brief
//! \~english Macro to access private section by pointer
//! \~russian Макрос для доступа к частной секции
# define PRIVATE # define PRIVATE
//! Macro to access private section by pointer without brakes () //! \~\brief
//! \~english Macro to access private section by pointer without brakes ()
//! \~russian Макрос для доступа к частной секции без обрамляющих скобок ()
# define PRIVATEWB # define PRIVATEWB
//! Macro to start static initializer //! \~\brief
//! \~english Macro to start static initializer
//! \~russian Макрос для начала статической инициализации
# define STATIC_INITIALIZER_BEGIN # define STATIC_INITIALIZER_BEGIN
//! Macro to end static initializer //! \~\brief
//! \~english Macro to end static initializer
//! \~russian Макрос для окончания статической инициализации
# define STATIC_INITIALIZER_END # define STATIC_INITIALIZER_END
#undef MICRO_PIP
#undef FREERTOS
#endif //DOXYGEN #endif //DOXYGEN
#ifdef CC_AVR_GCC #ifdef CC_AVR_GCC
@@ -144,6 +225,8 @@
extern long long __pi_perf_freq; extern long long __pi_perf_freq;
#endif #endif
#ifndef DOXYGEN
#ifdef ANDROID #ifdef ANDROID
///# define tcdrain(fd) ioctl(fd, TCSBRK, 1) ///# define tcdrain(fd) ioctl(fd, TCSBRK, 1)
//inline int wctomb(char * c, wchar_t w) {*c = ((char * )&w)[0]; return 1;} //inline int wctomb(char * c, wchar_t w) {*c = ((char * )&w)[0]; return 1;}
@@ -225,7 +308,7 @@
# define DEPRECATED # define DEPRECATED
#endif #endif
#endif //DOXYGEN
// Private data macros // Private data macros
#ifndef DOXYGEN #ifndef DOXYGEN
@@ -278,28 +361,47 @@
} _PIP_ADD_COUNTER(_pip_initializer_); } _PIP_ADD_COUNTER(_pip_initializer_);
#ifdef MICRO_PIP //! \~\brief
# define PIP_MIN_MSLEEP 10. //! \~english Minimal sleep in milliseconds for internal PIP using
#else //! \~russian Минимальное значание задержки в милисекундах для внутреннего использования в библиотеке PIP
# define PIP_MIN_MSLEEP 1. //! \~\details
//! \~english Using in \a piMinSleep(), \a PIThread, \a PITimer::Pool. By default 1ms.
//! \~russian Используется в \a piMinSleep(), \a PIThread, \a PITimer::Pool. По умолчанию равна 1мс.
#ifndef PIP_MIN_MSLEEP
# ifndef MICRO_PIP
# define PIP_MIN_MSLEEP 1.
# else
# define PIP_MIN_MSLEEP 10.
# endif
#endif #endif
//! Macro used for infinite loop //! \~\brief
//! \~english Macro used for infinite loop
//! \~russian Макрос для бесконечного цикла
#define FOREVER for (;;) #define FOREVER for (;;)
//! Macro used for infinite wait //! \~\brief
//! \~english Macro used for infinite wait
//! \~russian Макрос для бесконечного ожидания
#define FOREVER_WAIT FOREVER piMinSleep; #define FOREVER_WAIT FOREVER piMinSleep;
//! Macro used for infinite wait //! \~\brief
//! \~english Macro used for infinite wait
//! \~russian Макрос для бесконечного ожидания
#define WAIT_FOREVER FOREVER piMinSleep; #define WAIT_FOREVER FOREVER piMinSleep;
//! global variable enabling output to piCout, default is true //! \~\brief
//! \~english Global variable enabling output to piCout, default is true
//! \~russian Глобальная переменная, включающая вывод в piCout, при старте true
extern PIP_EXPORT bool piDebug; extern PIP_EXPORT bool piDebug;
//! global variable that set minimum real update interval //! \~\brief
//! \~english Global variable that set minimum real update interval
//! for function PIInit::mountInfo(), default is 10000 ms //! for function PIInit::mountInfo(), default is 10000 ms
//! \~russian Глобальная переменная минимального ожидания между реальным обновлением
//! в методе PIInit::mountInfo(), по умолчанию 10000 мс
extern PIP_EXPORT double piMountInfoRefreshIntervalMs; extern PIP_EXPORT double piMountInfoRefreshIntervalMs;
typedef unsigned char uchar; typedef unsigned char uchar;
@@ -310,12 +412,20 @@ typedef unsigned long long ullong;
typedef long long llong; typedef long long llong;
typedef long double ldouble; typedef long double ldouble;
/*! @brief Templated function for swap two values //! \~\brief
* \details Example:\n \snippet piincludes.cpp swap */ //! \~english Templated function for swap two values
//! \~russian Шаблонный метод для перестановки двух значений
//! \~\details
//! \~english Example:\n \snippet piincludes.cpp swap
//! \~russian Пример:\n \snippet piincludes.cpp swap
template<typename T> inline void piSwap(T & f, T & s) {T t(std::move(f)); f = std::move(s); s = std::move(t);} template<typename T> inline void piSwap(T & f, T & s) {T t(std::move(f)); f = std::move(s); s = std::move(t);}
/*! @brief Templated function for swap two values without "=" //! \~\brief
* \details Example:\n \snippet piincludes.cpp swapBinary */ //! \~english Templated function for swap two values without "="
//! \~russian Шаблонный метод для перестановки двух значений без использования "="
//! \~\details
//! \~english Example:\n \snippet piincludes.cpp swapBinary
//! \~russian Пример:\n \snippet piincludes.cpp swapBinary
template<typename T> inline void piSwapBinary(T & f, T & s) { template<typename T> inline void piSwapBinary(T & f, T & s) {
if ((size_t*)&f == (size_t*)&s) return; if ((size_t*)&f == (size_t*)&s) return;
size_t j = (sizeof(T) / sizeof(size_t)), bs = j * sizeof(size_t), bf = sizeof(T); size_t j = (sizeof(T) / sizeof(size_t)), bs = j * sizeof(size_t), bf = sizeof(T);
@@ -350,8 +460,12 @@ template<> inline void piSwapBinary(const void *& f, const void *& s) {
} }
/*! @brief Function for compare two values without "=" by raw content //! \~\brief
* \details Example:\n \snippet piincludes.cpp compareBinary */ //! \~english Function for compare two values without "==" by raw content
//! \~russian Метод для сравнения двух значений без использования "==" (по сырому содержимому)
//! \~\details
//! \~english Example:\n \snippet piincludes.cpp compareBinary
//! \~russian Пример:\n \snippet piincludes.cpp compareBinary
inline bool piCompareBinary(const void * f, const void * s, size_t size) { inline bool piCompareBinary(const void * f, const void * s, size_t size) {
for (size_t i = 0; i < size; ++i) for (size_t i = 0; i < size; ++i)
if (((const uchar*)f)[i] != ((const uchar*)s)[i]) if (((const uchar*)f)[i] != ((const uchar*)s)[i])
@@ -359,146 +473,304 @@ inline bool piCompareBinary(const void * f, const void * s, size_t size) {
return true; return true;
} }
/*! @brief Templated function return round of float falue //! \~\brief
* \details Round is the nearest integer value \n //! \~english Templated function return round of float falue
* There are some macros: //! \~russian Шаблонный метод, возвращающий округленное значение
* - \c piRoundf for "float" //! \~\details
* - \c piRoundd for "double" //! \~english
* //! Round is the nearest integer value \n
* Example: //! There are some macros:
* \snippet piincludes.cpp round */ //! - \c piRoundf for "float"
//! - \c piRoundd for "double"
//!
//! Example:
//! \snippet piincludes.cpp round
//! \~russian
//! Округленное значение - это ближайшее целое число\n
//! Есть несколько макросов:
//! - \c piRoundf для "float"
//! - \c piRoundd для "double"
//!
//! Пример:
//! \snippet piincludes.cpp round
template<typename T> inline constexpr int piRound(const T & v) {return int(v >= T(0.) ? v + T(0.5) : v - T(0.5));} template<typename T> inline constexpr int piRound(const T & v) {return int(v >= T(0.) ? v + T(0.5) : v - T(0.5));}
/*! @brief Templated function return floor of float falue //! \~\brief
* \details Floor is the largest integer that is not greater than value \n //! \~english Templated function return floor of float falue
* There are some macros: //! \~russian Шаблонный метод, возвращающий floor значение
* - \c piFloorf for "float" //! \~\details
* - \c piFloord for "double" //! \~english
* //! Floor is the largest integer that is not greater than "v" \n
* Example: //! There are some macros:
* \snippet piincludes.cpp floor */ //! - \c piFloorf for "float"
//! - \c piFloord for "double"
//!
//! Example:
//! \snippet piincludes.cpp floor
//! \~russian
//! Floor значение - это наибольшее целое, не большее чем "v"\n
//! Есть несколько макросов:
//! - \c piFloorf для "float"
//! - \c piFloord для "double"
//!
//! Пример:
//! \snippet piincludes.cpp floor
template<typename T> inline constexpr int piFloor(const T & v) {return v < T(0) ? int(v) - 1 : int(v);} template<typename T> inline constexpr int piFloor(const T & v) {return v < T(0) ? int(v) - 1 : int(v);}
/*! @brief Templated function return ceil of float falue //! \~\brief
* \details Ceil is the smallest integer that is not less than value \n //! \~english Templated function return ceil of float falue
* There are some macros: //! \~russian Шаблонный метод, возвращающий ceil значение
* - \c piCeilf for "float" //! \~\details
* - \c piCeild for "double" //! \~english
* //! Ceil is the smallest integer that is not less than "v" \n
* Example: //! There are some macros:
* \snippet piincludes.cpp ceil */ //! - \c piCeilf for "float"
//! - \c piCeild for "double"
//!
//! Example:
//! \snippet piincludes.cpp ceil
//! \~russian
//! Ceil значение - это наименьшее целое, не меньшее чем "v" \n
//! Есть несколько макросов:
//! - \c piCeilf для "float"
//! - \c piCeild для "double"
//!
//! Пример:
//! \snippet piincludes.cpp ceil
template<typename T> inline constexpr int piCeil(const T & v) {return v < T(0) ? int(v) : int(v) + 1;} template<typename T> inline constexpr int piCeil(const T & v) {return v < T(0) ? int(v) : int(v) + 1;}
/*! @brief Templated function return absolute of numeric falue //! \~\brief
* \details Absolute is the positive or equal 0 value \n //! \~english Templated function return absolute of numeric falue
* There are some macros: //! \~russian Шаблонный метод, возвращающий модуль числового значения
* - \c piAbss for "short" //! \~\details
* - \c piAbsi for "int" //! \~english
* - \c piAbsl for "long" //! Absolute is the positive or equal 0 value \n
* - \c piAbsll for "llong" //! There are some macros:
* - \c piAbsf for "float" //! - \c piAbss for "short"
* - \c piAbsd for "double" //! - \c piAbsi for "int"
* //! - \c piAbsl for "long"
* Example: //! - \c piAbsll for "llong"
* \snippet piincludes.cpp abs */ //! - \c piAbsf for "float"
//! - \c piAbsd for "double"
//!
//! Example:
//! \snippet piincludes.cpp abs
//! \~russian
//! Модуль числового значения всегда >= 0 \n
//! Есть несколько макросов:
//! - \c piAbss для "short"
//! - \c piAbsi для "int"
//! - \c piAbsl для "long"
//! - \c piAbsll для "llong"
//! - \c piAbsf для "float"
//! - \c piAbsd для "double"
//!
//! Пример:
//! \snippet piincludes.cpp abs
template<typename T> inline constexpr T piAbs(const T & v) {return (v >= T(0) ? v : -v);} template<typename T> inline constexpr T piAbs(const T & v) {return (v >= T(0) ? v : -v);}
/*! @brief Templated function return minimum of two values //! \~\brief
* \details There are some macros: //! \~english Templated function return minimum of two values
* - \c piMins for "short" //! \~russian Шаблонный метод, возвращающий минимум из двух значений
* - \c piMini for "int" //! \~\details
* - \c piMinl for "long" //! \~english
* - \c piMinll for "llong" //! There are some macros:
* - \c piMinf for "float" //! - \c piMins for "short"
* - \c piMind for "double" //! - \c piMini for "int"
* //! - \c piMinl for "long"
* Example: //! - \c piMinll for "llong"
* \snippet piincludes.cpp min2 */ //! - \c piMinf for "float"
//! - \c piMind for "double"
//!
//! Example:
//! \snippet piincludes.cpp min2
//! \~russian
//! Есть несколько макросов:
//! - \c piMins для "short"
//! - \c piMini для "int"
//! - \c piMinl для "long"
//! - \c piMinll для "llong"
//! - \c piMinf для "float"
//! - \c piMind для "double"
//!
//! Пример:
//! \snippet piincludes.cpp min2
template<typename T> inline constexpr T piMin(const T & f, const T & s) {return ((f > s) ? s : f);} template<typename T> inline constexpr T piMin(const T & f, const T & s) {return ((f > s) ? s : f);}
/*! @brief Templated function return minimum of tree values //! \~\brief
* \details There are some macros: //! \~english Templated function return minimum of tree values
* - \c piMins for "short" //! \~russian Шаблонный метод, возвращающий минимум из трех значений
* - \c piMini for "int" //! \~\details
* - \c piMinl for "long" //! \~english
* - \c piMinll for "llong" //! There are some macros:
* - \c piMinf for "float" //! - \c piMins for "short"
* - \c piMind for "double" //! - \c piMini for "int"
* //! - \c piMinl for "long"
* Example: //! - \c piMinll for "llong"
* \snippet piincludes.cpp min3 */ //! - \c piMinf for "float"
//! - \c piMind for "double"
//!
//! Example:
//! \snippet piincludes.cpp min3
//! \~russian
//! Есть несколько макросов:
//! - \c piMins для "short"
//! - \c piMini для "int"
//! - \c piMinl для "long"
//! - \c piMinll для "llong"
//! - \c piMinf для "float"
//! - \c piMind для "double"
//!
//! Пример:
//! \snippet piincludes.cpp min3
template<typename T> inline constexpr T piMin(const T & f, const T & s, const T & t) {return ((f < s && f < t) ? f : ((s < t) ? s : t));} template<typename T> inline constexpr T piMin(const T & f, const T & s, const T & t) {return ((f < s && f < t) ? f : ((s < t) ? s : t));}
/*! @brief Templated function return maximum of two values //! \~\brief
* \details There are some macros: //! \~english Templated function return maximum of two values
* - \c piMaxs for "short" //! \~russian Шаблонный метод, возвращающий максимум из двух значений
* - \c piMaxi for "int" //! \~\details
* - \c piMaxl for "long" //! \~english
* - \c piMaxll for "llong" //! There are some macros:
* - \c piMaxf for "float" //! - \c piMaxs for "short"
* - \c piMaxd for "double" //! - \c piMaxi for "int"
* //! - \c piMaxl for "long"
* Example: //! - \c piMaxll for "llong"
* \snippet piincludes.cpp max2 */ //! - \c piMaxf for "float"
//! - \c piMaxd for "double"
//!
//! Example:
//! \snippet piincludes.cpp max2
//! \~russian
//! Есть несколько макросов:
//! - \c piMaxs для "short"
//! - \c piMaxi для "int"
//! - \c piMaxl для "long"
//! - \c piMaxll для "llong"
//! - \c piMaxf для "float"
//! - \c piMaxd для "double"
//!
//! Пример:
//! \snippet piincludes.cpp max2
template<typename T> inline constexpr T piMax(const T & f, const T & s) {return ((f < s) ? s : f);} template<typename T> inline constexpr T piMax(const T & f, const T & s) {return ((f < s) ? s : f);}
/*! @brief Templated function return maximum of tree values //! \~\brief
* \details There are some macros: //! \~english Templated function return maximum of tree values
* - \c piMaxs for "short" //! \~russian Шаблонный метод, возвращающий максимум из трех значений
* - \c piMaxi for "int" //! \~\details
* - \c piMaxl for "long" //! \~english
* - \c piMaxll for "llong" //! There are some macros:
* - \c piMaxf for "float" //! - \c piMaxs for "short"
* - \c piMaxd for "double" //! - \c piMaxi for "int"
* //! - \c piMaxl for "long"
* Example: //! - \c piMaxll for "llong"
* \snippet piincludes.cpp max3 */ //! - \c piMaxf for "float"
//! - \c piMaxd for "double"
//!
//! Example:
//! \snippet piincludes.cpp max3
//! \~russian
//! Есть несколько макросов:
//! - \c piMaxs для "short"
//! - \c piMaxi для "int"
//! - \c piMaxl для "long"
//! - \c piMaxll для "llong"
//! - \c piMaxf для "float"
//! - \c piMaxd для "double"
//!
//! Пример:
//! \snippet piincludes.cpp max3
template<typename T> inline constexpr T piMax(const T & f, const T & s, const T & t) {return ((f > s && f > t) ? f : ((s > t) ? s : t));} template<typename T> inline constexpr T piMax(const T & f, const T & s, const T & t) {return ((f > s && f > t) ? f : ((s > t) ? s : t));}
/*! @brief Templated function return clamped value //! \~\brief
* \details Clamped is the not greater than "max" and not lesser than "min" value \n //! \~english Templated function return clamped value
* There are some macros: //! \~russian Шаблонный метод, возвращающий ограниченное значение
* - \c piClamps for "short" //! \~\details
* - \c piClampi for "int" //! \~english
* - \c piClampl for "long" //! Clamped is the not greater than "max" and not lesser than "min" value \n
* - \c piClampll for "llong" //! There are some macros:
* - \c piClampf for "float" //! - \c piClamps for "short"
* - \c piClampd for "double" //! - \c piClampi for "int"
* //! - \c piClampl for "long"
* Example: //! - \c piClampll for "llong"
* \snippet piincludes.cpp clamp */ //! - \c piClampf for "float"
//! - \c piClampd for "double"
//!
//! Example:
//! \snippet piincludes.cpp clamp
//! \~russian
//! Ограниченное значение - не больше чем "max" и не меньше чем "min"
//! Есть несколько макросов:
//! - \c piClamps для "short"
//! - \c piClampi для "int"
//! - \c piClampl для "long"
//! - \c piClampll для "llong"
//! - \c piClampf для "float"
//! - \c piClampd для "double"
//!
//! Пример:
//! \snippet piincludes.cpp clamp
template<typename T> inline constexpr T piClamp(const T & v, const T & min, const T & max) {return (v > max ? max : (v < min ? min : v));} template<typename T> inline constexpr T piClamp(const T & v, const T & min, const T & max) {return (v > max ? max : (v < min ? min : v));}
/// Function inverse byte order in memory block //! \~\brief
//! \~english Function inverse byte order in memory block ([1..N] -> [N..1])
//! \~russian Метод для смены порядка байт в блоке памяти ([1..N] -> [N..1])
inline void piLetobe(void * data, int size) { inline void piLetobe(void * data, int size) {
for (int i = 0; i < size / 2; i++) for (int i = 0; i < size / 2; i++)
piSwap<uchar>(((uchar*)data)[size - i - 1], ((uchar*)data)[i]); piSwap<uchar>(((uchar*)data)[size - i - 1], ((uchar*)data)[i]);
} }
/*! @brief Function for compare two numeric values with epsilon //! \~\brief
* \details Example:\n \snippet piincludes.cpp compare //! \~english Function for compare two numeric values with epsilon
* There are some macros: //! \~russian Метод для сравнения двух чисел с порогом
* - \c piComparef for "float" //! \~\details
* - \c piCompared for "double" //! \~english
*/ //! There are some macros:
//! - \c piComparef for "float"
//! - \c piCompared for "double"
//!
//! Example:
//! \snippet piincludes.cpp compare
//! \~russian
//! Есть несколько макросов:
//! - \c piComparef для "float"
//! - \c piCompared для "double"
//!
//! Пример:
//! \snippet piincludes.cpp compare
template<typename T> template<typename T>
inline bool piCompare(const T & a, const T & b, const T & epsilon = std::numeric_limits<T>::epsilon()) { inline bool piCompare(const T & a, const T & b, const T & epsilon = std::numeric_limits<T>::epsilon()) {
return piAbs(a - b) <= epsilon; return piAbs(a - b) <= epsilon;
} }
/// @brief Templated function that inverse byte order of value "v" //! \~\brief
//! \~english Templated function that inverse byte order of value "v"
//! \~russian Шаблонный метод, меняющий порядок байт в переменной "v"
template<typename T> inline void piLetobe(T * v) {piLetobe(v, sizeof(T));} template<typename T> inline void piLetobe(T * v) {piLetobe(v, sizeof(T));}
/*! @brief Templated function that returns "v" with inversed byte order //! \~\brief
* \details This function used to convert values between little and big endian \n //! \~english Templated function that returns "v" with inversed byte order
* There are some macros: //! \~russian Шаблонный метод, возвращающий переменную "v" с измененным порядком байт
* - \c piLetobes for "ushort" //! \~\details
* - \c piLetobei for "uint" //! \~english
* - \c piLetobel for "ulong" //! This function used to convert values between little and big endian \n
* - \c piLetobell for "ullong" //! There are some macros:
* //! - \c piLetobes for "ushort"
* Example: //! - \c piLetobei for "uint"
* \snippet piincludes.cpp letobe */ //! - \c piLetobel for "ulong"
//! - \c piLetobell for "ullong"
//!
//! Example:
//! \snippet piincludes.cpp letobe
//! \~russian
//! Этот метод используется для изменения порядка байт между little и big endian
//! Есть несколько макросов:
//! - \c piLetobes для "ushort"
//! - \c piLetobei для "uint"
//! - \c piLetobel для "ulong"
//! - \c piLetobell для "ullong"
//!
//! Пример:
//! \snippet piincludes.cpp letobe
template<typename T> inline T piLetobe(const T & v) {T tv(v); piLetobe(&tv, sizeof(T)); return tv;} template<typename T> inline T piLetobe(const T & v) {T tv(v); piLetobe(&tv, sizeof(T)); return tv;}
// specialization // specialization
@@ -515,7 +787,9 @@ template<> inline float piLetobe(const float & v) {
return a.f; return a.f;
} }
/// @brief Generic hash function, implements murmur3/32 algorithm //! \~\brief
//! \~english Generic hash function, implements murmur3/32 algorithm
//! \~russian Хэш-функция общего назначения, по алгоритму murmur3/32
inline uint piHashData(const uchar * data, uint len, uint seed = 0) { inline uint piHashData(const uchar * data, uint len, uint seed = 0) {
if (!data || len <= 0) return 0u; if (!data || len <= 0) return 0u;
uint h = seed; uint h = seed;

View File

@@ -1,5 +1,7 @@
/*! @file pibitarray.h /*! \file pibitarray.h
* @brief Bit array * \~\brief
* \~english Bit array
* \~russian Битовый массив
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -21,6 +21,85 @@
#include "pistringlist.h" #include "pistringlist.h"
#include <iostream> #include <iostream>
//! \addtogroup Core
//! \{
//! \class PIByteArray pibytearray.h
//!
//! \~\brief
//! \~english The %PIByteArray class provides an array of bytes
//! \~russian Класс %PIByteArray представляет собой массив байтов
//! \}
//!
//! \~\details
//! \~english
//! %PIByteArray used to store raw bytes.
//! It can be constructed from any data and size.
//! You can use %PIByteArray as binary stream
//! to serialize/deserialize any objects and data.
//! This class based on PIDeque<uchar> and provide some handle function
//! to manipulate it.
//! \~russian
//! %PIByteArray используется для хранения байтов.
//! Он может быть сконструирован из любых даных.
//! Можно использовать %PIByteArray как потоковый объект
//! для сериализации/десериализации любых типов и данных.
//! Этот класс наследован от PIDeque<uchar> и предоставляет набор
//! удобных методов для работы с байтами.
//!
//! \~english \section PIByteArray_sec0 Usage
//! \~russian \section PIByteArray_sec0 Использование
//! \~english
//! %PIByteArray can be used to store custom data and manipulate it. There are many
//! stream operators to store/restore common types to byte array. Store operators
//! places data at the end of array, restore operators takes data from the beginning
//! of array.
//! In addition there are Hex and Base64 convertions
//! \~russian
//! %PIByteArray может быть использован для сохранения любых данных и работы с ними.
//! Он предоставляет множество операторов для сохранения/извлечения общих типов.
//! Операторы сохранения добавляют данные в конец массива, а операторы извлечения
//! берут данные из его начала.
//!
//! \~english
//! One of the major usage of %PIByteArray is stream functions. You can form binary
//! packet from many types (also dynamic types, e.g. PIVector) with one line:
//! \~russian
//! Один из основных сценариев использования %PIByteArray - это потоковый объект.
//! Можно сформировать пакет бинарных данных из многих типов (также и контейнеров,
//! например, PIVector) в одну строку:
//! \~\snippet pibytearray.cpp 0
//!
//! \~english
//! Or you can descibe stream operator of your own type and store/restore vectors of
//! your type:
//! \~russian
//! Также можно описать операторы сохранения/извлечения для собственных типов:
//! \~\snippet pibytearray.cpp 1
//!
//! \~english
//! For store/restore custom data blocks there is PIByteArray::RawData class. Stream
//! operators of this class simply store/restore data block to/from byte array:
//! \~russian
//! Для сохранения/извлечения блоков произвольных данных используется класс PIByteArray::RawData.
//! Потоковые операторы для него просто сохраняют/извлекают блоки байтов:
//! \~\snippet pibytearray.cpp 2
//!
//! \~english \section PIByteArray_sec1 Attention
//! \~russian \section PIByteArray_sec1 Внимание
//! \~english
//! Stream operator of %PIByteArray store byte array as vector, not simply append
//! content of byte array. This operators useful to transmit custom data as %PIByteArray
//! packed into parent byte array, e.g. to form packet from %PIByteArray.
//! To append one byte array to another use funtion \a append().
//! \~russian
//! Потоковый оператор для типа %PIByteArray сохраняет его как контейнер,
//! а не просто добавляет его содержимое в конец. Этот оператор полезен для управляемой
//! упаковки произвольных данных в виде %PIByteArray.
//! Для добавления содержимого одного байтового массива к другому используется
//! метов \a append().
//! \~\snippet pibytearray.cpp 3
//!
static const uchar base64Table[64] = { static const uchar base64Table[64] = {
0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
@@ -221,6 +300,19 @@ PIByteArray & PIByteArray::decompressRLE(uchar threshold) {
} }
//! \~\details
//! \~english
//! This is simple sum of all bytes, if "inverse" then add 1 and inverse.
//! Pseudocode:
//! \~russian
//! Это простая сумма всех байтов, если "inverse", то ещё добавляется 1 и инвертируется результат.
//! Псевдокод:
//! \~\code
//! for (i)
//! sum += at(i);
//! if (inverse) return ~(sum + 1);
//! else return sum;
//! \endcode
uchar PIByteArray::checksumPlain8(bool inverse) const { uchar PIByteArray::checksumPlain8(bool inverse) const {
uchar c = 0; uchar c = 0;
int sz = size_s(); int sz = size_s();
@@ -231,6 +323,19 @@ uchar PIByteArray::checksumPlain8(bool inverse) const {
} }
//! \~\details
//! \~english
//! This is sum of all bytes multiplied by index+1, if inverse then add 1 and inverse.
//! Pseudocode:
//! \~russian
//! Это простая сумма всех байтов, умноженных на индекс+1, если "inverse", то ещё добавляется 1 и инвертируется результат.
//! Псевдокод:
//! \~\code
//! for (i)
//! sum += at(i) * (i + 1);
//! if (inverse) return ~(sum + 1);
//! else return sum;
//! \endcode
uint PIByteArray::checksumPlain32(bool inverse) const { uint PIByteArray::checksumPlain32(bool inverse) const {
uint c = 0; uint c = 0;
int sz = size_s(); int sz = size_s();

View File

@@ -1,5 +1,7 @@
/*! @file pibytearray.h /*! \file pibytearray.h
* @brief Byte array * \~\brief
* \~english Byte array
* \~russian Байтовый массив
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -39,76 +41,49 @@ class PIString;
class PIByteArray; class PIByteArray;
/*! @class PIByteArray
* @brief The PIByteArray class provides an array of bytes
* @details PIByteArray used to store raw bytes.
* It can be constructed from any data and size.
* You can use PIByteArray as binary stream
* to serialize/deserialize any objects and data.
* This class based on PIDeque<uchar> and provide some handle function
* to manipulate it.
*
* @section PIByteArray_sec0 Usage
* %PIByteArray can be used to store custom data and manipulate it. There are many
* stream operators to store/restore common types to byte array. Store operators
* places data at the end of array, restore operators takes data from the beginning
* of array.
* In addition there are Hex and Base64 convertions
*
* One of the major usage of %PIByteArray is stream functions. You can form binary
* packet from many types (also dynamic types, e.g. PIVector) with one line:
* @snippet pibytearray.cpp 0
*
* Or you can descibe stream operator of your own type and store/restore vectors of
* your type:
* @snippet pibytearray.cpp 1
*
* For store/restore custom data blocks there is PIByteArray::RawData class. Stream
* operators of this class simply store/restore data block to/from byte array.
* @snippet pibytearray.cpp 2
*
* @section PIByteArray_sec1 Attention
* Stream operator of %PIByteArray store byte array as vector, not simply append
* content of byte array. This operators useful to transmit custom data as %PIByteArray
* packed into parent byte array, e.g. to form packet from %PIByteArray.
* To append one byte array to another use funtion \a append().
* @snippet pibytearray.cpp 3
*
*
*/
class PIP_EXPORT PIByteArray: public PIDeque<uchar> class PIP_EXPORT PIByteArray: public PIDeque<uchar>
{ {
public: public:
//! Constructs an empty byte array //! \~english Constructs an empty byte array
//! \~russian Создает пустой байтовый массив
PIByteArray() {;} PIByteArray() {;}
//! \~english Constructs copy of byte array "o"
//! \~russian Создает копию байтового массива "o"
PIByteArray(const PIByteArray & o): PIDeque<uchar>(o) {} PIByteArray(const PIByteArray & o): PIDeque<uchar>(o) {}
//! \~english Constructs copy of byte array "o"
//! \~russian Создает копию байтового массива "o"
PIByteArray(const PIDeque<uchar> & o): PIDeque<uchar>(o) {} PIByteArray(const PIDeque<uchar> & o): PIDeque<uchar>(o) {}
PIByteArray(PIByteArray && o): PIDeque<uchar>(std::move(o)) {} PIByteArray(PIByteArray && o): PIDeque<uchar>(std::move(o)) {}
//! Constructs 0-filled byte array with size "size" //! \~english Constructs 0-filled byte array with size "size"
//! \~russian Создает заполненный "0" байтовый массив размером "size"
PIByteArray(const uint size) {resize(size);} PIByteArray(const uint size) {resize(size);}
//! Constructs byte array from data "data" and size "size" //! \~english Constructs byte array from data "data" and size "size"
//! \~russian Создает байтовый массив из данных по указателю "data" размером "size"
PIByteArray(const void * data, const uint size): PIDeque<uchar>((const uchar*)data, size_t(size)) {} PIByteArray(const void * data, const uint size): PIDeque<uchar>((const uchar*)data, size_t(size)) {}
//! Constructs byte array with size "size" filled by "t" //! \~english Constructs byte array with size "size" filled by "t"
//! \~russian Создает заполненный "t" байтовый массив размером "size"
PIByteArray(const uint size, uchar t): PIDeque<uchar>(size, t) {} PIByteArray(const uint size, uchar t): PIDeque<uchar>(size, t) {}
//! Help struct to store/restore custom blocks of data to/from PIByteArray //! \~english Help struct to store/restore custom blocks of data to/from PIByteArray
//! \~russian Вспомогательная структура для сохранения/извлечения произвольного блока данных в/из байтового массива
struct RawData { struct RawData {
friend PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v); friend PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v);
friend PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v); friend PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v);
public: public:
//! Constructs data block //! \~english Constructs data block
//! \~russian Создает блок данных
RawData(void * data = 0, int size = 0) {d = data; s = size;} RawData(void * data = 0, int size = 0) {d = data; s = size;}
RawData(const RawData & o) {d = o.d; s = o.s;} RawData(const RawData & o) {d = o.d; s = o.s;}
//! Constructs data block //! \~english Constructs data block
//! \~russian Создает блок данных
RawData(const void * data, const int size) {d = const_cast<void * >(data); s = size;} RawData(const void * data, const int size) {d = const_cast<void * >(data); s = size;}
RawData & operator =(const RawData & o) {d = o.d; s = o.s; return *this;} RawData & operator =(const RawData & o) {d = o.d; s = o.s; return *this;}
private: private:
@@ -116,22 +91,27 @@ public:
int s; int s;
}; };
//! Return resized byte array //! \~english Return resized byte array
//! \~russian Возвращает копию байтового массива с измененным размером
PIByteArray resized(uint new_size) const {PIByteArray ret(new_size); memcpy(ret.data(), data(), new_size); return ret;} PIByteArray resized(uint new_size) const {PIByteArray ret(new_size); memcpy(ret.data(), data(), new_size); return ret;}
//! Return sub-array starts from "index" and has "count" or less bytes //! \~english Return sub-array starts from "index" and has "count" or less bytes
//! \~russian Возвращает подмассив с данными от индекса "index" и размером не более "count"
PIByteArray getRange(size_t index, size_t count) const { PIByteArray getRange(size_t index, size_t count) const {
return PIDeque<uchar>::getRange(index, count); return PIDeque<uchar>::getRange(index, count);
} }
//! Convert data to Base 64 and return this byte array //! \~english Convert data to Base 64 and return this byte array
//! \~russian Преобразует данные в Base 64 и возвращает текущий массив
PIByteArray & convertToBase64(); PIByteArray & convertToBase64();
//! Convert data from Base 64 and return this byte array //! \~english Convert data from Base 64 and return this byte array
//! \~russian Преобразует данные из Base 64 и возвращает текущий массив
PIByteArray & convertFromBase64(); PIByteArray & convertFromBase64();
//! Return converted to Base 64 data //! \~english Return converted to Base 64 data
//! \~russian Возвращает копию байтового массива, преобразованного в Base 64
PIByteArray toBase64() const; PIByteArray toBase64() const;
PIByteArray & compressRLE(uchar threshold = 192); PIByteArray & compressRLE(uchar threshold = 192);
@@ -139,36 +119,40 @@ public:
PIByteArray compressedRLE(uchar threshold = 192) {PIByteArray ba(*this); ba.compressRLE(threshold); return ba;} PIByteArray compressedRLE(uchar threshold = 192) {PIByteArray ba(*this); ba.compressRLE(threshold); return ba;}
PIByteArray decompressedRLE(uchar threshold = 192) {PIByteArray ba(*this); ba.decompressRLE(threshold); return ba;} PIByteArray decompressedRLE(uchar threshold = 192) {PIByteArray ba(*this); ba.decompressRLE(threshold); return ba;}
//! \~english Return string representation of data, each byte in "base" base, separated by spaces
//! \~russian Возвращает текстовое представление байтового массива, каждый байт в "base" системе, с пробелами
PIString toString(int base = 16) const; PIString toString(int base = 16) const;
//! Returns a hex encoded copy of the byte array. //! \~english
//! Returns a hex encoded copy of the byte array, without spaces.
//! The hex encoding uses the numbers 0-9 and the letters a-f. //! The hex encoding uses the numbers 0-9 and the letters a-f.
//! \~russian
//! Возвращает шестнадцатеричное представление массива, без пробелов.
//! Оно использует цифры 0-9 и буквы a-f.
PIString toHex() const; PIString toHex() const;
//! Add to the end data "data" with size "size" //! \~english Add to the end data "data" with size "size"
//! \~russian Добавляет в конец массива данные по указателю "data" размером "size"
PIByteArray & append(const void * data_, int size_) {uint ps = size(); enlarge(size_); memcpy(data(ps), data_, size_); return *this;} PIByteArray & append(const void * data_, int size_) {uint ps = size(); enlarge(size_); memcpy(data(ps), data_, size_); return *this;}
//! Add to the end byte array "data" //! \~english Add to the end byte array "data"
//! \~russian Добавляет в конец массива содержимое массива "data"
PIByteArray & append(const PIByteArray & data_) {uint ps = size(); enlarge(data_.size_s()); memcpy(data(ps), data_.data(), data_.size()); return *this;} PIByteArray & append(const PIByteArray & data_) {uint ps = size(); enlarge(data_.size_s()); memcpy(data(ps), data_.data(), data_.size()); return *this;}
//! Add to the end "t" //! \~english Add to the end "t"
//! \~russian Добавляет в конец массива байт "t"
PIByteArray & append(uchar t) {push_back(t); return *this;} PIByteArray & append(uchar t) {push_back(t); return *this;}
//! Returns 8-bit checksum //! \~english Returns 8-bit checksum
//! sum all bytes, if inverse - add 1, inverse //! \~russian Возвращает 8-битную контрольную сумму
//! Pseudocode:
//! sum += at(i);
//! return ~(sum + 1)
uchar checksumPlain8(bool inverse = true) const; uchar checksumPlain8(bool inverse = true) const;
//! Returns 32-bit checksum //! \~english Returns 32-bit checksum
//! sum all bytes multiplyed by index+1, if inverse - add 1, inverse //! \~russian Возвращает 32-битную контрольную сумму
//! Pseudocode:
//! sum += at(i) * (i + 1);
//! return ~(sum + 1)
uint checksumPlain32(bool inverse = true) const; uint checksumPlain32(bool inverse = true) const;
//! Returns hash //! \~english Returns hash of content
//! \~russian Возвращает хэш содержимого
uint hash() const; uint hash() const;
void operator =(const PIDeque<uchar> & d) {resize(d.size()); memcpy(data(), d.data(), d.size());} void operator =(const PIDeque<uchar> & d) {resize(d.size()); memcpy(data(), d.data(), d.size());}
@@ -181,7 +165,8 @@ public:
static PIByteArray fromHex(PIString str); static PIByteArray fromHex(PIString str);
//! Return converted from Base 64 data //! \~english Return converted from Base 64 data
//! \~russian Возвращает массив из Base 64 представления
static PIByteArray fromBase64(const PIByteArray & base64); static PIByteArray fromBase64(const PIByteArray & base64);
static PIByteArray fromBase64(const PIString & base64); static PIByteArray fromBase64(const PIString & base64);
@@ -196,7 +181,9 @@ public:
}; };
//! \relatesalso PIByteArray @brief Byte arrays compare operator //! \relatesalso PIByteArray
//! \~english Byte arrays compare operator
//! \~russian Оператор сравнения
inline bool operator <(const PIByteArray & v0, const PIByteArray & v1) { inline bool operator <(const PIByteArray & v0, const PIByteArray & v1) {
if (v0.size() == v1.size()) { if (v0.size() == v1.size()) {
if (v0.isEmpty()) return false; if (v0.isEmpty()) return false;
@@ -205,7 +192,9 @@ inline bool operator <(const PIByteArray & v0, const PIByteArray & v1) {
return v0.size() < v1.size(); return v0.size() < v1.size();
} }
//! \relatesalso PIByteArray @brief Byte arrays compare operator //! \relatesalso PIByteArray
//! \~english Byte arrays compare operator
//! \~russian Оператор сравнения
inline bool operator >(const PIByteArray & v0, const PIByteArray & v1) { inline bool operator >(const PIByteArray & v0, const PIByteArray & v1) {
if (v0.size() == v1.size()) { if (v0.size() == v1.size()) {
if (v0.isEmpty()) return false; if (v0.isEmpty()) return false;
@@ -214,7 +203,9 @@ inline bool operator >(const PIByteArray & v0, const PIByteArray & v1) {
return v0.size() > v1.size(); return v0.size() > v1.size();
} }
//! \relatesalso PIByteArray @brief Byte arrays compare operator //! \relatesalso PIByteArray
//! \~english Byte arrays compare operator
//! \~russian Оператор сравнения
inline bool operator ==(const PIByteArray & v0, const PIByteArray & v1) { inline bool operator ==(const PIByteArray & v0, const PIByteArray & v1) {
if (v0.size() == v1.size()) { if (v0.size() == v1.size()) {
if (v0.isEmpty()) return true; if (v0.isEmpty()) return true;
@@ -223,7 +214,9 @@ inline bool operator ==(const PIByteArray & v0, const PIByteArray & v1) {
return false; return false;
} }
//! \relatesalso PIByteArray @brief Byte arrays compare operator //! \relatesalso PIByteArray
//! \~english Byte arrays compare operator
//! \~russian Оператор сравнения
inline bool operator !=(const PIByteArray & v0, const PIByteArray & v1) { inline bool operator !=(const PIByteArray & v0, const PIByteArray & v1) {
if (v0.size() == v1.size()) { if (v0.size() == v1.size()) {
if (v0.isEmpty()) return false; if (v0.isEmpty()) return false;
@@ -233,11 +226,13 @@ inline bool operator !=(const PIByteArray & v0, const PIByteArray & v1) {
} }
#ifdef PIP_STD_IOSTREAM #ifdef PIP_STD_IOSTREAM
//! \relatesalso PIByteArray @brief Output to std::ostream operator //! \relatesalso PIByteArray \brief Output to std::ostream operator
inline std::ostream & operator <<(std::ostream & s, const PIByteArray & ba); inline std::ostream & operator <<(std::ostream & s, const PIByteArray & ba);
#endif #endif
//! \relatesalso PIByteArray @brief Output to PICout operator //! \relatesalso PIByteArray
//! \~english Output operator to \a PICout
//! \~russian Оператор вывода в \a PICout
PIP_EXPORT PICout operator <<(PICout s, const PIByteArray & ba); PIP_EXPORT PICout operator <<(PICout s, const PIByteArray & ba);
@@ -246,16 +241,24 @@ PIP_EXPORT PICout operator <<(PICout s, const PIByteArray & ba);
// store operators for basic types // store operators for basic types
//! \relatesalso PIByteArray @brief Store operator //! \relatesalso PIByteArray
//! \~english Store operator
//! \~russian Оператор сохранения
inline PIByteArray & operator <<(PIByteArray & s, const bool v) {s.push_back(v); return s;} inline PIByteArray & operator <<(PIByteArray & s, const bool v) {s.push_back(v); return s;}
//! \relatesalso PIByteArray @brief Store operator //! \relatesalso PIByteArray
//! \~english Store operator
//! \~russian Оператор сохранения
inline PIByteArray & operator <<(PIByteArray & s, const char v) {s.push_back(v); return s;} inline PIByteArray & operator <<(PIByteArray & s, const char v) {s.push_back(v); return s;}
//! \relatesalso PIByteArray @brief Store operator //! \relatesalso PIByteArray
//! \~english Store operator
//! \~russian Оператор сохранения
inline PIByteArray & operator <<(PIByteArray & s, const uchar v) {s.push_back(v); return s;} inline PIByteArray & operator <<(PIByteArray & s, const uchar v) {s.push_back(v); return s;}
//! \relatesalso PIByteArray @brief Store operator for any trivial copyable type //! \relatesalso PIByteArray
//! \~english Store operator for any trivial copyable type
//! \~russian Оператор сохранения для тривиальных типов
template<typename T, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray::StreamRef operator <<(PIByteArray & s, const T & v) { inline PIByteArray::StreamRef operator <<(PIByteArray & s, const T & v) {
int os = s.size_s(); int os = s.size_s();
@@ -264,10 +267,14 @@ inline PIByteArray::StreamRef operator <<(PIByteArray & s, const T & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator, see \ref PIByteArray_sec1 for details //! \relatesalso PIByteArray
//! \~english Store operator, see \ref PIByteArray_sec1 for details
//! \~russian Оператор сохранения, подробнее в \ref PIByteArray_sec1
PIP_EXPORT PIByteArray & operator <<(PIByteArray & s, const PIByteArray & v); PIP_EXPORT PIByteArray & operator <<(PIByteArray & s, const PIByteArray & v);
//! \relatesalso PIByteArray @brief Store operator, see \ref PIByteArray_sec1 for details //! \relatesalso PIByteArray
//! \~english Store operator, see \ref PIByteArray_sec1 for details
//! \~russian Оператор сохранения, подробнее в \ref PIByteArray_sec1
inline PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v) { inline PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v) {
int os = s.size_s(); int os = s.size_s();
if (v.s > 0) { if (v.s > 0) {
@@ -277,7 +284,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIByteArray::RawData & v
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator for PIVector of any trivial copyable type //! \relatesalso PIByteArray
//! \~english Store operator for PIVector of any trivial copyable type
//! \~russian Оператор сохранения для PIVector тривиальных типов
template<typename T, template<typename T,
typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0,
typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0> typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0>
@@ -299,7 +308,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIVector<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator for PIDeque of any trivial copyable type //! \relatesalso PIByteArray
//! \~english Store operator for PIDeque of any trivial copyable type
//! \~russian Оператор сохранения для PIDeque тривиальных типов
template<typename T, template<typename T,
typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0,
typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0> typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0>
@@ -321,7 +332,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIDeque<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator for PIVector2D of any trivial copyable type //! \relatesalso PIByteArray
//! \~english Store operator for PIVector2D of any trivial copyable type
//! \~russian Оператор сохранения для PIVector2D тривиальных типов
template<typename T, template<typename T,
typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0,
typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0> typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0>
@@ -342,10 +355,14 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIVector2D<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator //! \relatesalso PIByteArray
//! \~english Store operator
//! \~russian Оператор сохранения
inline PIByteArray & operator <<(PIByteArray & s, const PIBitArray & v) {s << v.size_ << v.data_; return s;} inline PIByteArray & operator <<(PIByteArray & s, const PIBitArray & v) {s << v.size_ << v.data_; return s;}
//! \relatesalso PIPair @brief Store operator //! \relatesalso PIPair
//! \~english Store operator
//! \~russian Оператор сохранения
template<typename Type0, typename Type1> template<typename Type0, typename Type1>
inline PIByteArray & operator <<(PIByteArray & s, const PIPair<Type0, Type1> & v) {s << v.first << v.second; return s;} inline PIByteArray & operator <<(PIByteArray & s, const PIPair<Type0, Type1> & v) {s << v.first << v.second; return s;}
@@ -355,16 +372,24 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIPair<Type0, Type1> & v
// restore operators for basic types // restore operators for basic types
//! \relatesalso PIByteArray @brief Restore operator //! \relatesalso PIByteArray
//! \~english Restore operator
//! \~russian Оператор извлечения
inline PIByteArray & operator >>(PIByteArray & s, bool & v) {assert(s.size() >= 1u); v = s.take_front(); return s;} inline PIByteArray & operator >>(PIByteArray & s, bool & v) {assert(s.size() >= 1u); v = s.take_front(); return s;}
//! \relatesalso PIByteArray @brief Restore operator //! \relatesalso PIByteArray
//! \~english Restore operator
//! \~russian Оператор извлечения
inline PIByteArray & operator >>(PIByteArray & s, char & v) {assert(s.size() >= 1u); v = s.take_front(); return s;} inline PIByteArray & operator >>(PIByteArray & s, char & v) {assert(s.size() >= 1u); v = s.take_front(); return s;}
//! \relatesalso PIByteArray @brief Restore operator //! \relatesalso PIByteArray
//! \~english Restore operator
//! \~russian Оператор извлечения
inline PIByteArray & operator >>(PIByteArray & s, uchar & v) {assert(s.size() >= 1u); v = s.take_front(); return s;} inline PIByteArray & operator >>(PIByteArray & s, uchar & v) {assert(s.size() >= 1u); v = s.take_front(); return s;}
//! \relatesalso PIByteArray @brief Restore operator for any trivial copyable type //! \relatesalso PIByteArray
//! \~english Restore operator for any trivial copyable type
//! \~russian Оператор извлечения для тривиальных типов
template<typename T, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray::StreamRef operator >>(PIByteArray & s, T & v) { inline PIByteArray::StreamRef operator >>(PIByteArray & s, T & v) {
if (s.size() < sizeof(v)) { if (s.size() < sizeof(v)) {
@@ -376,10 +401,14 @@ inline PIByteArray::StreamRef operator >>(PIByteArray & s, T & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator, see \ref PIByteArray_sec1 for details //! \relatesalso PIByteArray
//! \~english Restore operator, see \ref PIByteArray_sec1 for details
//! \~russian Оператор извлечения, подробнее в \ref PIByteArray_sec1
PIP_EXPORT PIByteArray & operator >>(PIByteArray & s, PIByteArray & v); PIP_EXPORT PIByteArray & operator >>(PIByteArray & s, PIByteArray & v);
//! \relatesalso PIByteArray @brief Restore operator, see \ref PIByteArray_sec1 for details //! \relatesalso PIByteArray
//! \~english Restore operator, see \ref PIByteArray_sec1 for details
//! \~russian Оператор извлечения, подробнее в \ref PIByteArray_sec1
inline PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v) { inline PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v) {
if (s.size_s() < v.s) { if (s.size_s() < v.s) {
printf("error with RawData %d < %d\n", (int)s.size_s(), v.s); printf("error with RawData %d < %d\n", (int)s.size_s(), v.s);
@@ -392,7 +421,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIByteArray::RawData v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator for PIVector of any trivial copyable type //! \relatesalso PIByteArray
//! \~english Restore operator for PIVector of any trivial copyable type
//! \~russian Оператор извлечения для PIVector тривиальных типов
template<typename T, template<typename T,
typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0,
typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0> typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0>
@@ -423,7 +454,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIVector<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator for PIDeque of any trivial copyable type //! \relatesalso PIByteArray
//! \~english Restore operator for PIDeque of any trivial copyable type
//! \~russian Оператор извлечения для PIDeque тривиальных типов
template<typename T, template<typename T,
typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0,
typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0> typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0>
@@ -454,7 +487,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIDeque<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator for PIVector2D of any trivial copyable type //! \relatesalso PIByteArray
//! \~english Restore operator for PIVector2D of any trivial copyable type
//! \~russian Оператор извлечения для PIVector2D тривиальных типов
template<typename T, template<typename T,
typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0, typename std::enable_if< std::is_trivially_copyable<T>::value, int>::type = 0,
typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0> typename std::enable_if< std::is_same<decltype(std::declval<PIByteArray&>() << std::declval<const T &>()), PIByteArray::StreamRef>::value, int>::type = 0>
@@ -487,10 +522,14 @@ inline PIByteArray & operator >>(PIByteArray & s, PIVector2D<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator //! \relatesalso PIByteArray
//! \~english Restore operator
//! \~russian Оператор извлечения
inline PIByteArray & operator >>(PIByteArray & s, PIBitArray & v) {assert(s.size_s() >= 8); s >> v.size_ >> v.data_; return s;} inline PIByteArray & operator >>(PIByteArray & s, PIBitArray & v) {assert(s.size_s() >= 8); s >> v.size_ >> v.data_; return s;}
//! \relatesalso PIPair @brief Restore operator //! \relatesalso PIPair
//! \~english Restore operator
//! \~russian Оператор извлечения
template<typename Type0, typename Type1> template<typename Type0, typename Type1>
inline PIByteArray & operator >>(PIByteArray & s, PIPair<Type0, Type1> & v) {s >> v.first >> v.second; return s;} inline PIByteArray & operator >>(PIByteArray & s, PIPair<Type0, Type1> & v) {s >> v.first >> v.second; return s;}
@@ -500,7 +539,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIPair<Type0, Type1> & v) {s >
// store operators for complex types // store operators for complex types
//! \relatesalso PIByteArray @brief Store operator for PIVector of any compound type //! \relatesalso PIByteArray
//! \~english Store operator for PIVector of any compound type
//! \~russian Оператор сохранения для PIVector сложных типов
template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray & operator <<(PIByteArray & s, const PIVector<T> & v) { inline PIByteArray & operator <<(PIByteArray & s, const PIVector<T> & v) {
s << int(v.size_s()); s << int(v.size_s());
@@ -508,7 +549,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIVector<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator for PIDeque of any compound type //! \relatesalso PIByteArray
//! \~english Store operator for PIDeque of any compound type
//! \~russian Оператор сохранения для PIDeque сложных типов
template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray & operator <<(PIByteArray & s, const PIDeque<T> & v) { inline PIByteArray & operator <<(PIByteArray & s, const PIDeque<T> & v) {
s << int(v.size_s()); s << int(v.size_s());
@@ -516,7 +559,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIDeque<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Store operator for PIVector2D of any compound type //! \relatesalso PIByteArray
//! \~english Store operator for PIVector2D of any compound type
//! \~russian Оператор сохранения для PIVector2D сложных типов
template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray & operator <<(PIByteArray & s, const PIVector2D<T> & v) { inline PIByteArray & operator <<(PIByteArray & s, const PIVector2D<T> & v) {
s << int(v.rows()) << int(v.cols()) << v.toPlainVector(); s << int(v.rows()) << int(v.cols()) << v.toPlainVector();
@@ -529,7 +574,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIVector2D<T> & v) {
// restore operators for complex types // restore operators for complex types
//! \relatesalso PIByteArray @brief Restore operator for PIVector of any compound type //! \relatesalso PIByteArray
//! \~english Restore operator for PIVector of any compound type
//! \~russian Оператор извлечения для PIVector сложных типов
template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray & operator >>(PIByteArray & s, PIVector<T> & v) { inline PIByteArray & operator >>(PIByteArray & s, PIVector<T> & v) {
if (s.size_s() < 4) { if (s.size_s() < 4) {
@@ -542,7 +589,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIVector<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator for PIDeque of any compound type //! \relatesalso PIByteArray
//! \~english Restore operator for PIDeque of any compound type
//! \~russian Оператор извлечения для PIDeque сложных типов
template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray & operator >>(PIByteArray & s, PIDeque<T> & v) { inline PIByteArray & operator >>(PIByteArray & s, PIDeque<T> & v) {
if (s.size_s() < 4) { if (s.size_s() < 4) {
@@ -555,7 +604,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIDeque<T> & v) {
return s; return s;
} }
//! \relatesalso PIByteArray @brief Restore operator for PIVector2D of any compound type //! \relatesalso PIByteArray
//! \~english Restore operator for PIVector2D of any compound type
//! \~russian Оператор извлечения для PIVector2D сложных типов
template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0> template<typename T, typename std::enable_if<!std::is_trivially_copyable<T>::value, int>::type = 0>
inline PIByteArray & operator >>(PIByteArray & s, PIVector2D<T> & v) { inline PIByteArray & operator >>(PIByteArray & s, PIVector2D<T> & v) {
if (s.size_s() < 8) { if (s.size_s() < 8) {
@@ -575,6 +626,9 @@ inline PIByteArray & operator >>(PIByteArray & s, PIVector2D<T> & v) {
// other types // other types
//! \relatesalso PIByteArray
//! \~english Store operator
//! \~russian Оператор сохранения
template <typename Key, typename T> template <typename Key, typename T>
inline PIByteArray & operator <<(PIByteArray & s, const PIMap<Key, T> & v) { inline PIByteArray & operator <<(PIByteArray & s, const PIMap<Key, T> & v) {
s << int(v.pim_index.size_s()); s << int(v.pim_index.size_s());
@@ -585,6 +639,9 @@ inline PIByteArray & operator <<(PIByteArray & s, const PIMap<Key, T> & v) {
} }
//! \relatesalso PIByteArray
//! \~english Restore operator
//! \~russian Оператор извлечения
template <typename Key, typename T> template <typename Key, typename T>
inline PIByteArray & operator >>(PIByteArray & s, PIMap<Key, T> & v) { inline PIByteArray & operator >>(PIByteArray & s, PIMap<Key, T> & v) {
if (s.size_s() < 4) { if (s.size_s() < 4) {
@@ -620,16 +677,29 @@ inline PIByteArray & operator >>(PIByteArray & s, T & ) {
} }
//! \relatesalso PIByteArray
//! \~english Returns PIByteArray::hash() of "ba"
//! \~russian Возвращает PIByteArray::hash() от "ba"
template<> inline uint piHash(const PIByteArray & ba) {return ba.hash();} template<> inline uint piHash(const PIByteArray & ba) {return ba.hash();}
//! \relatesalso PIByteArray
//! \~english Swap contents betwee "f" and "s"
//! \~russian Меняет содержимое массивов "f" и "s"
template<> inline void piSwap(PIByteArray & f, PIByteArray & s) {f.swap(s);} template<> inline void piSwap(PIByteArray & f, PIByteArray & s) {f.swap(s);}
//! \relatesalso PIByteArray
//! \~english Store "value" to bytearray and returns it
//! \~russian Сохраняет "value" в байтовый массив и возвращает его
template <typename T> PIByteArray piSerialize(const T & value) { template <typename T> PIByteArray piSerialize(const T & value) {
PIByteArray ret; PIByteArray ret;
ret << value; ret << value;
return ret; return ret;
} }
//! \relatesalso PIByteArray
//! \~english Restore type "T" from bytearray "data" and returns it
//! \~russian Извлекает тип "T" из байтового массива "data" и возвращает его
template <typename T> T piDeserialize(const PIByteArray & data) { template <typename T> T piDeserialize(const PIByteArray & data) {
T ret; T ret;
if (!data.isEmpty()) { if (!data.isEmpty()) {

View File

@@ -1,6 +1,3 @@
/*! @file pichar.h
* @brief Unicode char
*/
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Unicode char Unicode char
@@ -45,11 +42,24 @@ char * __utf8name__ = 0;
# endif # endif
#endif #endif
/*! \class PIChar //! \addtogroup Core
* @brief Unicode char //! \{
* \details This class is wrapper around \c "uint". //! \class PIChar pichar.h
* There are many contructors and information functions //!
*/ //! \~\brief
//! \~english %PIChar represents a single character
//! \~russian %PIChar представляет собой один символ строки
//!
//! \~\details
//! \~english
//! This class is wrapper around UTF16.
//! There are many contructors and information functions
//!
//! \~russian
//! %PIChar хранит один сивол в UTF16. Имеет много контрукторов, геттеров в различные
//! кодировки (системную, консольную, UTF8) и информационных функций.
//!
//! \}
ushort charFromCodepage(const char * c, int size, const char * codepage, int * taken = 0) { ushort charFromCodepage(const char * c, int size, const char * codepage, int * taken = 0) {
@@ -324,7 +334,7 @@ char PIChar::toSystem() const {
PIChar PIChar::toUpper() const { PIChar PIChar::toUpper() const {
if (isAscii()) return PIChar(toupper(ch)); if (isAscii()) return PIChar((ushort)toupper(ch));
#ifdef PIP_ICU #ifdef PIP_ICU
UChar c(0); UChar c(0);
UErrorCode e((UErrorCode)0); UErrorCode e((UErrorCode)0);
@@ -342,7 +352,7 @@ PIChar PIChar::toUpper() const {
PIChar PIChar::toLower() const { PIChar PIChar::toLower() const {
if (isAscii()) return PIChar(tolower(ch)); if (isAscii()) return PIChar((ushort)tolower(ch));
#ifdef PIP_ICU #ifdef PIP_ICU
UChar c(0); UChar c(0);
UErrorCode e((UErrorCode)0); UErrorCode e((UErrorCode)0);

View File

@@ -1,5 +1,7 @@
/*! @file pichar.h /*! \file pichar.h
* @brief Unicode char * \~\brief
* \~english Single string character
* \~russian Один символ строки
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -34,97 +36,134 @@ class PIP_EXPORT PIChar
friend class PIString; friend class PIString;
friend PICout PIP_EXPORT operator <<(PICout s, const PIChar & v); friend PICout PIP_EXPORT operator <<(PICout s, const PIChar & v);
public: public:
//! Contructs ascii symbol //! \~english Contructs Ascii symbol
//! \~russian Создает символ Ascii
PIChar(const char c) {ch = c; ch &= 0xFF;} PIChar(const char c) {ch = c; ch &= 0xFF;}
//! Contructs 2-bytes symbol //! \~english Contructs 2-bytes symbol
//! \~russian Создает 2-байтный символ
PIChar(const short c) {ch = c;} PIChar(const short c) {ch = c;}
//! Contructs 4-bytes symbol //! \~english Contructs ascii symbol
PIChar(const int c) {ch = c;} //! \~russian Создает символ Ascii
PIChar(const uchar c) {ch = c;}
//! Contructs ascii symbol //! \~english Contructs 2-bytes symbol
PIChar(const uchar c) {ch = c; ch &= 0xFF;} //! \~russian Создает 2-байтный символ
PIChar(const ushort c = 0) {ch = c;}
//! Contructs 2-bytes symbol //! \~english Contructs symbol from system locale and no more than 4 bytes of string
PIChar(const ushort c) {ch = c;} //! \~russian Создает символ из системной локали не более 4 байт длины
//! Default constructor. Contructs 4-bytes symbol
PIChar(const uint c = 0) {ch = c;}
//! Contructs symbol from no more than 4 bytes of string
PIChar(const char * c, int * bytes = 0); PIChar(const char * c, int * bytes = 0);
//! Copy operator //! \~english Copy operator
//! \~russian Оператор присваивания
PIChar & operator =(const char v) {ch = v; return *this;} PIChar & operator =(const char v) {ch = v; return *this;}
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator ==(const PIChar & o) const; bool operator ==(const PIChar & o) const;
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator !=(const PIChar & o) const {return !(o == *this);} bool operator !=(const PIChar & o) const {return !(o == *this);}
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >(const PIChar & o) const; bool operator >(const PIChar & o) const;
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <(const PIChar & o) const; bool operator <(const PIChar & o) const;
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >=(const PIChar & o) const; bool operator >=(const PIChar & o) const;
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <=(const PIChar & o) const; bool operator <=(const PIChar & o) const;
//! Return \b true if symbol is digit ('0' to '9') //! \~english Returns \b true if symbol is digit ('0' to '9')
//! \~russian Возвращает \b true если символ является
bool isDigit() const; bool isDigit() const;
//! Return \b true if symbol is HEX digit ('0' to '9', 'a' to 'f', 'A' to 'F') //! \~english Returns \b true if symbol is HEX digit ('0' to '9', 'a' to 'f', 'A' to 'F')
//! \~russian Возвращает \b true если символ является HEX цифрой ('0' до '9', 'a' до 'f', 'A' до 'F')
bool isHex() const; bool isHex() const;
//! Return \b true if symbol is drawable (without space) //! \~english Returns \b true if symbol is drawable (without space)
//! \~russian Возвращает \b true если символ является графическим (исключая пробельные)
bool isGraphical() const; bool isGraphical() const;
//! Return \b true if symbol is control byte (< 32 or 127) //! \~english Returns \b true if symbol is control byte (< 32 or 127)
//! \~russian Возвращает \b true если символ является контрольным (< 32 or 127)
bool isControl() const; bool isControl() const;
//! Return \b true if symbol is in lower case //! \~english Returns \b true if symbol is in lower case
//! \~russian Возвращает \b true если символ в нижнем регистре
bool isLower() const; bool isLower() const;
//! Return \b true if symbol is in upper case //! \~english Returns \b true if symbol is in upper case
//! \~russian Возвращает \b true если символ в верхнем регистре
bool isUpper() const; bool isUpper() const;
//! Return \b true if symbol is printable (with space) //! \~english Returns \b true if symbol is printable (with space)
//! \~russian Возвращает \b true если символ является печатным (включая пробельные)
bool isPrint() const; bool isPrint() const;
//! Return \b true if symbol is space or tab //! \~english Returns \b true if symbol is space or tab
//! \~russian Возвращает \b true если символ является пробельным или табуляцией
bool isSpace() const; bool isSpace() const;
//! Return \b true if symbol is alphabetical letter //! \~english Returns \b true if symbol is alphabetical letter
//! \~russian Возвращает \b true если символ является алфавитной буквой
bool isAlpha() const; bool isAlpha() const;
//! Return \b true if symbol is ascii (< 128) //! \~english Returns \b true if symbol is Ascii (< 128)
//! \~russian Возвращает \b true если символ является Ascii (< 128)
bool isAscii() const; bool isAscii() const;
const wchar_t * toWCharPtr() const; const wchar_t * toWCharPtr() const;
//! Return as <tt>"char * "</tt> string //! \~english Returns as <tt>"char * "</tt> string
//! \~russian Возвращает символ как указатель на <tt>"char * "</tt>
const char * toCharPtr() const; const char * toCharPtr() const;
wchar_t toWChar() const; wchar_t toWChar() const;
//! \~english Returns symbol as Ascii
//! \~russian Возвращает символ в Ascii
char toAscii() const {return ch % 256;} char toAscii() const {return ch % 256;}
//! \~english Returns symbol as console codepage
//! \~russian Возвращает символ в консольной кодировке
char toConsole1Byte() const; char toConsole1Byte() const;
//! \~english Returns symbol as system codepage
//! \~russian Возвращает символ в системной кодировке
char toSystem() const; char toSystem() const;
ushort unicode16Code() const {return ch;} ushort unicode16Code() const {return ch;}
//! Return symbol in upper case //! \~english Returns symbol in upper case
//! \~russian Возвращает символ в нижнем регистре
PIChar toUpper() const; PIChar toUpper() const;
//! Return symbol in lower case //! \~english Returns symbol in lower case
//! \~russian Возвращает символ в верхнем регистре
PIChar toLower() const; PIChar toLower() const;
//! \~english Returns symbol from console codepage
//! \~russian Возвращает символ из консольной кодировки
static PIChar fromConsole(char c); static PIChar fromConsole(char c);
//! \~english Returns symbol from system codepage
//! \~russian Возвращает символ из системной кодировки
static PIChar fromSystem(char c); static PIChar fromSystem(char c);
//! \~english Returns symbol from UTF8 codepage
//! \~russian Возвращает символ из UTF8 кодировки
static PIChar fromUTF8(const char * c); static PIChar fromUTF8(const char * c);
private: private:
@@ -132,54 +171,86 @@ private:
}; };
//! Output operator to \a PICout //! \relatesalso PIChar
//! \~english Output operator to \a PICout
//! \~russian Оператор вывода в \a PICout
PICout PIP_EXPORT operator <<(PICout s, const PIChar & v); PICout PIP_EXPORT operator <<(PICout s, const PIChar & v);
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator ==(const char v, const PIChar & c) {return (PIChar(v) == c);} inline bool operator ==(const char v, const PIChar & c) {return (PIChar(v) == c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator >(const char v, const PIChar & c) {return (PIChar(v) > c);} inline bool operator >(const char v, const PIChar & c) {return (PIChar(v) > c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator <(const char v, const PIChar & c) {return (PIChar(v) < c);} inline bool operator <(const char v, const PIChar & c) {return (PIChar(v) < c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator >=(const char v, const PIChar & c) {return (PIChar(v) >= c);} inline bool operator >=(const char v, const PIChar & c) {return (PIChar(v) >= c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator <=(const char v, const PIChar & c) {return (PIChar(v) <= c);} inline bool operator <=(const char v, const PIChar & c) {return (PIChar(v) <= c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator ==(const char * v, const PIChar & c) {return (PIChar(v) == c);} inline bool operator ==(const char * v, const PIChar & c) {return (PIChar(v) == c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator >(const char * v, const PIChar & c) {return (PIChar(v) > c);} inline bool operator >(const char * v, const PIChar & c) {return (PIChar(v) > c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator <(const char * v, const PIChar & c) {return (PIChar(v) < c);} inline bool operator <(const char * v, const PIChar & c) {return (PIChar(v) < c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator >=(const char * v, const PIChar & c) {return (PIChar(v) >= c);} inline bool operator >=(const char * v, const PIChar & c) {return (PIChar(v) >= c);}
//! Compare operator //! \relatesalso PIChar
//! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator <=(const char * v, const PIChar & c) {return (PIChar(v) <= c);} inline bool operator <=(const char * v, const PIChar & c) {return (PIChar(v) <= c);}
//! Compare operator //! \relatesalso PIChar
inline bool operator ==(const int v, const PIChar & c) {return (PIChar(v) == c);} //! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator ==(const int v, const PIChar & c) {return (PIChar((ushort)v) == c);}
//! Compare operator //! \relatesalso PIChar
inline bool operator >(const int v, const PIChar & c) {return (PIChar(v) > c);} //! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator >(const int v, const PIChar & c) {return (PIChar((ushort)v) > c);}
//! Compare operator //! \relatesalso PIChar
inline bool operator <(const int v, const PIChar & c) {return (PIChar(v) < c);} //! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator <(const int v, const PIChar & c) {return (PIChar((ushort)v) < c);}
//! Compare operator //! \relatesalso PIChar
inline bool operator >=(const int v, const PIChar & c) {return (PIChar(v) >= c);} //! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator >=(const int v, const PIChar & c) {return (PIChar((ushort)v) >= c);}
//! Compare operator //! \relatesalso PIChar
inline bool operator <=(const int v, const PIChar & c) {return (PIChar(v) <= c);} //! \~english Compare operator
//! \~russian Оператор сравнения
inline bool operator <=(const int v, const PIChar & c) {return (PIChar((ushort)v) <= c);}
#endif // PICHAR_H #endif // PICHAR_H

View File

@@ -19,45 +19,77 @@
#include "pichunkstream.h" #include "pichunkstream.h"
/*! \class PIChunkStream //! \addtogroup Core
* @brief Class for binary serialization //! \{
* //! \class PIChunkStream pichunkstream.h
* \section PIChunkStream_sec0 Synopsis //! \brief
* This class provides very handly mechanism to store and restore values to and from //! \~english Class for binary de/serialization
* \a PIByteArray. The main advantage of using this class is that your binary data //! \~russian Класс для бинарной де/сериализации
* become independent from order and collection of your values. //!
* //! \~english \section PIChunkStream_sec0 Synopsis
* \section PIChunkStream_sec1 Mechanism //! \~russian \section PIChunkStream_sec0 Краткий обзор
* %PIChunkStream works with items called "chunk". Chunk is an ID and any value that //! \~english
* can be stored and restored to \a PIByteArray with stream operators << and >>. //! This class provides very handly mechanism to store and restore values to and from
* You can place chunks to stream and read chunks from stream. //! \a PIByteArray. The main advantage of using this class is that your binary data
* //! become independent from order and collection of your values.
* To construct %PIChunkStream for writing data use any constructor. Empty constructor //!
* creates internal empty buffer that can be accessed by function \a data(). //! \~russian
* Non-empty constructor works with given byte array. //! Этот класс предоставляет очень удобный механизм для сохранения и извлечения значений
* //! в/из \a PIByteArray. Главным плюсом является то, что данные не будут зависеть от порядка
* To read chunks from byte array use function \a read() that returns ID of //! и наличия значений.
* next chunk. Then you can get value of this chunk with function \a getData(), //!
* but you should definitely know type of this value. You can read from byte array //! \~english \section PIChunkStream_sec1 Mechanism
* while \a atEnd() if false. //! \~russian \section PIChunkStream_sec1 Механизм
* //! \~english
* \section PIChunkStream_sec2 Examples //! %PIChunkStream works with items called "chunk". Chunk is an ID, size and any value that
* //! can be stored and restored to/from %PIChunkStream with stream operators << and >>.
* Using simple operator and cascade serialization: //!
* //! To construct %PIChunkStream for writing data use any non-default constructor. Empty constructor
* Prepare your structs to work with %PIChunkStream: //! creates internal buffer that can be accessed by function \a data().
* \snippet pichunkstream.cpp struct //! Non-empty constructor works with given byte array.
* Old-style writing to %PIChunkStream: //!
* \snippet pichunkstream.cpp write //! To read chunks from byte array use function \a read() that returns ID of
* Fastest reading from %PIChunkStream: //! readed chunk. Then you can get value of this chunk with functions \a getData() or \a get(),
* \snippet pichunkstream.cpp read //! but you should definitely know type of this value. You can read from byte array
* //! while \a atEnd() if false.
* And next code show how to serialize your struct with %PIChunkStream: //!
* \snippet pichunkstream.cpp write_new //! \~russian
* //! %PIChunkStream работает с элементами под названием "чанк". Чанк имеет ID, размер и значение,
* ... and deserialize: //! и может быть записан или прочитан в/из %PIChunkStream с помощью операторов << и >>.
* \snippet pichunkstream.cpp read_new //!
*/ //! Для создания потока на запись используется любой не-умолчальный конструктор. Пустой конструктор
//! создает внутренний буфер, который можно получить с помощью метода \a data().
//! Непустой конструктор работает с переданным байтовым массивом.
//!
//! Для чтения чанков из байтового массива используется метод \a read(), который возвращает
//! ID прочитанного чанка. Получить значение этого чанка далее можно с помощью методов \a getData() или get(),
//! но тип значения должен быть известен. Читать из потока можно пока метод \a atEnd() возвращает ложь.
//!
//! \~english \section PIChunkStream_sec2 Examples
//! \~russian \section PIChunkStream_sec2 Пример
//!
//! \~english Using simple operator and cascade serialization:
//! \~russian Использование простого оператора и каскадная сериализация:
//!
//! \~english Prepare your structs to work with %PIChunkStream:
//! \~russian Подготовка своей структуры для работы с %PIChunkStream:
//! \~\snippet pichunkstream.cpp struct
//! \~english Old-style writing to %PIChunkStream:
//! \~russian Старый стиль использования %PIChunkStream:
//! \~\snippet pichunkstream.cpp write
//! \~english Fastest reading from %PIChunkStream:
//! \~russian Самое быстрое чтение из %PIChunkStream:
//! \~\snippet pichunkstream.cpp read
//!
//! \~english And next code show how to serialize your struct with %PIChunkStream:
//! \~russian Следующий код показывает, как сериализовать свою структуру в %PIChunkStream:
//! \~\snippet pichunkstream.cpp write_new
//!
//! \~english ... and deserialize:
//! \~russian ... в десериализовать:
//! \~\snippet pichunkstream.cpp read_new
//!
//! \}
void PIChunkStream::setSource(const PIByteArray & data) { void PIChunkStream::setSource(const PIByteArray & data) {

View File

@@ -1,5 +1,7 @@
/*! @file pichunkstream.h /*! \file pichunkstream.h
* @brief Binary markup serializator * \~\brief
* \~english Binary markup de/serializator stream
* \~russian Бинарный поток для де/сериализации с разметкой
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -30,20 +32,27 @@ class PIP_EXPORT PIChunkStream
{ {
public: public:
//! \~english
//! Version of data packing. Read-access %PIChunkStream automatic detect version, but write-access //! Version of data packing. Read-access %PIChunkStream automatic detect version, but write-access
//! %PIChunkStream by default write in new version, be careful! //! %PIChunkStream by default write in new version, be careful!
//! \~russian
//! Версия хранения данных. %PIChunkStream на чтение автоматически определяет версию, но для записи
//! использует по умолчанию новую, осторожно!
enum Version { enum Version {
Version_1 /*! First, old version */, Version_1 /*! \~english First, old version \~russian Первая, старая версия */,
Version_2 /*! Second, more optimized version */ = 2, Version_2 /*! \~english Second, more optimized version \~russian Вторая, более оптимизированная версия */ = 2,
}; };
//! Contructs stream for read from "data" //! \~english Contructs stream for read from "data"
//! \~russian Создает поток на чтение из "data"
PIChunkStream(const PIByteArray & data): version_(Version_2) {setSource(data);} PIChunkStream(const PIByteArray & data): version_(Version_2) {setSource(data);}
//! Contructs stream for read or write to/from "data", or empty stream for write //! \~english Contructs stream for read or write to/from "data", or empty stream for write if "data" = 0
//! \~russian Создает поток на чтение или запись из/в "data", или пустой поток на запись если "data" = 0
PIChunkStream(PIByteArray * data = 0, Version v = Version_2): version_(v) {setSource(data);} PIChunkStream(PIByteArray * data = 0, Version v = Version_2): version_(v) {setSource(data);}
//! Contructs empty stream for write with version \"v\" //! \~english Contructs empty stream for write with version \"v\"
//! \~russian Создает пустой поток на запись с версией \"v\"
PIChunkStream(Version v): version_(v) {setSource(0);} PIChunkStream(Version v): version_(v) {setSource(0);}
~PIChunkStream(); ~PIChunkStream();
@@ -61,48 +70,64 @@ public:
const T & data; const T & data;
}; };
//! Returns chunk with ID "id" and value "data" for write to stream //! \~english Returns chunk with ID "id" and value "data" for write to stream
//! \~russian Возвращает чанк с ID "id" и значением "data" для записи в поток
template <typename T> static ChunkConst<T> chunk(int id, const T & data) {return ChunkConst<T>(id, data);} template <typename T> static ChunkConst<T> chunk(int id, const T & data) {return ChunkConst<T>(id, data);}
//! Add data to this chunk strean with ID "id" and value "data" //! \~english Add to this stream chunk with ID "id" and value "data"
//! \~russian Добавляет в этот поток чанк с ID "id" и значением "data"
template <typename T> PIChunkStream & add(int id, const T & data) {*this << ChunkConst<T>(id, data); return *this;} template <typename T> PIChunkStream & add(int id, const T & data) {*this << ChunkConst<T>(id, data); return *this;}
//! \~english
//! Extract %PIByteArray from "data" and set it current stream. //! Extract %PIByteArray from "data" and set it current stream.
//! If "read_all" then call \a readAll() after extract. //! If "read_all" then call \a readAll() after extract.
//! Returns if has data to read. //! Returns if has data to read.
//! \~russian
//! Извлекает %PIByteArray из "data" и инициализирует им поток.
//! Если указан "read_all", то вызывает \a readAll() после инициализации.
//! Возвращает если ли данные для чтения.
bool extract(PIByteArray & data, bool read_all = false); bool extract(PIByteArray & data, bool read_all = false);
void setSource(const PIByteArray & data); void setSource(const PIByteArray & data);
void setSource(PIByteArray * data); void setSource(PIByteArray * data);
//! Returns internal buffer with written data //! \~english Returns internal buffer with written data
//! \~russian Возвращает внутренний буфер с записанными данными
PIByteArray data() const; PIByteArray data() const;
//! Returns if there is end of stream //! \~english Returns if there is end of stream
//! \~russian Возвращает достигнут ли конец потока
bool atEnd() const {return data_->size_s() <= 1;} bool atEnd() const {return data_->size_s() <= 1;}
//! Returns stream version //! \~english Returns stream version
//! \~russian Возвращает версию потока
Version version() const {return (Version)version_;} Version version() const {return (Version)version_;}
//! Read one chunk from stream and returns its ID //! \~english Read one chunk from stream and returns its ID
//! \~russian Читает один чанк из потока и возвращает его ID
int read(); int read();
//! Read all chunks from stream. This function just index input data //! \~english Read all chunks from stream. This function just index input data
//! \~russian Читает все чанки из потока. Данный метод лишь индексирует данные
void readAll(); void readAll();
//! Returns last readed chunk ID //! \~english Returns last readed chunk ID
//! \~russian Возвращает ID последнего прочитанного чанка
int getID() {return last_id;} int getID() {return last_id;}
//! Returns value of last readed chunk //! \~english Returns value of last readed chunk
//! \~russian Возвращает значение последнего прочитанного чанка
template <typename T> template <typename T>
T getData() const {T ret; PIByteArray s(last_data); s >> ret; return ret;} T getData() const {T ret; PIByteArray s(last_data); s >> ret; return ret;}
//! Place value of last readed chunk into \"v\" //! \~english Place value of last readed chunk into \"v\"
//! \~russian Записывает значение последнего прочитанного чанка в \"v\"
template <typename T> template <typename T>
void get(T & v) const {v = getData<T>();} void get(T & v) const {v = getData<T>();}
//! Place value of chunk with id \"id\" into \"v\". You should call \a readAll() before using this function! //! \~english Place value of chunk with ID \"id\" into \"v\". You should call \a readAll() before using this function!
//! \~russian Записывает значение чанка с ID \"id\" в \"v\". Необходимо вызвать \a readAll() перед использованием этого метода!
template <typename T> template <typename T>
const PIChunkStream & get(int id, T & v) const { const PIChunkStream & get(int id, T & v) const {
CacheEntry pos = data_map.value(id); CacheEntry pos = data_map.value(id);
@@ -113,7 +138,8 @@ public:
return *this; return *this;
} }
//! Replace value of chunk with ID \"id\" to \"v\". You should call \a readAll() before using this function! //! \~english Replace value of chunk with ID \"id\" to \"v\". You should call \a readAll() before using this function!
//! \~russian Заменяет значение чанка с ID \"id\" на \"v\". Необходимо вызвать \a readAll() перед использованием этого метода!
template <typename T> template <typename T>
PIChunkStream & set(int id, const T & v) { PIChunkStream & set(int id, const T & v) {
PIByteArray ba; PIByteArray ba;

View File

@@ -21,16 +21,32 @@
#include "pisysteminfo.h" #include "pisysteminfo.h"
/*! \class PICLI //! \addtogroup Core
* @brief Command-line arguments parser //! \{
* //! \class PICLI picli.h
* \section PICLI_sec0 Synopsis //! \~\brief
* This class provide handy parsing of command-line arguments. First you should add //! \~english Command-Line parser
* arguments to PICLI with function \a addArgument(). Then you can check if there //! \~russian Парсер командной строки
* is some argument in application command-line with function \a hasArgument(); //!
* \section PICLI_sec1 Example //! \~english \section PICLI_sec0 Synopsis
* \snippet picli.cpp main //! \~russian \section PICLI_sec0 Краткий обзор
*/ //! \~english
//! This class provide handy parsing of command-line arguments. First you should add
//! arguments to %PICLI with function \a addArgument(). Then you can check if there
//! is some argument in application command-line with function \a hasArgument(),
//! or obtain argument value by \a argumentValue().
//!
//! \~russian
//! Этот класс предоставляет удобный механизм для разбора аргументов командной строки.
//! Сперва необходимо добавить аргументы в %PICLI с помощью методов \a addArgument().
//! Далее можно проверять аргументы на наличие в командной строке методом \a hasArgument(),
//! а также получить их значения при помощи \a argumentValue().
//!
//! \~english \section PICLI_sec1 Example
//! \~russian \section PICLI_sec0 Пример
//! \~\snippet picli.cpp main
//!
//! /}
PICLI::PICLI(int argc, char * argv[]) { PICLI::PICLI(int argc, char * argv[]) {

View File

@@ -1,5 +1,7 @@
/*! @file picli.h /*! \file picli.h
* @brief Command-Line parser * \~\brief
* \~english Command-Line parser
* \~russian Парсер командной строки
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -30,39 +32,54 @@ class PIP_EXPORT PICLI: public PIObject
PIOBJECT_SUBCLASS(PICLI, PIObject) PIOBJECT_SUBCLASS(PICLI, PIObject)
public: public:
//! Constructor //! \~english Constructor
//! \~russian Конструктор
PICLI(int argc, char * argv[]); PICLI(int argc, char * argv[]);
//! Add argument with name "name", short key = name first letter, full key = name //! \~english Add argument with name "name", short key = name first letter and full key = name
//! \~russian Добавляет аргумент с именем "name", коротким ключом = первой букве имени и полным ключом = имени
void addArgument(const PIString & name, bool value = false) {_args << Argument(name, name[0], name, value); needParse = true;} void addArgument(const PIString & name, bool value = false) {_args << Argument(name, name[0], name, value); needParse = true;}
//! Add argument with name "name", short key = "shortKey", full key = name //! \~english Add argument with name "name", short key = "shortKey" and full key = name
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = имени
void addArgument(const PIString & name, const PIChar & shortKey, bool value = false) {_args << Argument(name, shortKey, name, value); needParse = true;} void addArgument(const PIString & name, const PIChar & shortKey, bool value = false) {_args << Argument(name, shortKey, name, value); needParse = true;}
//! Add argument with name "name", short key = "shortKey", full key = name //! \~english Add argument with name "name", short key = "shortKey" and full key = name
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = имени
void addArgument(const PIString & name, const char * shortKey, bool value = false) {_args << Argument(name, PIChar(shortKey), name, value); needParse = true;} void addArgument(const PIString & name, const char * shortKey, bool value = false) {_args << Argument(name, PIChar(shortKey), name, value); needParse = true;}
//! Add argument with name "name", short key = "shortKey", full key = "fullKey" //! \~english Add argument with name "name", short key = "shortKey" and full key = "fullKey"
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = "fullKey"
void addArgument(const PIString & name, const PIChar & shortKey, const PIString & fullKey, bool value = false) {_args << Argument(name, shortKey, fullKey, value); needParse = true;} void addArgument(const PIString & name, const PIChar & shortKey, const PIString & fullKey, bool value = false) {_args << Argument(name, shortKey, fullKey, value); needParse = true;}
//! Add argument with name "name", short key = "shortKey", full key = "fullKey" //! \~english Add argument with name "name", short key = "shortKey" and full key = "fullKey"
//! \~russian Добавляет аргумент с именем "name", коротким ключом = "shortKey" и полным ключом = "fullKey"
void addArgument(const PIString & name, const char * shortKey, const PIString & fullKey, bool value = false) {_args << Argument(name, PIChar(shortKey), fullKey, value); needParse = true;} void addArgument(const PIString & name, const char * shortKey, const PIString & fullKey, bool value = false) {_args << Argument(name, PIChar(shortKey), fullKey, value); needParse = true;}
//! Returns unparsed command-line argument by index "index". Index 0 is program execute command. //! \~english Returns unparsed command-line argument by index "index". Index 0 is program execute command
//! \~russian Возвращает исходный аргумент командной строки по индексу "index". Индекс 0 это команда вызова программы
PIString rawArgument(int index) {parse(); return _args_raw[index];} PIString rawArgument(int index) {parse(); return _args_raw[index];}
PIString mandatoryArgument(int index) {parse(); return _args_mand[index];} PIString mandatoryArgument(int index) {parse(); return _args_mand[index];}
PIString optionalArgument(int index) {parse(); return _args_opt[index];} PIString optionalArgument(int index) {parse(); return _args_opt[index];}
//! Returns unparsed command-line arguments //! \~english Returns unparsed command-line arguments
//! \~russian Возвращает исходные аргументы командной строки
const PIStringList & rawArguments() {parse(); return _args_raw;} const PIStringList & rawArguments() {parse(); return _args_raw;}
const PIStringList & mandatoryArguments() {parse(); return _args_mand;} const PIStringList & mandatoryArguments() {parse(); return _args_mand;}
const PIStringList & optionalArguments() {parse(); return _args_opt;} const PIStringList & optionalArguments() {parse(); return _args_opt;}
//! Returns program execute command without arguments //! \~english Returns program execute command without arguments
//! \~russian Возвращает команду вызова программы без аргументов
PIString programCommand() {parse(); return _args_raw.size() > 0 ? _args_raw.front() : PIString();} PIString programCommand() {parse(); return _args_raw.size() > 0 ? _args_raw.front() : PIString();}
//! \~english Returns if argument "name" found
//! \~russian Возвращает найден ли аргумент "name"
bool hasArgument(const PIString & name) {parse(); piForeach (Argument & i, _args) if (i.name == name && i.found) return true; return false;} bool hasArgument(const PIString & name) {parse(); piForeach (Argument & i, _args) if (i.name == name && i.found) return true; return false;}
//! \~english Returns argument "name" value, or empty string if this is no value
//! \~russian Возвращает значение аргумента "name" или пустую строку, если значения нет
PIString argumentValue(const PIString & name) {parse(); piForeach (Argument &i, _args) if (i.name == name && i.found) return i.value; return PIString();} PIString argumentValue(const PIString & name) {parse(); piForeach (Argument &i, _args) if (i.name == name && i.found) return i.value; return PIString();}
PIString argumentShortKey(const PIString & name) {piForeach (Argument &i, _args) if (i.name == name) return i.short_key; return PIString();} PIString argumentShortKey(const PIString & name) {piForeach (Argument &i, _args) if (i.name == name) return i.short_key; return PIString();}
PIString argumentFullKey(const PIString & name) {piForeach (Argument &i, _args) if (i.name == name) return i.full_key; return PIString();} PIString argumentFullKey(const PIString & name) {piForeach (Argument &i, _args) if (i.name == name) return i.full_key; return PIString();}

View File

@@ -20,15 +20,28 @@
#include "picollection.h" #include "picollection.h"
/** \class PICollection //! \addtogroup Core
* @brief Interface to discover element groups //! \{
* \details //! \~\class PICollection picollection.h
* \section PICollection_sec0 Synopsis //! \~\brief
* This class has only static functions so no need to create instance of the //! \~english Helper to collect and retrieve classes to groups
* %PICollection. This class provide macros to add some classes or existing //! \~russian Помощник для создания и получения классов в группы
* objects to global collection and access to them from any place of the code. //!
* \snippet picollection.cpp main //! \~\details
* */ //! \~english \section PICollection_sec0 Synopsis
//! \~russian \section PICollection_sec0 Краткий обзор
//! \~english
//! This class has only static functions so no need to create instance of the
//! %PICollection. This class provide macros to add some classes or existing
//! objects to global collection and access to them from any place of the code.
//!
//! \~russian
//! Этот класс предоставляет статические методы, поэтому не нужно создавать
//! его экземпляр. Имеется несколько макросов для добавления классов или существующих
//! объектов в глобальные группы. Затем можно получить их список в любом месте программы.
//! \~\snippet picollection.cpp main
//!
//! \}
PIStringList PICollection::groups() { PIStringList PICollection::groups() {
@@ -77,7 +90,8 @@ PIVector<PICollection::Group> & PICollection::_groups() {
PICollection::CollectionAdder::CollectionAdder(const PIString & group, const PIObject * element, const PIString & name, bool own) { PICollection::CollectionAdder::CollectionAdder(const PIString & group, const PIObject * element, const PIString & name, bool own) {
if (!element) return; if (!element) return;
const_cast<PIObject * >(element)->setName(name); if (name.isNotEmpty())
const_cast<PIObject * >(element)->setName(name);
bool added = PICollection::addToGroup(group, element); bool added = PICollection::addToGroup(group, element);
if (!added && own) if (!added && own)
delete element; delete element;

View File

@@ -1,5 +1,7 @@
/*! @file picollection.h /*! \file picollection.h
* @brief Custom elements collection * \~\brief
* \~english Custom elements collection
* \~russian
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -27,32 +29,70 @@
#ifdef DOXYGEN #ifdef DOXYGEN
/** @brief Add existing element "object" in group with name "group" //! \~\relatesalso PICollection
* \relatesalso PICollection //! \~\brief
* \details If there is no group with name "group" it will be created. //! \~english Add existing element "object" in group with name "group"
* Only one element of the class "object" can be in group "group". If //! \~russian Добавляет существующий элемент "object" в группу с именем "group"
* this is already exists nothing be happens. \n "object" should to //! \~\details
* be pointer to object based on PIObject. */ //! \~english
//! If this is no group with name "group" it will be created.
//! Only one element of the class "object" can be in group. If
//! this is already exists nothing be happens. \n "object" should to
//! be pointer to object based on \a PIObject.
//! \~russian
//! Если такой группы нет, она создается. В каждой группе может присутствовать
//! только один элемент класса объекта "object". Если такой элемент уже есть,
//! то ничего не изменится. \n "object" должен быть наследником \a PIObject.
# define ADD_TO_COLLECTION(group, object) # define ADD_TO_COLLECTION(group, object)
/** @brief Add new element of class "class" in group with name "group" //! \~\relatesalso PICollection
* \relatesalso PICollection //! \~\brief
* \details If there is no group with name "group" it will be created. //! \~english Add existing element "object" in group with name "group" and set its name to "name"
* Only one element of the class "class" can be in group "group". If //! \~russian Добавляет существующий элемент "object" в группу с именем "group" и присваивает объекту имя "name"
* this is already exists nothing be happens. \n "class" should to //! \~\details
* be name of the any class based on PIObject. */ //! \~english
//! Similar to \a ADD_TO_COLLECTION(group, object) but set object name to "name"
//! \~russian
//! Аналогично \a ADD_TO_COLLECTION(group, object), но присваивает имя объекту "name"
# define ADD_TO_COLLECTION_WITH_NAME(group, object, name)
//! \~\relatesalso PICollection
//! \~\brief
//! \~english Add new element of class "class" in group with name "group"
//! \~russian Добавляет новый элемент класса "class" в группу с именем "group"
//! \~\details
//! \~english
//! If this is no group with name "group" it will be created.
//! Only one element of the class "class" can be in group. If
//! this is already exists nothing be happens. \n "class" should to
//! be name of the any class based on PIObject.
//! \~russian
//! Если такой группы нет, она создается. В каждой группе может присутствовать
//! только один элемент класса "class". Если такой элемент уже есть,
//! то ничего не изменится. \n "class" должен быть любым классом, наследным от \a PIObject.
# define ADD_NEW_TO_COLLECTION(group, class) # define ADD_NEW_TO_COLLECTION(group, class)
//! \~\relatesalso PICollection
//! \~\brief
//! \~english Add new element of class "class" in group with name "group" and set its name to "name"
//! \~russian Добавляет новый элемент класса "class" в группу с именем "group" и присваивает объекту имя "name"
//! \~\details
//! \~english
//! Similar to \a ADD_NEW_TO_COLLECTION(group, class) but set object name to "name"
//! \~russian
//! Аналогично \a ADD_NEW_TO_COLLECTION(group, class), но присваивает имя объекту "name"
# define ADD_NEW_TO_COLLECTION_WITH_NAME(group, class, name)
#else #else
# define ADD_TO_COLLECTION(group, object) \ # define ADD_TO_COLLECTION(group, object) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, object, false); static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, object, "", false);
# define ADD_TO_COLLECTION_WITH_NAME(group, object, name) \ # define ADD_TO_COLLECTION_WITH_NAME(group, object, name) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, object, #name, false); static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, object, #name, false);
# define ADD_NEW_TO_COLLECTION(group, class) \ # define ADD_NEW_TO_COLLECTION(group, class) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, new class(), true); static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, new class(), "", true);
# define ADD_NEW_TO_COLLECTION_WITH_NAME(group, class, name) \ # define ADD_NEW_TO_COLLECTION_WITH_NAME(group, class, name) \
static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, new class(), #name, true); static PICollection::CollectionAdder _PIP_ADD_COUNTER(_collection_adder_)(#group, new class(), #name, true);
@@ -65,10 +105,12 @@ class PIP_EXPORT PICollection
public: public:
PICollection() {;} PICollection() {;}
//! @brief Returns all existing groups by their names //! \~english Returns all existing groups by their names
//! \~russian Возвращает имена всех групп
static PIStringList groups(); static PIStringList groups();
//! @brief Returns all elements of group "group" //! \~english Returns all elements of group "group"
//! \~russian Возвращает все элементы группы "group"
static PIVector<const PIObject * > groupElements(const PIString & group); static PIVector<const PIObject * > groupElements(const PIString & group);
static bool addToGroup(const PIString & group, const PIObject * element); static bool addToGroup(const PIString & group, const PIObject * element);

View File

@@ -16,6 +16,31 @@
You should have received a copy of the GNU Lesser General Public License You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** \defgroup Core
* \~\brief
* \~english This module contains basic functionality.
* \~russian Модуль обеспечивает базовую функциональность.
*
* \~\details
* Scope | Use
* ----- | -------
* C++ | #include <picoremodule.h>
* CMake | PIP
*
* \~english
* These files provides platform abstraction, useful macros, methods and classes
*
* \~russian
* Эти файлы обеспечивают абстракцию операционной системы, полезные макросы, методы и классы
*
* \~\authors
* \~english
* Ivan Pelipenko peri4ko@yandex.ru;
* Andrey Bychkov work.a.b@yandex.ru;
* \~russian
* Иван Пелипенко peri4ko@yandex.ru;
* Андрей Бычков work.a.b@yandex.ru;
*/
#ifndef PICOREMODULE_H #ifndef PICOREMODULE_H
#define PICOREMODULE_H #define PICOREMODULE_H

View File

@@ -30,6 +30,82 @@
#endif #endif
//! \addtogroup Core
//! \{
//! \~\class PICout picout.h
//! \~\brief
//! \~english Universal output to console class
//! \~russian Универсальный вывод в консоль
//!
//! \~english \section PICout_sec0 Synopsis
//! \~russian \section PICout_sec0 Краткий обзор
//! \~english
//! This class provide many stream operators for output with some features.
//! Output to %PICout is thread-sequential, i.e. doesn`t mixed from parallel
//! threads.
//!
//! \~russian
//! Данный класс предоставляет множество операторов для вывода в консоль.
//! Вывод в %PICout потоково-последовательный, т.е. не смешивается из параллельных
//! потоков.
//!
//! \~english \section PICout_sec1 Features
//! \~russian \section PICout_sec1 Особенности
//! \~english
//! * support text formatting (color, style)
//! * insertion spaces between entries
//! * insertion new line at the end of output
//! * strings are quoted
//! * custom output operator can be easily written
//! * can outpur to console, internal buffer or both
//!
//! \~russian
//! * поддержка форматирования (цвет, стиль)
//! * вставка пробелов между выводами
//! * вставка новой строки после последнего вывода
//! * строки обрамляются кавычками
//! * легко создавать сови операторы вывода
//! * может выводить в консоль, внутренний буфер или в оба места
//!
//! \~english \section PICout_ex0 Usage
//! \~russian \section PICout_ex0 Использование
//! \~\snippet picout.cpp 0
//!
//! \~english \section PICout_ex1 Writing your own output operator
//! \~russian \section PICout_ex1 Создание своего оператора вывода
//! \~\snippet picout.cpp own
//!
//! \}
//! \addtogroup Core
//! \{
//! \~\class PICout::Notifier picout.h
//! \~\brief
//! \~english Class for emit notifications of PICout
//! \~russian Класс для посылки событий от PICout
//!
//! \~english \section PICout_sec0 Synopsis
//! \~russian \section PICout_sec0 Краткий обзор
//! \~english
//! This class used as PICout events emitter. When
//! PICout constructs with external PIString* buffer
//! and some ID, last copy of this PICout on delete
//! emit event "finished()" on object Notifier::object().
//! Sample:
//!
//! \~russian
//! Этот класс используется как источник событий PICout.
//! Когда PICout сконструирован с внешним буфером PIString*
//! и каким-то ID, последняя копия этого PICout при уничтожении
//! посылает событие "finished()" у объекта Notifier::object().
//! Пример:
//!
//! \~\snippet picout.cpp notifier
//!
//! \}
class NotifierObject: public PIObject { class NotifierObject: public PIObject {
PIOBJECT(NotifierObject) PIOBJECT(NotifierObject)
public: public:
@@ -204,22 +280,65 @@ PICout PICout::operator <<(const PICoutAction v) {
} }
PICout PICout::operator <<(const PICoutManipulators::PICoutFormat v) {
switch (v) {
case PICoutManipulators::Bin: cnb_ = 2; break;
case PICoutManipulators::Oct: cnb_ = 8; break;
case PICoutManipulators::Dec: cnb_ = 10; break;
case PICoutManipulators::Hex: cnb_ = 16; break;
default: applyFormat(v);
};
return *this;
}
PICout PICout::operator <<(const PIFlags<PICoutManipulators::PICoutFormat> & v) {
if (v[PICoutManipulators::Bin]) cnb_ = 2;
if (v[PICoutManipulators::Oct]) cnb_ = 8;
if (v[PICoutManipulators::Dec]) cnb_ = 10;
if (v[PICoutManipulators::Hex]) cnb_ = 16;
if (v[PICoutManipulators::Bold]) applyFormat(PICoutManipulators::Bold);
if (v[PICoutManipulators::Faint]) applyFormat(PICoutManipulators::Faint);
if (v[PICoutManipulators::Italic]) applyFormat(PICoutManipulators::Italic);
if (v[PICoutManipulators::Underline]) applyFormat(PICoutManipulators::Underline);
if (v[PICoutManipulators::Blink]) applyFormat(PICoutManipulators::Blink);
if (v[PICoutManipulators::Black]) applyFormat(PICoutManipulators::Black);
if (v[PICoutManipulators::Red]) applyFormat(PICoutManipulators::Red);
if (v[PICoutManipulators::Green]) applyFormat(PICoutManipulators::Green);
if (v[PICoutManipulators::Blue]) applyFormat(PICoutManipulators::Blue);
if (v[PICoutManipulators::Yellow]) applyFormat(PICoutManipulators::Yellow);
if (v[PICoutManipulators::Magenta]) applyFormat(PICoutManipulators::Magenta);
if (v[PICoutManipulators::Cyan]) applyFormat(PICoutManipulators::Cyan);
if (v[PICoutManipulators::White]) applyFormat(PICoutManipulators::White);
if (v[PICoutManipulators::BackBlack]) applyFormat(PICoutManipulators::BackBlack);
if (v[PICoutManipulators::BackRed]) applyFormat(PICoutManipulators::BackRed);
if (v[PICoutManipulators::BackGreen]) applyFormat(PICoutManipulators::BackGreen);
if (v[PICoutManipulators::BackBlue]) applyFormat(PICoutManipulators::BackBlue);
if (v[PICoutManipulators::BackYellow]) applyFormat(PICoutManipulators::BackYellow);
if (v[PICoutManipulators::BackMagenta]) applyFormat(PICoutManipulators::BackMagenta);
if (v[PICoutManipulators::BackCyan]) applyFormat(PICoutManipulators::BackCyan);
if (v[PICoutManipulators::BackWhite]) applyFormat(PICoutManipulators::BackWhite);
if (v[PICoutManipulators::Default]) applyFormat(PICoutManipulators::Default);
return *this;
}
#define PICOUTTOTARGET(v) { \ #define PICOUTTOTARGET(v) { \
if (buffer_) {\ if (buffer_) {\
(*buffer_) << (v);\ (*buffer_) << (v);\
} else {\ } else {\
if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v);\ if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v);\
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v);\ if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v);\
}\ }\
} }
#define PICOUTTOTARGETS(v) { \ #define PICOUTTOTARGETS(v) { \
if (buffer_) {\ if (buffer_) {\
(*buffer_) << (v);\ (*buffer_) << (v);\
} else {\ } else {\
if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v).dataConsole();\ if (PICout::isOutputDeviceActive(PICout::StdOut)) std::cout << (v).dataConsole();\
if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v);\ if (PICout::isOutputDeviceActive(PICout::Buffer)) PICout::__string__() << (v);\
}\ }\
} }
#define PINUMERICCOUT if (cnb_ == 10) PICOUTTOTARGET(v) else PICOUTTOTARGETS(PIString::fromNumber(v, cnb_)) #define PINUMERICCOUT if (cnb_ == 10) PICOUTTOTARGET(v) else PICOUTTOTARGETS(PIString::fromNumber(v, cnb_))
@@ -273,10 +392,10 @@ PICout PICout::operator <<(const PICoutSpecialChar v) {
switch (v) { switch (v) {
case Null: case Null:
if (buffer_) { if (buffer_) {
(*buffer_) << PIChar(0); (*buffer_) << PIChar();
} else { } else {
if (isOutputDeviceActive(StdOut)) std::cout << char(0); if (isOutputDeviceActive(StdOut)) std::cout << char(0);
if (isOutputDeviceActive(Buffer)) PICout::__string__() << PIChar(0); if (isOutputDeviceActive(Buffer)) PICout::__string__() << PIChar();
} }
break; break;
case NewLine: case NewLine:
@@ -346,6 +465,12 @@ PICout & PICout::restoreControl() {
#undef PICOUTTOTARGET #undef PICOUTTOTARGET
#undef PINUMERICCOUT #undef PINUMERICCOUT
//! \details
//! \~english
//! If it is not a first output and control \a AddSpaces is set space character is put
//! \~russian
//! Добавляет пробел если это не первый вывод и установлен флаг \a AddSpaces
//! \~\sa \a quote(), \a newLine()
PICout & PICout::space() { PICout & PICout::space() {
if (!act_) return *this; if (!act_) return *this;
if (!fo_ && co_[AddSpaces]) { if (!fo_ && co_[AddSpaces]) {
@@ -360,6 +485,12 @@ PICout & PICout::space() {
return *this; return *this;
} }
//! \details
//! \~english
//! If control \a AddQuotes is set quote character is put
//! \~russian
//! Добавляет кавычки если установлен флаг \a AddQuotes
//! \~\sa \a space(), \a newLine()
PICout & PICout::quote() { PICout & PICout::quote() {
if (!act_) return *this; if (!act_) return *this;
if (co_[AddQuotes]) { if (co_[AddQuotes]) {
@@ -374,6 +505,12 @@ PICout & PICout::quote() {
return *this; return *this;
} }
//! \details
//! \~english
//! If control \a AddNewLine is set new line character is put
//! \~russian
//! Добавляет новую строку если установлен флаг \a AddNewLine
//! \~\sa \a space(), \a quote()
PICout & PICout::newLine() { PICout & PICout::newLine() {
if (!act_) return *this; if (!act_) return *this;
if (co_[AddNewLine]) { if (co_[AddNewLine]) {

View File

@@ -1,5 +1,7 @@
/*! @file picout.h /*! \file picout.h
* @brief Universal output to console class * \~\brief
* \~english Universal output to console class
* \~russian Универсальный вывод в консоль
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -27,10 +29,13 @@
#ifdef DOXYGEN #ifdef DOXYGEN
//! @brief Macro used for conditional (piDebug) output to PICout //! \~english Macro used for conditional (piDebug) output to PICout
//! \~russian Макрос для условного (piDebug) вывода в PICout
# define piCout # define piCout
//! \relatesalso PIObject @brief Macro used for conditional (piDebug and PIObject::debug()) output to PICout for subclasses of PIObject //! \relatesalso PIObject
//! \~english Macro used for conditional (piDebug && PIObject::debug()) output to PICout for subclasses of PIObject
//! \~russian Макрос для условного (piDebug && PIObject::debug()) вывода в PICout для наследников PIObject
# define piCoutObj # define piCoutObj
#else #else
@@ -42,106 +47,97 @@
class PIObject; class PIObject;
//! @brief Namespace contains enums controlled PICout //! \relatesalso PICout
//! \~english Namespace contains enums that controls PICout
//! \~russian Пространство имен содержит перечисления для контроля PICout
namespace PICoutManipulators { namespace PICoutManipulators {
//! @brief Enum contains special characters //! \~english Enum contains special characters
//! \~russian Перечисление со спецсимволами
enum PICoutSpecialChar { enum PICoutSpecialChar {
Null /*! Null-character, '\\0' */, Null /*! \~english Null-character, '\\0' \~russian Нулевой символ, '\\0' */,
NewLine /*! New line character, '\\n' */, NewLine /*! \~english New line character, '\\n' \~russian Новая строка, '\\n' */,
Tab /*! Tab character, '\\t' */, Tab /*! \~english Tab character, '\\t' \~russian Табуляция, '\\t' */,
Esc /*! Escape character, '\\e' */, Esc /*! \~english Escape character, '\\e' \~russian Esc-символ, '\\e' */,
Quote /*! Quote character, '"' */ Quote /*! \~english Quote character, '"' \~russian Кавычки, '"' */
}; };
//! @brief Enum contains immediate action //! \~english Enum contains immediate action
//! \~russian Перечисление с немедленными действиями
enum PICoutAction { enum PICoutAction {
Flush /*! Flush the output */, Flush /*! \~english Flush the output \~russian Обновить вывод */,
Backspace /*! Remove last symbol */, Backspace /*! \~english Remove last symbol \~russian Удалить последний символ */,
ShowCursor /*! Show cursor */, ShowCursor /*! \~english Show cursor \~russian Показать курсор */,
HideCursor /*! Hide cursor */, HideCursor /*! \~english Hide cursor \~russian Скрыть курсор */,
ClearLine /*! Clear current line */, ClearLine /*! \~english Clear current line \~russian Очистить текущую строку */,
ClearScreen /*! Clear the screen */, ClearScreen /*! \~english Clear the screen \~russian Очистить экран */,
SaveContol /*! Save control flags, equivalent to \a saveControl() */, SaveContol /*! \~english Save control flags, equivalent to \a saveControl() \~russian Сохранить флаги, аналогично \a saveControl() */,
RestoreControl /*! Restore control flags, equivalent to \a restoreControl() */ RestoreControl /*! \~english Restore control flags, equivalent to \a restoreControl() \~russian Восстановить флаги, аналогично \a restoreControl() */
}; };
//! @brief Enum contains control of PICout //! \~english Enum contains control of PICout
//! \~russian Перечисление с управлением PICout
enum PICoutControl { enum PICoutControl {
AddNone /*! No controls */ = 0x0, AddNone /*! \~english No controls \~russian Без управления */ = 0x0,
AddSpaces /*! Spaces will be appear after each output */ = 0x1, AddSpaces /*! \~english Spaces will be appear after each output \~russian Пробел после каждого вывода */ = 0x1,
AddNewLine /*! New line will be appear after all output */ = 0x2, AddNewLine /*! \~english New line will be appear after all output \~russian Новая строка после завершения вывода */ = 0x2,
AddQuotes /*! Each string will be quoted */ = 0x4, AddQuotes /*! \~english Each string will be quoted \~russian Каждая строка в кавычках */ = 0x4,
DefaultControls /*! Default controls */ = AddSpaces | AddNewLine, DefaultControls /*! \~english Default controls \~russian Управление по умолчанию */ = AddSpaces | AddNewLine,
AddAll /*! All controls */ = 0xFF, AddAll /*! \~english All controls \~russian Всё управление */ = 0xFF,
NoLock /*! Don`t use mutex for output */ = 0x100, NoLock /*! \~english Don`t use mutex for output \~russian Не использовать мьютекс при выводе */ = 0x100,
}; };
//! @brief Enum contains output format //! \~english Enum contains output format
//! \~russian Перечисление с форматом вывода
enum PICoutFormat { enum PICoutFormat {
Bin /*! Binary representation of integers */ = 0x01, Bin /*! \~english Binary representation of integers \~russian Двоичное представление для целых чисел */ = 0x01,
Oct /*! Octal representation of integers */ = 0x02, Oct /*! \~english Octal representation of integers \~russian Восьмеричное представление для целых чисел */ = 0x02,
Dec /*! Decimal representation of integers */ = 0x04, Dec /*! \~english Decimal representation of integers \~russian Десятичное представление для целых чисел */ = 0x04,
Hex /*! Hexadecimal representation of integers */ = 0x08, Hex /*! \~english Hexadecimal representation of integers \~russian Шестнадцатеричное представление для целых чисел */ = 0x08,
Bold /*! Bold */ = 0x10, Bold /*! \~english Bold \~russian Жирный */ = 0x10,
Faint /*! */ = 0x20, Faint /*! \~english \~russian */ = 0x20,
Italic /*! */ = 0x40, Italic /*! \~english \~russian */ = 0x40,
Underline /*! Underline */ = 0x80, Underline /*! \~english Underline \~russian Подчеркнутый */ = 0x80,
Blink /*! Blink */ = 0x100, Blink /*! \~english Blink \~russian Мигающий */ = 0x100,
Black /*! Black font */ = 0x400, Black /*! \~english Black font \~russian Чёрный */ = 0x400,
Red /*! Red font */ = 0x800, Red /*! \~english Red font \~russian Красный */ = 0x800,
Green /*! Green font */ = 0x1000, Green /*! \~english Green font \~russian Зелёный */ = 0x1000,
Blue /*! Blue font */ = 0x2000, Blue /*! \~english Blue font \~russian Синий */ = 0x2000,
Yellow /*! Yellow font */ = 0x4000, Yellow /*! \~english Yellow font \~russian Жёлтый */ = 0x4000,
Magenta /*! Magenta font */ = 0x8000, Magenta /*! \~english Magenta font \~russian Пурпурный */ = 0x8000,
Cyan /*! Cyan font */ = 0x10000, Cyan /*! \~english Cyan font \~russian Голубой */ = 0x10000,
White /*! White font */ = 0x20000, White /*! \~english White font \~russian Белый */ = 0x20000,
BackBlack /*! Black background */ = 0x40000, BackBlack /*! \~english Black background \~russian Чёрный фон */ = 0x40000,
BackRed /*! Red background */ = 0x80000, BackRed /*! \~english Red background \~russian Красный фон */ = 0x80000,
BackGreen /*! Green background */ = 0x100000, BackGreen /*! \~english Green background \~russian Зелёный фон */ = 0x100000,
BackBlue /*! Blue background */ = 0x200000, BackBlue /*! \~english Blue background \~russian Синий фон */ = 0x200000,
BackYellow /*! Yellow background */ = 0x400000, BackYellow /*! \~english Yellow background \~russian Жёлтый фон */ = 0x400000,
BackMagenta /*! Magenta background */ = 0x800000, BackMagenta /*! \~english Magenta background \~russian Пурпурный фон */ = 0x800000,
BackCyan /*! Cyan background */ = 0x1000000, BackCyan /*! \~english Cyan background \~russian Голубой фон */ = 0x1000000,
BackWhite /*! White background */ = 0x2000000, BackWhite /*! \~english White background \~russian Белый фон */ = 0x2000000,
Default /*! Default format */ = 0x4000000 Default /*! \~english Default format \~russian Формат по умолчанию */ = 0x4000000
}; };
typedef PIFlags<PICoutControl> PICoutControls; typedef PIFlags<PICoutControl> PICoutControls;
} }
/*! \class PICout
* @brief Class for formatted output similar std::cout
*
* \section PICout_sec0 Synopsis
* This class provide many stream operators for output with some features.
* Output to PICout is thread-sequential, i.e. doesn`t mixed from parallel
* threads.
*
* \section PICout_sec1 Features
* - insertion spaces between entries
* - insertion new line at the end of output
* - strings are quoted
* - custom output operator can be easily written
*
* \section PICout_ex0 Usage
* \snippet picout.cpp 0
*
* \section PICout_ex1 Writing your own output operator
* \snippet picout.cpp own
*/
class PIP_EXPORT PICout { class PIP_EXPORT PICout {
public: public:
//! Default constructor with default features (AddSpaces and AddNewLine)
//! \~english Default constructor with default features (AddSpaces and AddNewLine)
//! \~russian Конструктор по умолчанию (AddSpaces и AddNewLine)
PICout(PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::DefaultControls); PICout(PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::DefaultControls);
PICout(PICoutManipulators::PICoutControl control = PICoutManipulators::DefaultControls); PICout(PICoutManipulators::PICoutControl control = PICoutManipulators::DefaultControls);
//! Construct with default features (AddSpaces and AddNewLine), but if \"active\" is false does nothing //! \~english Construct with default features (AddSpaces and AddNewLine), but if \"active\" is false does nothing
//! \~russian Конструктор по умолчанию (AddSpaces и AddNewLine), но если не \"active\" то будет неактивным
PICout(bool active); PICout(bool active);
//! Construct with external buffer and id "id". See \a Notifier for details //! \~english Construct with external buffer and ID "id". See \a Notifier for details
//! \~russian Конструктор с внешним буфером и ID "id". Подробнее \a Notifier
PICout(PIString * buffer, int id = 0, PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::AddSpaces | PICoutManipulators::AddNewLine); PICout(PIString * buffer, int id = 0, PIFlags<PICoutManipulators::PICoutControl> controls = PICoutManipulators::AddSpaces | PICoutManipulators::AddNewLine);
PICout(const PICout & other); PICout(const PICout & other);
@@ -149,171 +145,171 @@ public:
~PICout(); ~PICout();
/*! \class PICout::Notifier
* @brief Class for emit notifications of PICout
*
* \section PICout_sec0 Synopsis
* This class used as PICout events emitter. When
* PICout constructs with external PIString* buffer
* and some id, last copy of this PICout on delete
* emit event "finished()" on object Notifier::object().
* Sample:
* \snippet picout.cpp notifier
*/
class PIP_EXPORT Notifier { class PIP_EXPORT Notifier {
public: public:
//! \~english Singleton access to %PICout::Notifier
//! \~russian Синглтон класса %PICout::Notifier
static Notifier * instance(); static Notifier * instance();
//! \~english Object that emit events from %PICout
//! \~russian Объект, который посылает события от %PICout
static PIObject * object(); static PIObject * object();
private: private:
Notifier(); Notifier();
PIObject * o; PIObject * o;
}; };
//! @brief Enum contains output devices of PICout //! \~english Enum contains output devices of %PICout
//! \~russian Перечисление с устройствами вывода для %PICout
enum OutputDevice { enum OutputDevice {
NoDevices /** PICout is disabled */ = 0x0, NoDevices /** \~english %PICout is disabled \~russian %PICout неактивен */ = 0x0,
StdOut /** Standard console output */ = 0x1, StdOut /** \~english Standard console output \~russian Стандартный вывод в консоль */ = 0x1,
Buffer /** Internal buffer */ = 0x2, Buffer /** \~english Internal buffer \~russian Внутренний буфер */ = 0x2,
AllDevices /** All */ = 0xFFFF, AllDevices /** \~english All \~russian Все */ = 0xFFFF,
}; };
typedef PIFlags<OutputDevice> OutputDevices; typedef PIFlags<OutputDevice> OutputDevices;
//! Output operator for strings with <tt>"const char * "</tt> type //! \~english Output operator for strings with <tt>"const char * "</tt> type
//! \~russian Оператор вывода для строк <tt>"const char * "</tt>
PICout operator <<(const char * v); PICout operator <<(const char * v);
//! Output operator for strings with <tt>"std::string"</tt> type // ! Output operator for strings with <tt>"std::string"</tt> type
//PICout operator <<(const std::string & v); //PICout operator <<(const std::string & v);
//! Output operator for boolean values //! \~english Output operator for boolean values
//! \~russian Оператор вывода для логических значений
PICout operator <<(const bool v); PICout operator <<(const bool v);
//! Output operator for <tt>"char"</tt> values //! \~english Output operator for <tt>"char"</tt> values
//! \~russian Оператор вывода для <tt>"char"</tt> значений
PICout operator <<(const char v); PICout operator <<(const char v);
//! Output operator for <tt>"unsigned char"</tt> values //! \~english Output operator for <tt>"unsigned char"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned char"</tt> значений
PICout operator <<(const uchar v); PICout operator <<(const uchar v);
//! Output operator for <tt>"short"</tt> values //! \~english Output operator for <tt>"short"</tt> values
//! \~russian Оператор вывода для <tt>"short"</tt> значений
PICout operator <<(const short v); PICout operator <<(const short v);
//! Output operator for <tt>"unsigned short"</tt> values //! \~english Output operator for <tt>"unsigned short"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned short"</tt> значений
PICout operator <<(const ushort v); PICout operator <<(const ushort v);
//! Output operator for <tt>"int"</tt> values //! \~english Output operator for <tt>"int"</tt> values
//! \~russian Оператор вывода для <tt>"int"</tt> значений
PICout operator <<(const int v); PICout operator <<(const int v);
//! Output operator for <tt>"unsigned int"</tt> values //! \~english Output operator for <tt>"unsigned int"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned int"</tt> значений
PICout operator <<(const uint v); PICout operator <<(const uint v);
//! Output operator for <tt>"long"</tt> values //! \~english Output operator for <tt>"long"</tt> values
//! \~russian Оператор вывода для <tt>"long"</tt> значений
PICout operator <<(const long v); PICout operator <<(const long v);
//! Output operator for <tt>"unsigned long"</tt> values //! \~english Output operator for <tt>"unsigned long"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned long"</tt> значений
PICout operator <<(const ulong v); PICout operator <<(const ulong v);
//! Output operator for <tt>"long long"</tt> values //! \~english Output operator for <tt>"long long"</tt> values
//! \~russian Оператор вывода для <tt>"long long"</tt> значений
PICout operator <<(const llong v); PICout operator <<(const llong v);
//! Output operator for <tt>"unsigned long long"</tt> values //! \~english Output operator for <tt>"unsigned long long"</tt> values
//! \~russian Оператор вывода для <tt>"unsigned long long"</tt> значений
PICout operator <<(const ullong v); PICout operator <<(const ullong v);
//! Output operator for <tt>"float"</tt> values //! \~english Output operator for <tt>"float"</tt> values
//! \~russian Оператор вывода для <tt>"float"</tt> значений
PICout operator <<(const float v); PICout operator <<(const float v);
//! Output operator for <tt>"double"</tt> values //! \~english Output operator for <tt>"double"</tt> values
//! \~russian Оператор вывода для <tt>"double"</tt> значений
PICout operator <<(const double v); PICout operator <<(const double v);
//! Output operator for pointers //! \~english Output operator for pointers
//! \~russian Оператор вывода для указателей
PICout operator <<(const void * v); PICout operator <<(const void * v);
//! Output operator for PIObject and ancestors //! \~english Output operator for PIObject and ancestors
//! \~russian Оператор вывода для PIObject и наследников
PICout operator <<(const PIObject * v); PICout operator <<(const PIObject * v);
//! Output operator for \a PICoutSpecialChar values //! \~english Output operator for \a PICoutSpecialChar values
//! \~russian Оператор вывода для \a PICoutSpecialChar
PICout operator <<(const PICoutManipulators::PICoutSpecialChar v); PICout operator <<(const PICoutManipulators::PICoutSpecialChar v);
//! Output operator for \a PIFlags<PICoutFormat> values //! \~english Output operator for \a PIFlags<PICoutFormat> values
PICout operator <<(const PIFlags<PICoutManipulators::PICoutFormat> & v) { //! \~russian Оператор вывода для \a PIFlags<PICoutFormat>
if (v[PICoutManipulators::Bin]) cnb_ = 2; PICout operator <<(const PIFlags<PICoutManipulators::PICoutFormat> & v);
if (v[PICoutManipulators::Oct]) cnb_ = 8;
if (v[PICoutManipulators::Dec]) cnb_ = 10;
if (v[PICoutManipulators::Hex]) cnb_ = 16;
if (v[PICoutManipulators::Bold]) applyFormat(PICoutManipulators::Bold);
if (v[PICoutManipulators::Faint]) applyFormat(PICoutManipulators::Faint);
if (v[PICoutManipulators::Italic]) applyFormat(PICoutManipulators::Italic);
if (v[PICoutManipulators::Underline]) applyFormat(PICoutManipulators::Underline);
if (v[PICoutManipulators::Blink]) applyFormat(PICoutManipulators::Blink);
if (v[PICoutManipulators::Black]) applyFormat(PICoutManipulators::Black);
if (v[PICoutManipulators::Red]) applyFormat(PICoutManipulators::Red);
if (v[PICoutManipulators::Green]) applyFormat(PICoutManipulators::Green);
if (v[PICoutManipulators::Blue]) applyFormat(PICoutManipulators::Blue);
if (v[PICoutManipulators::Yellow]) applyFormat(PICoutManipulators::Yellow);
if (v[PICoutManipulators::Magenta]) applyFormat(PICoutManipulators::Magenta);
if (v[PICoutManipulators::Cyan]) applyFormat(PICoutManipulators::Cyan);
if (v[PICoutManipulators::White]) applyFormat(PICoutManipulators::White);
if (v[PICoutManipulators::BackBlack]) applyFormat(PICoutManipulators::BackBlack);
if (v[PICoutManipulators::BackRed]) applyFormat(PICoutManipulators::BackRed);
if (v[PICoutManipulators::BackGreen]) applyFormat(PICoutManipulators::BackGreen);
if (v[PICoutManipulators::BackBlue]) applyFormat(PICoutManipulators::BackBlue);
if (v[PICoutManipulators::BackYellow]) applyFormat(PICoutManipulators::BackYellow);
if (v[PICoutManipulators::BackMagenta]) applyFormat(PICoutManipulators::BackMagenta);
if (v[PICoutManipulators::BackCyan]) applyFormat(PICoutManipulators::BackCyan);
if (v[PICoutManipulators::BackWhite]) applyFormat(PICoutManipulators::BackWhite);
if (v[PICoutManipulators::Default]) applyFormat(PICoutManipulators::Default);
return *this;
}
//! Output operator for \a PICoutFormat values //! \~english Output operator for \a PICoutFormat values
PICout operator <<(const PICoutManipulators::PICoutFormat v) { //! \~russian Оператор вывода для \a PICoutFormat
switch (v) { PICout operator <<(const PICoutManipulators::PICoutFormat v);
case PICoutManipulators::Bin: cnb_ = 2; break;
case PICoutManipulators::Oct: cnb_ = 8; break;
case PICoutManipulators::Dec: cnb_ = 10; break;
case PICoutManipulators::Hex: cnb_ = 16; break;
default: applyFormat(v);
};
return *this;
}
//! Do some action //! \~english Do some action
//! \~russian Делает действие
PICout operator <<(const PICoutManipulators::PICoutAction v); PICout operator <<(const PICoutManipulators::PICoutAction v);
//! Set control flag "c" is "on" state //! \~english Set control flag "c" is "on" state
//! \~russian Установить флаг "c" в "on" состояние
PICout & setControl(PICoutManipulators::PICoutControl c, bool on = true) {co_.setFlag(c, on); return *this;} PICout & setControl(PICoutManipulators::PICoutControl c, bool on = true) {co_.setFlag(c, on); return *this;}
//! Set control flags "c" and if "save" exec \a saveControl() //! \~english Set control flags "c" and if "save" exec \a saveControl()
//! \~russian Установить флаг "c" и если "save" то выполнить \a saveControl()
PICout & setControl(PICoutManipulators::PICoutControls c, bool save = false) {if (save) saveControl(); co_ = c; return *this;} PICout & setControl(PICoutManipulators::PICoutControls c, bool save = false) {if (save) saveControl(); co_ = c; return *this;}
//! Save control flags to internal stack \sa \a restoreControl() //! \~english Save control flags to internal stack
//! \~russian Сохраняет состояние флагов во внутренний стек
//! \~\sa \a restoreControl()
PICout & saveControl(); PICout & saveControl();
//! Restore control flags from internal stack \sa \a saveControl() //! \~english Restore control flags from internal stack
//! \~russian Восстанавливает состояние флагов из внутреннего стека
//! \~\sa \a saveControl()
PICout & restoreControl(); PICout & restoreControl();
/*! @brief Conditional put space character to output //! \~english Conditional put space character to output
* \details If it is not a first output and control \a AddSpaces is set //! \~russian Условно добавляет пробел
* space character is put \sa \a quote(), \a newLine() */
PICout & space(); PICout & space();
/*! @brief Conditional put quote character to output //! \~english Conditional put quote character to output
* \details If control \a AddQuotes is set //! \~russian Условно добавляет кавычки
* quote character is put \sa \a space(), \a newLine() */
PICout & quote(); PICout & quote();
/*! @brief Conditional put new line character to output //! \~english Conditional put new line character to output
* \details If control \a AddNewLine is set //! \~russian Условно добавляет новую строку
* new line character is put \sa \a space(), \a quote() */
PICout & newLine(); PICout & newLine();
//! \~english Set output device to \a PICout::Buffer and if "clear" clear it
//! \~russian Устанавливает устройство вывода на \a PICout::Buffer и если "clear" то очищает его
static bool setBufferActive(bool on, bool clear = false); static bool setBufferActive(bool on, bool clear = false);
//! \~english Equivalent to \a isOutputDeviceActive(OutputDevice)
//! \~russian Аналог \a isOutputDeviceActive(OutputDevice)
static bool isBufferActive(); static bool isBufferActive();
//! \~english Returns internal PIString buffer and if "clear" clear it
//! \~russian Возвращает внутренний PIString буфер и если "clear" то очищает его
static PIString buffer(bool clear = false); static PIString buffer(bool clear = false);
//! \~english Clear internal PIString buffer
//! \~russian Очищает внутренний PIString буфер
static void clearBuffer(); static void clearBuffer();
//! \~english Set output to device "d" enabled "on". Returns if it was enabled
//! \~russian Устройство вывода "d" устанавливается в "on". Возвращает было ли устройство активно
static bool setOutputDevice(OutputDevice d, bool on = true); static bool setOutputDevice(OutputDevice d, bool on = true);
//! \~english Set output to devices to "d"
//! \~russian Устанавливает устройства вывода "d"
static void setOutputDevices(OutputDevices d); static void setOutputDevices(OutputDevices d);
//! \~english Returns if output device "d" is active
//! \~russian Возвращает активно ли устройство вывода "d"
static bool isOutputDeviceActive(OutputDevice d); static bool isOutputDeviceActive(OutputDevice d);
static PIMutex & __mutex__(); static PIMutex & __mutex__();

View File

@@ -1,5 +1,7 @@
/*! @file piflags.h /*! \file piflags.h
* @brief General flags class * \~\brief
* \~english General flags class
* \~russian Универсальные флаги
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -25,109 +27,220 @@
#include "pip_export.h" #include "pip_export.h"
/*! @brief This class used as container for bit flags //! \addtogroup Core
* \details PIFlags is wrapper around \c "int". There are many //! \{
* bit-wise operators, native conversion to int and function //! \~\class PIFlags piflags.h
* to test flag. \n Example: //! \~\brief
* \snippet piincludes.cpp flags //! \~english Container for bit flags
*/ //! \~russian Контейнер для битовых полей (флагов)
//!
//! \~\details
//! \~english
//! %PIFlags is wrapper around \c "int". One can use it as native \c "int".
//! There are manybit-wise operators,
//! native conversion to "int" and function
//! to test flag. \n Example:
//!
//! \~russian
//! %PIFlags по сути обертка вокруг \c "int". Можно использовать его как обычный \c "int".
//! Имеет много битовых операторов,
//! неявное преобразование в "int" и методы для проверки
//! флагов. \n Пример:
//!
//! \~\snippet piincludes.cpp flags
//!
//! \}
template<typename Enum> template<typename Enum>
class PIFlags { class PIFlags {
public: public:
//! Constructor with flags = 0
//! \~english Constructor with flags = 0
//! \~russian Создает нулевые флаги
PIFlags(): flags(0) {;} PIFlags(): flags(0) {;}
//! Constructor with flags = Enum "e"
//! \~english Constructor with flags = Enum "e"
//! \~russian Создает флаги со значением = Enum "e"
PIFlags(Enum e): flags(e) {;} PIFlags(Enum e): flags(e) {;}
//! Constructor with flags = int "i"
//! \~english Constructor with flags = int "i"
//! \~russian Создает флаги со значением = int "i"
PIFlags(const int i): flags(i) {;} PIFlags(const int i): flags(i) {;}
//! Set flags "f" to value "on"
//! \~english Set flags on positions "f" to value "on"
//! \~russian Устанавливает флаги по позициям "f" в "on"
PIFlags & setFlag(const PIFlags & f, bool on = true) {if (on) flags |= f.flags; else flags &= ~f.flags; return *this;} PIFlags & setFlag(const PIFlags & f, bool on = true) {if (on) flags |= f.flags; else flags &= ~f.flags; return *this;}
//! Set flag "e" to value "on"
//! \~english Set flag "e" to value "on"
//! \~russian Устанавливает флаг "e" в "on"
PIFlags & setFlag(const Enum & e, bool on = true) {if (on) flags |= e; else flags &= ~e; return *this;} PIFlags & setFlag(const Enum & e, bool on = true) {if (on) flags |= e; else flags &= ~e; return *this;}
//! Set flag "i" to value "on"
//! \~english Set flag "i" to value "on"
//! \~russian Устанавливает флаг "i" в "on"
PIFlags & setFlag(const int & i, bool on = true) {if (on) flags |= i; else flags &= ~i; return *this;} PIFlags & setFlag(const int & i, bool on = true) {if (on) flags |= i; else flags &= ~i; return *this;}
//! copy operator
//! \~english Assign operator
//! \~russian Оператор присваивания
void operator =(const Enum & e) {flags = e;} void operator =(const Enum & e) {flags = e;}
//! copy operator
//! \~english Assign operator
//! \~russian Оператор присваивания
void operator =(const int & i) {flags = i;} void operator =(const int & i) {flags = i;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator ==(const PIFlags & f) {return flags == f.flags;} bool operator ==(const PIFlags & f) {return flags == f.flags;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator ==(const Enum & e) {return flags == e;} bool operator ==(const Enum & e) {return flags == e;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator ==(const int i) {return flags == i;} bool operator ==(const int i) {return flags == i;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator !=(const PIFlags & f) {return flags != f.flags;} bool operator !=(const PIFlags & f) {return flags != f.flags;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator !=(const Enum & e) {return flags != e;} bool operator !=(const Enum & e) {return flags != e;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator !=(const int i) {return flags != i;} bool operator !=(const int i) {return flags != i;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >(const PIFlags & f) {return flags > f.flags;} bool operator >(const PIFlags & f) {return flags > f.flags;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >(const Enum & e) {return flags > e;} bool operator >(const Enum & e) {return flags > e;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >(const int i) {return flags > i;} bool operator >(const int i) {return flags > i;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <(const PIFlags & f) {return flags < f.flags;} bool operator <(const PIFlags & f) {return flags < f.flags;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <(const Enum & e) {return flags < e;} bool operator <(const Enum & e) {return flags < e;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <(const int i) {return flags < i;} bool operator <(const int i) {return flags < i;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >=(const PIFlags & f) {return flags >= f.flags;} bool operator >=(const PIFlags & f) {return flags >= f.flags;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >=(const Enum & e) {return flags >= e;} bool operator >=(const Enum & e) {return flags >= e;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator >=(const int i) {return flags >= i;} bool operator >=(const int i) {return flags >= i;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <=(const PIFlags & f) {return flags <= f.flags;} bool operator <=(const PIFlags & f) {return flags <= f.flags;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <=(const Enum & e) {return flags <= e;} bool operator <=(const Enum & e) {return flags <= e;}
//! compare operator
//! \~english Compare operator
//! \~russian Оператор сравнения
bool operator <=(const int i) {return flags <= i;} bool operator <=(const int i) {return flags <= i;}
//! Bit-wise AND operator
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
void operator &=(const PIFlags & f) {flags &= f.flags;} void operator &=(const PIFlags & f) {flags &= f.flags;}
//! Bit-wise AND operator
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
void operator &=(const Enum & e) {flags &= e;} void operator &=(const Enum & e) {flags &= e;}
//! Bit-wise AND operator
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
void operator &=(const int i) {flags &= i;} void operator &=(const int i) {flags &= i;}
//! Bit-wise OR operator
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
void operator |=(const PIFlags & f) {flags |= f.flags;} void operator |=(const PIFlags & f) {flags |= f.flags;}
//! Bit-wise OR operator
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
void operator |=(const Enum & e) {flags |= e;} void operator |=(const Enum & e) {flags |= e;}
//! Bit-wise OR operator
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
void operator |=(const int i) {flags |= i;} void operator |=(const int i) {flags |= i;}
//! Bit-wise XOR operator
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
void operator ^=(const PIFlags & f) {flags ^= f.flags;} void operator ^=(const PIFlags & f) {flags ^= f.flags;}
//! Bit-wise XOR operator
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
void operator ^=(const Enum & e) {flags ^= e;} void operator ^=(const Enum & e) {flags ^= e;}
//! Bit-wise XOR operator
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
void operator ^=(const int i) {flags ^= i;} void operator ^=(const int i) {flags ^= i;}
//! Bit-wise AND operator
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
PIFlags operator &(PIFlags f) const {PIFlags tf(flags & f.flags); return tf;} PIFlags operator &(PIFlags f) const {PIFlags tf(flags & f.flags); return tf;}
//! Bit-wise AND operator
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
PIFlags operator &(Enum e) const {PIFlags tf(flags & e); return tf;} PIFlags operator &(Enum e) const {PIFlags tf(flags & e); return tf;}
//! Bit-wise AND operator
//! \~english Bit-wise AND operator
//! \~russian Оператор побитового И
PIFlags operator &(int i) const {PIFlags tf(flags & i); return tf;} PIFlags operator &(int i) const {PIFlags tf(flags & i); return tf;}
//! Bit-wise OR operator
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
PIFlags operator |(PIFlags f) const {PIFlags tf(flags | f.flags); return tf;} PIFlags operator |(PIFlags f) const {PIFlags tf(flags | f.flags); return tf;}
//! Bit-wise OR operator
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
PIFlags operator |(Enum e) const {PIFlags tf(flags | e); return tf;} PIFlags operator |(Enum e) const {PIFlags tf(flags | e); return tf;}
//! Bit-wise OR operator
//! \~english Bit-wise OR operator
//! \~russian Оператор побитового ИЛИ
PIFlags operator |(int i) const {PIFlags tf(flags | i); return tf;} PIFlags operator |(int i) const {PIFlags tf(flags | i); return tf;}
//! Bit-wise XOR operator
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
PIFlags operator ^(PIFlags f) const {PIFlags tf(flags ^ f.flags); return tf;} PIFlags operator ^(PIFlags f) const {PIFlags tf(flags ^ f.flags); return tf;}
//! Bit-wise XOR operator
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
PIFlags operator ^(Enum e) const {PIFlags tf(flags ^ e); return tf;} PIFlags operator ^(Enum e) const {PIFlags tf(flags ^ e); return tf;}
//! Bit-wise XOR operator
//! \~english Bit-wise XOR operator
//! \~russian Оператор побитового исключающего ИЛИ
PIFlags operator ^(int i) const {PIFlags tf(flags ^ i); return tf;} PIFlags operator ^(int i) const {PIFlags tf(flags ^ i); return tf;}
//! Test flag operator
//! \~english Test flag operator
//! \~russian Оператор проверки флага
bool operator [](Enum e) const {return (flags & e) == e;} bool operator [](Enum e) const {return (flags & e) == e;}
//! Implicity conversion to \c int
//! \~english Implicity conversion to \c int
//! \~russian Оператор неявного преобразования в \c int
operator int() const {return flags;} operator int() const {return flags;}
private: private:
int flags; int flags;
}; };
#endif // PIFLAGS_H #endif // PIFLAGS_H

View File

@@ -95,7 +95,10 @@ int randomi() {
} }
/*! \mainpage What is PIP /*! \~english \mainpage What is PIP
* \~russian \mainpage Что такое PIP
*
* \~english
* PIP - Platform-Independent Primitives - is crossplatform library for C++ developers. * PIP - Platform-Independent Primitives - is crossplatform library for C++ developers.
* It is wrap around STL and pure C++. This library can help developers write non-GUI * It is wrap around STL and pure C++. This library can help developers write non-GUI
* projects much more quickly, efficiently and customizable than on pure C++. * projects much more quickly, efficiently and customizable than on pure C++.
@@ -112,10 +115,16 @@ int randomi() {
* * executor (\a PIThreadPoolExecutor) * * executor (\a PIThreadPoolExecutor)
* * blocking dequeue (\a PIBlockingDequeue) * * blocking dequeue (\a PIBlockingDequeue)
* * timer (\a PITimer) * * timer (\a PITimer)
* * console (information output) (\a PIConsole) * * tiling console (with widgets) (\a PIScreen)
* * stand-alone * * simple text rows
* * server * * scroll bar
* * client * * list
* * button
* * buttons group
* * check box
* * progress bar
* * PICout output
* * text input
* * I/O devices * * I/O devices
* * base class (\a PIIODevice) * * base class (\a PIIODevice)
* * file (\a PIFile) * * file (\a PIFile)
@@ -134,15 +143,72 @@ int randomi() {
* * peering net node (\a PIPeer) * * peering net node (\a PIPeer)
* * process (\a PIProcess) * * process (\a PIProcess)
* * state machine (\a PIStateMachine) * * state machine (\a PIStateMachine)
* \n \n Basic using of PIP described at page \ref using_basic */ * \n \n Basic using of PIP described at page \ref using_basic
*
* \~russian
* PIP - Platform-Independent Primitives - кроссплатформенная библиотека для разработчиков на C++.
* It is wrap around STL and pure C++. This library can help developers write non-GUI
* projects much more quickly, efficiently and customizable than on pure C++.
* PIP предоставляет следующие классы:
* * общение с консолью (\a PICout)
* * контейнеры (\a PIVector, \a PIList, \a PIMap, \a PIStack)
* * байтовый массив (\a PIByteArray)
* * строка (\a PIString, \a PIStringList)
* * базовый объект (события и обработчики) (\a PIObject)
* * многопоточность
* * поток (\a PIThread)
* * исполнитель (\a PIThreadPoolExecutor)
* * блокирующая очередь (\a PIBlockingDequeue)
* * таймер (\a PITimer)
* * тайлинговая консоль (с виджетами) (\a PIScreen)
* * простой вывод строк
* * скроллбар
* * лист
* * кнопка
* * группа кнопок
* * галочка
* * прогрессбар
* * вывод PICout
* * текстовый ввод
* * устройства ввода/вывода
* * базовый класс (\a PIIODevice)
* * файл (\a PIFile)
* * последовательный порт (\a PISerial)
* * ethernet (\a PIEthernet)
* * USB (\a PIUSB)
* * packets extractor (\a PIPacketExtractor)
* * бинарный логфайл (\a PIBinaryLog)
* * сложное составное устройство (\a PIConnection)
* * поддержка библиотек времени выполнения
* * базовая функциональность (\a PILibrary)
* * плагин (\a PIPluginLoader)
* * диагностика качества связи (\a PIDiagnostics)
* * парсер аргументов командной строки (\a PICLI)
* * вычислитель (\a PIEvaluator)
* * пиринговая сеть (\a PIPeer)
* * процесс (\a PIProcess)
* * машина состояний (\a PIStateMachine)
* \n \n Базовое использование PIP описано на странице \ref using_basic
*/
/*! \page using_basic Getting started /*! \~english \page using_basic Getting started
* \~russian \page using_basic Простые начала
*
* \~english
* Many novice programmers are solved many common task with system integrity: output to console, * Many novice programmers are solved many common task with system integrity: output to console,
* keyboard buttons press detecting, working with serial ports, ethernet or files, and many other. * keyboard buttons press detecting, working with serial ports, ethernet or files, and many other.
* These tasks can solve this library, and code, based only on PIP will be compile and work * These tasks can solve this library, and code, based only on PIP will be compile and work
* similar on many systems: Windows, any Linux, Red Hat, FreeBSD, MacOS X and QNX. * similar on many systems: Windows, any Linux, Red Hat, FreeBSD, MacOS X and QNX.
* Typical application on PIP looks like this: \n * Typical application on PIP looks like this: \n
*
* \~russian
* Многие начинающие программисты решают общие задачи взаимодействия с операционной системой:
* вывод в консоль, определение нажатия клавиш, работа с последовательными портами, сетью или файлами,
* и многое другое. Эти задачи решены в библиотеке, и код, основанный на PIP будет компилироваться
* и работать одинаково на многих системах: Windows, любой Linux, Red Hat, FreeBSD, MacOS X и QNX.
* Типовое приложение на PIP выглядит примерно так: \n
*
\code{.cpp} \code{.cpp}
#include <pip.h> #include <pip.h>
@@ -232,15 +298,32 @@ int main(int argc, char * argv[]) {
return 0; return 0;
}; };
\endcode \endcode
*
* \~english
* This code demonstrates simple interactive configurable program, which can be started with console * This code demonstrates simple interactive configurable program, which can be started with console
* display or not, and with debug or not. \b MainClass is central class that also can be inherited from * display or not, and with debug or not. \b MainClass is central class that also can be inherited from
* \a PIThread and reimplement \a run() function. * \a PIThread and reimplement \a run() function.
* \n Many PIP classes has events and event handlers, which can be connected one to another. * \n Many PIP classes has events and event handlers, which can be connected one to another.
* Details you can see at \a PIObject reference page (\ref PIObject_sec0). * Details you can see at \a PIObject reference page (\ref PIObject_sec0).
* \n To configure your program from file use \a PIConfig. * \n To configure your program from file use \a PIConfig.
* \n If you want more information see \ref using_advanced */ * \n If you want more information see \ref using_advanced
*
* \~russian
* Этот код демонстрирует простую конфигурируемую программу, которая может быть запущена с
* This code demonstrates simple interactive configurable program, which can be started with console
* display or not, and with debug or not. \b MainClass is central class that also can be inherited from
* \a PIThread and reimplement \a run() function.
* \n Many PIP classes has events and event handlers, which can be connected one to another.
* Details you can see at \a PIObject reference page (\ref PIObject_sec0).
* \n To configure your program from file use \a PIConfig.
*/
/*! \page using_advanced Advanced using /*! \page using_advanced Advanced using
* Sorry, creativity crysis xD * Sorry, creativity crysis xD
*/ */
/*
* \~english
* \~russian
*/

View File

@@ -42,10 +42,20 @@ struct lconv;
extern PIP_EXPORT lconv * currentLocale; extern PIP_EXPORT lconv * currentLocale;
/*! \fn errorString() //! \ingroup Core
* @brief Return readable error description in format "code <number> - <description>" */ //! \brief
//! \~english
//! Return readable error description in format "code <number> - <description>"
//! \~russian
//! Возвращает читаемое описание ошибки в формате "code <номер> - <описание>"
PIP_EXPORT PIString errorString(); PIP_EXPORT PIString errorString();
//! \ingroup Core
//! \brief
//! \~english
//! Reset last error
//! \~russian
//! Сброс последней ошибки
PIP_EXPORT void errorClear(); PIP_EXPORT void errorClear();
PIP_EXPORT void piqsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*)); PIP_EXPORT void piqsort(void* base, size_t num, size_t size, int (*compar)(const void*,const void*));
@@ -53,7 +63,10 @@ PIP_EXPORT void piqsort(void* base, size_t num, size_t size, int (*compar)(const
PIP_EXPORT void randomize(); PIP_EXPORT void randomize();
PIP_EXPORT int randomi(); PIP_EXPORT int randomi();
/// Return readable version of PIP //! \ingroup Core
//! \brief
//! \~english Return readable version of PIP
//! \~russian Возвращает читаемую версию PIP
PIP_EXPORT PIString PIPVersion(); PIP_EXPORT PIString PIPVersion();
#endif // PIINCLUDES_H #endif // PIINCLUDES_H

View File

@@ -1,5 +1,7 @@
/*! @file piinit.h /*! \file piinit.h
* @brief Initialization * \~\brief
* \~english Library initialization
* \~russian Инициализация библиотеки
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -51,19 +53,29 @@ class PIP_EXPORT PIInit {
public: public:
~PIInit(); ~PIInit();
//! @brief Build options which PIP library was built //! \ingroup Core
//! \~english Build options which PIP library was built
//! \~russian Опции, с которыми был собран PIP
enum BuildOption { enum BuildOption {
boICU /*! Unicode support */ = 0x01, boICU /*! \~english Unicode support by ICU \~russian Поддержка юникода через ICU */ = 0x01,
boUSB /*! USB support */ = 0x02, boUSB /*! \~english USB support \~russian Поддержка USB */ = 0x02,
boCrypt /*! Crypt support */ = 0x08, boCrypt /*! \~english Crypt support \~russian Поддержка шифрования */ = 0x08,
boIntrospection /*! Introspection */ = 0x010, boIntrospection /*! \~english Introspection \~russian Интроспекция */ = 0x010,
boFFTW /*! FFTW3 support */ = 0x40, boFFTW /*! \~english FFTW3 support \~russian Поддержка FFTW3 */ = 0x40,
boCompress /*! Zlib compression support */ = 0x80, boCompress /*! \~english Zlib compression support \~russian Поддержка сжатия Zlib */ = 0x80,
boOpenCL /*! OpenCL support */ = 0x100, boOpenCL /*! \~english OpenCL support \~russian Поддержка OpenCL */ = 0x100,
boCloud /*! Cloud transport support */ = 0x200, boCloud /*! \~english PICloud transport support \~russian Поддержка облачного транспорта PICloud */ = 0x200,
}; };
static PIInit * instance() {return __PIInit_Initializer__::__instance__;} static PIInit * instance() {return __PIInit_Initializer__::__instance__;}
//! \ingroup Core
//! \~english Returns if build option was enabled
//! \~russian Возвращает была ли включена опция при сборке
static bool isBuildOptionEnabled(BuildOption o); static bool isBuildOptionEnabled(BuildOption o);
//! \ingroup Core
//! \~english Returns build options as stringlist
//! \~russian Возвращает опции сборки как список строк
static PIStringList buildOptions(); static PIStringList buildOptions();
private: private:
explicit PIInit(); explicit PIInit();

View File

@@ -25,37 +25,89 @@
# include "pifile.h" # include "pifile.h"
#endif #endif
/** \class PIObject
* @brief This is base class for any classes which use events -> handlers mechanism. //! \addtogroup Core
* \details //! \{
* \section PIObject_sec0 Events and Event handlers //! \~\class PIObject piobject.h
* %PIObject provide notification mechanism similar Qt but implemented //! \~\brief
* on language capabilities without any special preprocessors or compilers. //! \~english This is base class for any classes which use events -> handlers mechanism
* Any class inherits PIObject should use macro \a PIOBJECT() immediate //! \~russian Этот класс является базовым для использования механизма события -> обработчики
* after declaration to proper compile. //!
* //! \~\details
* Event is a some abstract event that can be raised at any time. //! \~english \section PIObject_sec0 Events and Event handlers
* Event is a function but declared with special macro \a EVENT(). //! \~russian \section PIObject_sec0 События и Обработчики событий
* To raise event simply execute event function. //!
* //! \~english
* Event handler is a function but declared with special macro //! %PIObject provide notification mechanism similar Qt but implemented
* \a EVENT_HANDLER(). You can use event handlers as ordinary functions. //! on language capabilities without any special preprocessors or compilers.
* //! Any class inherits %PIObject should use macro \a PIOBJECT() immediate
* Main goal of this mechanism is perform abstract connections between //! after declaration to proper compile.
* various objects. This functionality provide macro \a CONNECT() which //!
* connect some event of first object to some event handler or event of //! Event is a some abstract event that can be raised at any time as common method.
* second object. Each event can be connected any times to any event handlers. //! Event is a function but declared with special macro \a EVENT() and don`t need definition.
* //! To raise event simply execute event function.
* \image html events_handlers.png //!
* //! Event handler is a function but declared with special macro
* Example: \snippet piobject.cpp main //! \a EVENT_HANDLER(). It need definition as common method.
* Result: //! You can use event handlers as ordinary functions.
\code{.cpp} //!
handler B: 2 , 0.5 //! Main goal of this mechanism is perform abstract connections between
handler A: event to handler //! various objects. This functionality provide macro \a CONNECT(), \a CONNECTU() and \a CONNECTL() which
handler A: event to event //! connect some event of first object to some event handler or event of
\endcode //! second object. Each event can be connected any times to any event handlers.
*/ //!
//! * \a CONNECT() macros family work with explicit subclasses of %PIObject with compile-time check of events and handlers
//! * \a CONNECTU() macro can work implicit subclasses of %PIObject with run-time check of events and handlers
//! * \a CONNECTU_QUEUED() macro similar to \a CONNECTU() macro but queue execution with performer object instead of handler direct call
//! * \a CONNECTL() macro work with implicit subclasses of %PIObject and lambda-function
//!
//! \~russian
//! %PIObject предоставляет механизм событий и их обработчиков, реализованный без
//! дополнительного препроцессора или метакомпилятора. Любой класс, наследованный
//! от %PIObject должен использовать макрос \a PIOBJECT() сразу после объявления
//! класса для корректной работы.
//!
//! Событием является сигнал, который может быть вызван как обычный метод в любое время.
//! Это метод, объявленный с помощью макроса \a EVENT() и не требует описания.
//! Для его вызова просто вызывается метод события.
//!
//! Обработчик события это метод, объявленный с помощью макроса \a EVENT_HANDLER()
//! и он требует описания, как и обычный метод. Можно его использовать как обычный метод.
//!
//! Основной функцией этого механизма является реализация соединений между различными объектами.
//! Её предоставляют макросы \a CONNECT(), \a CONNECTU() и \a CONNECTL(), которые соединяют
//! события одних объектов с обработчиками или событиями других объектов. Каждое событие
//! может быть присоеденино неограниченное количество раз к любым обработчикам.
//!
//! * \a CONNECT() семейство макросов работает с явными наследниками %PIObject, и проверяет соединение во время компиляции
//! * \a CONNECTU() макрос может работать с неявными наследниками %PIObject, и проверяет соединение во время исполнения
//! * \a CONNECTU_QUEUED() макрос подобен \a CONNECTU(), но планирует вызов обработчика у объекта performer вместо прямого вызова
//! * \a CONNECTL() макрос может работать с неявными наследниками %PIObject и лямбда-функцией
//!
//! \~\image html events_handlers.png
//!
//! \~english Example:
//! \~russian Пример:
//!
//! \~\snippet piobject.cpp main
//! \~english Result:
//! \~russian Результат:
//! \~\code{.cpp}
//! handler B: 2 , 0.5
//! handler A: event to handler
//! handler A: event to event
//! event to lambda
//! \endcode
//! \}
//! \addtogroup Core
//! \{
//! \~\class PIObject::Connection piobject.h
//! \~\brief
//! \~english Helper class for obtain info about if connection successful and disconnect single connection
//! \~russian Вспомогательный класс для получения информации об успешности соединения и возможности его разрыва
//! \}
PIString PIObject::__MetaFunc::arguments() const { PIString PIObject::__MetaFunc::arguments() const {
@@ -454,6 +506,14 @@ void PIObject::callQueuedEvents() {
} }
//! \details
//! \~english
//! On first call background thread started to delete objects.
//! Each object deletes when it`s outside from any events and hadlers.
//! \~russian
//! При первом вызове стартует фоновый поток для удаления объектов.
//! Каждый объект из очереди удаляется только когда выйдет из всех
//! событий и обработок.
void PIObject::deleteLater() { void PIObject::deleteLater() {
Deleter::instance()->post(this); Deleter::instance()->post(this);
} }

View File

@@ -1,7 +1,7 @@
/*! @file piobject.h /*! \file piobject.h
* @brief Base object * \~\brief
* * \~english Base object
* This file declare PIObject class * \~russian Базовый класс
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -47,12 +47,12 @@ class PIP_EXPORT PIObject {
public: public:
NO_COPY_CLASS(PIObject) NO_COPY_CLASS(PIObject)
//! Contructs PIObject with name "name" //! \~english Contructs %PIObject with name "name"
//! \~russian Создает %PIObject с именем "name"
explicit PIObject(const PIString & name = PIString()); explicit PIObject(const PIString & name = PIString());
virtual ~PIObject(); virtual ~PIObject();
//! Helper class for obtain info about if connection successful and disconnect single connection
class PIP_EXPORT Connection { class PIP_EXPORT Connection {
friend class PIObject; friend class PIObject;
Connection(void * sl, void * si, const PIString & e = PIString(), Connection(void * sl, void * si, const PIString & e = PIString(),
@@ -81,22 +81,28 @@ public:
int args_count; int args_count;
public: public:
//! Contructs invalid %Connection //! \~english Contructs invalid %Connection
//! \~russian Создает недействительный %Connection
Connection(); Connection();
//! Returns if %Connection is valid //! \~english Returns if %Connection is valid
//! \~russian Возвращает успешен ли %Connection
bool isValid() const {return signal;} bool isValid() const {return signal;}
//! Returns source object //! \~english Returns source object
//! \~russian Возвращает объект-источник
PIObject * sourceObject() const {return src_o;} PIObject * sourceObject() const {return src_o;}
//! Returns destination object or nullptr if this is lambda connection //! \~english Returns destination object or "nullptr" if this is lambda connection
//! \~russian Возвращает объект-приемник или "nullptr" если это соединение на лямбда-функцию
PIObject * destinationObject() const {return dest_o;} PIObject * destinationObject() const {return dest_o;}
//! Returns performer object or nullptr if this is non-queued connection //! \~english Returns performer object or "nullptr" if this is non-queued connection
//! \~russian Возвращает объект-приемник или "nullptr" если это соединение не отложенное
PIObject * performerObject() const {return performer;} PIObject * performerObject() const {return performer;}
//! Disconnect this %Connection, returns if operation successful //! \~english Disconnect this %Connection, returns if operation successful
//! \~russian Разрывает этот %Connection, возвращает успешен ли разрыв
bool disconnect(); bool disconnect();
}; };
@@ -105,10 +111,12 @@ private:
public: public:
//! Returns object name //! \~english Returns object name
//! \~russian Возвращает имя объекта
PIString name() const {return property(PIStringAscii("name")).toString();} PIString name() const {return property(PIStringAscii("name")).toString();}
//! Returns object class name //! \~english Returns object class name
//! \~russian Возвращает имя класса объекта
virtual const char * className() const {return "PIObject";} virtual const char * className() const {return "PIObject";}
virtual uint classNameID() const {static uint ret = PIStringAscii("PIObject").hash(); return ret;} virtual uint classNameID() const {static uint ret = PIStringAscii("PIObject").hash(); return ret;}
@@ -116,36 +124,45 @@ public:
static const PIString __classNameS() {return PIStringAscii("PIObject");} static const PIString __classNameS() {return PIStringAscii("PIObject");}
static uint __classNameIDS() {static uint ret = PIStringAscii("PIObject").hash(); return ret;} static uint __classNameIDS() {static uint ret = PIStringAscii("PIObject").hash(); return ret;}
//! Returns parent object class name //! \~english Returns parent class name
//! \~russian Возвращает имя родительского класса
virtual const char * parentClassName() const {return "";} virtual const char * parentClassName() const {return "";}
//! Return if debug of this object is active //! \~english Return if debug of this object is active
//! \~russian Возвращает включен ли вывод на консоль для этого объекта
bool debug() const {return property(PIStringAscii("debug")).toBool();} bool debug() const {return property(PIStringAscii("debug")).toBool();}
//! Set object name //! \~english Set object name
//! \~russian Устанавливает имя объекта
void setName(const PIString & name) {setProperty(PIStringAscii("name"), name);} void setName(const PIString & name) {setProperty(PIStringAscii("name"), name);}
void setName(const char * name) {setName(PIStringAscii(name));} void setName(const char * name) {setName(PIStringAscii(name));}
//! Set object debug active //! \~english Set object debug active
//! \~russian Включает или отключает вывод на консоль для этого объекта
void setDebug(bool debug) {setProperty(PIStringAscii("debug"), debug);} void setDebug(bool debug) {setProperty(PIStringAscii("debug"), debug);}
//! Returns properties of the object //! \~english Returns properties of the object
PIMap<PIString, PIVariant> properties() const; //! \~russian Возвращает словарь свойств объекта
PIMap<PIString, PIVariant> properties() const;
//! Returns properties count of the object //! \~english Returns properties count of the object
//! \~russian Возвращает количество свойств объекта
int propertiesCount() const {return properties_.size_s();} int propertiesCount() const {return properties_.size_s();}
//! Returns property with name "name" //! \~english Returns property with name "name"
//! \~russian Возвращает свойство объекта по имени "name"
PIVariant property(const PIString & name) const {return properties_.value(name.hash(), Property(PIString(), PIVariant())).second;} PIVariant property(const PIString & name) const {return properties_.value(name.hash(), Property(PIString(), PIVariant())).second;}
PIVariant property(const char * name) const {return property(PIStringAscii(name));} PIVariant property(const char * name) const {return property(PIStringAscii(name));}
//! Set property with name "name" to "value". If there is no such property in object it will be added //! \~english Set property with name "name" to "value". If there is no such property in object it will be added
//! \~russian Устанавливает у объекта свойство по имени "name" в "value". Если такого свойства нет, оно добавляется
void setProperty(const PIString & name, const PIVariant & value) {properties_[name.hash()] = Property(name, value); propertyChanged(name);} void setProperty(const PIString & name, const PIVariant & value) {properties_[name.hash()] = Property(name, value); propertyChanged(name);}
void setProperty(const char * name, const PIVariant & value) {setProperty(PIStringAscii(name), value);} void setProperty(const char * name, const PIVariant & value) {setProperty(PIStringAscii(name), value);}
//! Returns if property with name "name" exists //! \~english Returns if property with name "name" exists
//! \~russian Возвращает присутствует ли свойство по имени "name"
bool isPropertyExists(const PIString & name) const {return properties_.contains(name.hash());} bool isPropertyExists(const PIString & name) const {return properties_.contains(name.hash());}
bool isPropertyExists(const char * name) const {return isPropertyExists(PIStringAscii(name));} bool isPropertyExists(const char * name) const {return isPropertyExists(PIStringAscii(name));}
@@ -183,7 +200,10 @@ public:
void dump(const PIString & line_prefix = PIString()) const; void dump(const PIString & line_prefix = PIString()) const;
//! \~english Returns subclass scope of this object (including this class name)
//! \~russian Возвращает цепочку наследования объекта (вместе с классом самого объекта)
PIStringList scopeList() const; PIStringList scopeList() const;
PIStringList methodsEH() const; PIStringList methodsEH() const;
bool isMethodEHContains(const PIString & name) const; bool isMethodEHContains(const PIString & name) const;
PIString methodEHArguments(const PIString & name) const; PIString methodEHArguments(const PIString & name) const;
@@ -200,23 +220,29 @@ public:
} }
//! Disconnect object from all connections with event name "sig", connected to destination object "dest" and handler "ev_h" //! \~english Disconnect object from all connections with event name "sig", connected to destination object "dest" and handler "ev_h"
//! \~russian Разрывает все соединения от события "sig" к объекту "dest" и обработчику "ev_h"
void piDisconnect(const PIString & sig, PIObject * dest, void * ev_h) {piDisconnect(this, sig, dest, ev_h);} void piDisconnect(const PIString & sig, PIObject * dest, void * ev_h) {piDisconnect(this, sig, dest, ev_h);}
//! Disconnect object from all connections with event name "sig", connected to destination object "dest" //! \~english Disconnect object from all connections with event name "sig", connected to destination object "dest"
//! \~russian Разрывает все соединения от события "sig" к объекту "dest"
void piDisconnect(const PIString & sig, PIObject * dest) {piDisconnect(this, sig, dest);} void piDisconnect(const PIString & sig, PIObject * dest) {piDisconnect(this, sig, dest);}
//! Disconnect object from all connections with event name "sig" //! \~english Disconnect object from all connections with event name "sig"
//! \~russian Разрывает все соединения от события "sig"
void piDisconnect(const PIString & sig) {piDisconnect(this, sig);} void piDisconnect(const PIString & sig) {piDisconnect(this, sig);}
//! Disconnect object "src" from all connections with event name "sig", connected to destination object "dest" and handler "ev_h" //! \~english Disconnect object "src" from all connections with event name "sig", connected to destination object "dest" and handler "ev_h"
//! \~russian Разрывает все соединения от события "sig" объекта "src" к объекту "dest" и обработчику "ev_h"
static void piDisconnect(PIObject * src, const PIString & sig, PIObject * dest, void * ev_h); static void piDisconnect(PIObject * src, const PIString & sig, PIObject * dest, void * ev_h);
//! Disconnect object "src" from all connections with event name "sig", connected to destination object "dest" //! \~english Disconnect object "src" from all connections with event name "sig", connected to destination object "dest"
//! \~russian Разрывает все соединения от события "sig" объекта "src" к объекту "dest"
static void piDisconnect(PIObject * src, const PIString & sig, PIObject * dest); static void piDisconnect(PIObject * src, const PIString & sig, PIObject * dest);
//! Disconnect object "src" from all connections with event name "sig" //! \~english Disconnect object "src" from all connections with event name "sig"
//! \~russian Разрывает все соединения от события "sig" объекта "src"
static void piDisconnect(PIObject * src, const PIString & sig); static void piDisconnect(PIObject * src, const PIString & sig);
// / Raise events // / Raise events
@@ -398,23 +424,36 @@ public:
if (i->name() != name) continue; if (i->name() != name) continue;
return i; return i;
} }
return 0; return nullptr;
} }
//! \~english Returns if this is valid %PIObject (check signature)
//! \~russian Возвращает действительный ли это %PIObject (проверяет подпись)
bool isPIObject() const {return isPIObject(this);} bool isPIObject() const {return isPIObject(this);}
//! \~english Returns if this is valid %PIObject subclass "T" (check signature and classname)
//! \~russian Возвращает действительный ли это наследник %PIObject типа "T" (проверяет подпись и имя класса)
template<typename T> template<typename T>
bool isTypeOf() const { bool isTypeOf() const {
if (!isPIObject()) return false; if (!isPIObject()) return false;
return scopeList().contains(T::__classNameS()); return scopeList().contains(T::__classNameS());
} }
//! \~english Returns cast to T if this is valid subclass "T" (check by \a isTypeOf()) or "nullptr"
//! \~russian Возвращает преобразование к типу T если это действительный наследник типа "T" (проверяет через \a isTypeOf()), или "nullptr"
template<typename T> template<typename T>
T * cast() const { T * cast() const {
if (!isTypeOf<T>()) return (T*)0; if (!isTypeOf<T>()) return (T*)nullptr;
return (T*)this; return (T*)this;
} }
//! \~english Returns if "o" is valid %PIObject (check signature)
//! \~russian Возвращает действительный ли "o" %PIObject (проверяет подпись)
static bool isPIObject(const PIObject * o); static bool isPIObject(const PIObject * o);
static bool isPIObject(const void * o) {return isPIObject((PIObject*)o);} static bool isPIObject(const void * o) {return isPIObject((PIObject*)o);}
//! \~english Returns if "o" is valid %PIObject subclass "T" (check signature and classname)
//! \~russian Возвращает действительный ли "o" наследник %PIObject типа "T" (проверяет подпись и имя класса)
template<typename T> template<typename T>
static bool isTypeOf(const PIObject * o) {return o->isTypeOf<T>();} static bool isTypeOf(const PIObject * o) {return o->isTypeOf<T>();}
template<typename T> template<typename T>
@@ -445,17 +484,22 @@ public:
}; };
typedef PIPair<const void * , __MetaFunc> __EHPair; typedef PIPair<const void * , __MetaFunc> __EHPair;
//! @brief Execute all posted events from CONNECTU_QUEUED connections //! \~english Execute all posted events from CONNECTU_QUEUED connections
//! \~russian Выполнить все отложенные события от CONNECTU_QUEUED соединений
void callQueuedEvents(); void callQueuedEvents();
//! @brief Check if any CONNECTU_QUEUED connections to this object and execute them //! \~english
//! \brief Check if any CONNECTU_QUEUED connections to this object and execute them
//! \details This function is more optimized than \a callQueuedEvents() for objects that doesn`t //! \details This function is more optimized than \a callQueuedEvents() for objects that doesn`t
//! appears as \"performer\" target at CONNECTU_QUEUED //! appears as \"performer\" target at CONNECTU_QUEUED
//! \~russian
//! \brief Если было хотя бы одно CONNECTU_QUEUED соединение с исполнителем this, то выполнить события
//! \details Этот метод более оптимален, чем \a callQueuedEvents(), для объектов, которые не были в роли
//! \"performer\" в макросе CONNECTU_QUEUED
bool maybeCallQueuedEvents() {if (proc_event_queue) callQueuedEvents(); return proc_event_queue;} bool maybeCallQueuedEvents() {if (proc_event_queue) callQueuedEvents(); return proc_event_queue;}
//! @brief Mark object to delete //! \~english Mark object to delete
//! \details On first call background thread started to delete objects. //! \~russian Пометить объект на удаление
//! Each object deletes when it`s outside from any events and hadlers.
void deleteLater(); void deleteLater();
static PIMutex & __meta_mutex(); static PIMutex & __meta_mutex();
@@ -463,10 +507,12 @@ public:
protected: protected:
//! Returns PIObject* which has raised an event. This value is correct only in definition of some event handler //! \~english Returns %PIObject* which has raised an event. This value is correct only in definition of some event handler
//! \~russian Возвращает %PIObject* который вызвал это событие. Значение допустимо только из методов обработчиков событий
PIObject * emitter() const {return emitter_;} PIObject * emitter() const {return emitter_;}
//! Virtual function executes after property with name "name" has been changed //! \~english Virtual function executes after property with name "name" has been changed
//! \~russian Виртуальная функция, вызывается после изменения любого свойства.
virtual void propertyChanged(const PIString & name) {} virtual void propertyChanged(const PIString & name) {}
EVENT1(deleted, PIObject *, o) EVENT1(deleted, PIObject *, o)
@@ -474,10 +520,17 @@ protected:
//! \events //! \events
//! \{ //! \{
/** \fn void deleted(PIObject * o) //! \fn void deleted(PIObject * o)
* @brief Raise before object delete //! \brief
* \note This event raised from destructor, so use only "o" value, //! \~english Raise before object delete
* don`t try to cast deleted object to some subclass! */ //! \~russian Вызывается перед удалением объекта
//! \~\warning
//! \~english
//! This event raised from destructor, so use only "o" numeric value,
//! don`t try to cast deleted object to some subclass!
//! \~russian
//! Это событие вызывается из деструктора, поэтому используйте
//! только численное значение "o", не надо кастовать его в другие типы!
//! \} //! \}

View File

@@ -1,5 +1,5 @@
/*! @file piobject_macros.h /*! \file piobject_macros.h
* @brief Base object * \~\brief Base object
* *
* This file declare macros for PIObject * This file declare macros for PIObject
*/ */
@@ -29,67 +29,127 @@
#ifdef DOXYGEN #ifdef DOXYGEN
/// \relatesalso PIObject @brief you should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutObj output //! \relatesalso PIObject
//! \~\brief
//! \~english You should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutObj output
//! \~russian Необходимо использовать этот макрос после объявления класса для использования событийной системы и корректного вывода piCoutObj
#define PIOBJECT(name) #define PIOBJECT(name)
/// \relatesalso PIObject @brief you should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and \a scopeList() //! \relatesalso PIObject
//! \~\brief
//! \~english You should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and \a scopeList()
//! \~russian
#define PIOBJECT_SUBCLASS(name, parent) #define PIOBJECT_SUBCLASS(name, parent)
/// \relatesalso PIObject @brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name() //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name()
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name()
#define EVENT_HANDLER0(ret, name) ret name() #define EVENT_HANDLER0(ret, name) ret name()
/// \relatesalso PIObject @brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name(type0 var0)
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0)
#define EVENT_HANDLER1(ret, name, type0, var0) ret name(type0 var0) #define EVENT_HANDLER1(ret, name, type0, var0) ret name(type0 var0)
/// \relatesalso PIObject @brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1)
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0, type1 var1)
#define EVENT_HANDLER2(ret, name, type0, var0, type1, var1) ret name(type0 var0, type1 var1) #define EVENT_HANDLER2(ret, name, type0, var0, type1, var1) ret name(type0 var0, type1 var1)
/// \relatesalso PIObject @brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1, type2 var2) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1, type2 var2)
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0, type1 var1, type2 var2)
#define EVENT_HANDLER3(ret, name, type0, var0, type1, var1, type2, var2) ret name(type0 var0, type1 var1, type2 var2) #define EVENT_HANDLER3(ret, name, type0, var0, type1, var1, type2, var2) ret name(type0 var0, type1 var1, type2 var2)
/// \relatesalso PIObject @brief declare event handler \"event\" with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1, type2 var2, type3 var3) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event handler with name \"name\" and return type \"ret\", ret name(type0 var0, type1 var1, type2 var2, type3 var3)
//! \~russian Объявляет обработчик событий с именем \"name\" и возвращаемым типом \"ret\", ret name(type0 var0, type1 var1, type2 var2, type3 var3)
#define EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) ret name(type0 var0, type1 var1, type2 var2, type3 var3) #define EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) ret name(type0 var0, type1 var1, type2 var2, type3 var3)
/// \relatesalso PIObject @brief EVENT_HANDLER is synonym of EVENT_HANDLER0 //! \relatesalso PIObject
//! \~\brief
//! \~english Synonym of EVENT_HANDLER0
//! \~russian Аналог EVENT_HANDLER0
#define EVENT_HANDLER EVENT_HANDLER0 #define EVENT_HANDLER EVENT_HANDLER0
/// \relatesalso PIObject @brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name() //! \relatesalso PIObject
//! \~\brief
//! \~english Declare virtual event handler with name \"name\" and return type \"ret\", virtual ret name()
//! \~russian Объявляет виртуальный обработчик событий с именем \"name\" и возвращаемым типом \"ret\", virtual ret name()
#define EVENT_VHANDLER0(ret, name) virtual ret name() #define EVENT_VHANDLER0(ret, name) virtual ret name()
/// \relatesalso PIObject @brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare virtual event handler with name \"name\" and return type \"ret\", virtual ret name(type0 var0)
//! \~russian Объявляет виртуальный обработчик событий с именем \"name\" и возвращаемым типом \"ret\", virtual ret name(type0 var0)
#define EVENT_VHANDLER1(ret, name, type0, var0) virtual ret name(type0 var0) #define EVENT_VHANDLER1(ret, name, type0, var0) virtual ret name(type0 var0)
/// \relatesalso PIObject @brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare virtual event handler with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1)
//! \~russian Объявляет виртуальный обработчик событий с именем \"name\" и возвращаемым типом \"ret\", virtual ret name(type0 var0, type1 var1)
#define EVENT_VHANDLER2(ret, name, type0, var0, type1, var1) virtual ret name(type0 var0, type1 var1) #define EVENT_VHANDLER2(ret, name, type0, var0, type1, var1) virtual ret name(type0 var0, type1 var1)
/// \relatesalso PIObject @brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare virtual event handler with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2)
//! \~russian Объявляет виртуальный обработчик событий с именем \"name\" и возвращаемым типом \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2)
#define EVENT_VHANDLER3(ret, name, type0, var0, type1, var1, type2, var2) virtual ret name(type0 var0, type1 var1, type2 var2) #define EVENT_VHANDLER3(ret, name, type0, var0, type1, var1, type2, var2) virtual ret name(type0 var0, type1 var1, type2 var2)
/// \relatesalso PIObject @brief declare virtual event handler \"event\" with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3) //! \relatesalso PIObject
//! \~\brief
//! \~english Declare virtual event handler with name \"name\" and return type \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
//! \~russian Объявляет виртуальный обработчик событий с именем \"name\" и возвращаемым типом \"ret\", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
#define EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3) #define EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3) virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
/// \relatesalso PIObject @brief EVENT_VHANDLER is synonym of EVENT_VHANDLER0 //! \relatesalso PIObject
//! \~\brief
//! \~english Synonym of EVENT_VHANDLER0
//! \~russian Аналог EVENT_VHANDLER0
#define EVENT_VHANDLER EVENT_VHANDLER0 #define EVENT_VHANDLER EVENT_VHANDLER0
/// \relatesalso PIObject @brief declare event \"event\" with name \"name\", void name(); //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event with name \"name\", void name();
//! \~russian Объявляет событие с именем \"name\", void name();
#define EVENT0(name) void name(); #define EVENT0(name) void name();
/// \relatesalso PIObject @brief declare event \"event\" with name \"name\", void name(type0 var0); //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event with name \"name\", void name(type0 var0);
//! \~russian Объявляет событие с именем \"name\", void name(type0 var0);
#define EVENT1(name, type0, var0) void name(type0 var0); #define EVENT1(name, type0, var0) void name(type0 var0);
/// \relatesalso PIObject @brief declare event \"event\" with name \"name\", void name(type0 var0, type1 var1); //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event with name \"name\", void name(type0 var0, type1 var1);
//! \~russian Объявляет событие с именем \"name\", void name(type0 var0, type1 var1);
#define EVENT2(name, type0, var0, type1, var1) void name(type0 var0, type1 var1); #define EVENT2(name, type0, var0, type1, var1) void name(type0 var0, type1 var1);
/// \relatesalso PIObject @brief declare event \"event\" with name \"name\", void name(type0 var0, type1 var1, type2 var2); //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event with name \"name\", void name(type0 var0, type1 var1, type2 var2);
//! \~russian Объявляет событие с именем \"name\", void name(type0 var0, type1 var1, type2 var2);
#define EVENT3(name, type0, var0, type1, var1, type2, var2) void name(type0 var0, type1 var1, type2 var2); #define EVENT3(name, type0, var0, type1, var1, type2, var2) void name(type0 var0, type1 var1, type2 var2);
/// \relatesalso PIObject @brief declare event \"event\" with name \"name\", void name(type0 var0, type1 var1, type2 var2, type3 var3); //! \relatesalso PIObject
//! \~\brief
//! \~english Declare event with name \"name\", void name(type0 var0, type1 var1, type2 var2, type3 var3);
//! \~russian Объявляет событие с именем \"name\", void name(type0 var0, type1 var1, type2 var2, type3 var3);
#define EVENT4(name, type0, var0, type1, var1, type2, var2, type3, var3) void name(type0 var0, type1 var1, type2 var2, type3 var3); #define EVENT4(name, type0, var0, type1, var1, type2, var2, type3, var3) void name(type0 var0, type1 var1, type2 var2, type3 var3);
/// \relatesalso PIObject @brief EVENT is synonym of EVENT0 //! \relatesalso PIObject
//! \~\brief
//! \~english Synonym of EVENT0
//! \~russian Аналог EVENT0
#define EVENT EVENT0 #define EVENT EVENT0
@@ -101,89 +161,217 @@
#define RAISE_EVENT RAISE_EVENT0 #define RAISE_EVENT RAISE_EVENT0
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\". \"Event\" and \"handler\" must has equal argument lists. //! \relatesalso PIObject
/// Returns PIObject::Connection //! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler or event \"handler\" of object \"dest\".
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" объекта \"dest\".
//! \~\details
//! \~english
//! \"handler\" can handle subset arguments of \"event\".
//! Returns \a PIObject::Connection
//! \~russian
//! \"handler\" может принимать не все аргументы от \"event\".
//! Возвращает \a PIObject::Connection
#define CONNECTU(src, event, dest, handler) #define CONNECTU(src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\". //! \relatesalso PIObject
/// Event handler will be executed by \"performer\". \"Event\" and \"handler\" must has equal argument lists. //! \~\brief
/// Returns PIObject::Connection //! \~english Connect event \"event\" from object \"src\" to event handler or event \"handler\" of object \"dest\".
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" объекта \"dest\".
//! \~\details
//! \~english
//! \"handler\" can handle subset arguments of \"event\".
//! Event handler will be executed by \"performer\" when \a PIObject::callQueuedEvents() called.
//! All argument types should be registered by \a REGISTER_VARIANT() macro, but many
//! common and PIP types already done.
//! Returns \a PIObject::Connection
//! \~russian
//! \"handler\" может принимать не все аргументы от \"event\".
//! Обработчик будет вызван объектом \"performer\" при вызове \a PIObject::callQueuedEvents().
//! Все типы аргументов должны быть зарегистрированы с помощью макроса \a REGISTER_VARIANT(),
//! однако многие стандартные и PIP типы уже там.
//! Возвращает \a PIObject::Connection
#define CONNECTU_QUEUED(src, event, dest, handler, performer) #define CONNECTU_QUEUED(src, event, dest, handler, performer)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to lambda-expression \"functor\". \"Event\" and \"functor\" must has equal argument lists. //! \relatesalso PIObject
/// Returns PIObject::Connection //! \~\brief
//! \~english Connect event \"event\" from object \"src\" to lambda-expression \"functor\".
//! \~russian Соединяет событие \"event\" объекта \"src\" к лямбда-функции \"functor\".
//! \~\details
//! \~english
//! \"event\" and \"functor\" must has equal argument lists.
//! You should parentness \"functor\" with () if this is complex lambda.
//! Returns \a PIObject::Connection
//! \~russian
//! \"event\" и \"functor\" должны иметь одинаковые аргументы.
//! В случае сложной лямбда-функции оберните её ().
//! Возвращает \a PIObject::Connection
#define CONNECTL(src, event, functor) #define CONNECTL(src, event, functor)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists //! \relatesalso PIObject
/// Returns PIObject::Connection //! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
#define CONNECT0(ret, src, event, dest, handler) #define CONNECT0(ret, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists //! \relatesalso PIObject
/// Returns PIObject::Connection //! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
#define CONNECT1(ret, type0, src, event, dest, handler) #define CONNECT1(ret, type0, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists //! \relatesalso PIObject
/// Returns PIObject::Connection //! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
#define CONNECT2(ret, type0, type1, src, event, dest, handler) #define CONNECT2(ret, type0, type1, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists //! \relatesalso PIObject
/// Returns PIObject::Connection //! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
#define CONNECT3(ret, type0, type1, type2, src, event, dest, handler) #define CONNECT3(ret, type0, type1, type2, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists. //! \relatesalso PIObject
/// Returns PIObject::Connection //! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" with check of event and handler exists.
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" с проверкой наличия события и обработчика.
//! \~\details
//! Returns PIObject::Connection
#define CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) #define CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
/// \relatesalso PIObject @brief CONNECT is synonym of CONNECT0 //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Synonym of \a CONNECT0
//! \~russian Аналог \a CONNECT0
#define CONNECT CONNECT0 #define CONNECT CONNECT0
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" без проверки наличия события и обработчика.
#define WEAK_CONNECT0(ret, src, event, dest, handler) #define WEAK_CONNECT0(ret, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" без проверки наличия события и обработчика.
#define WEAK_CONNECT1(ret, type0, src, event, dest, handler) #define WEAK_CONNECT1(ret, type0, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" без проверки наличия события и обработчика.
#define WEAK_CONNECT2(ret, type0, type1, src, event, dest, handler) #define WEAK_CONNECT2(ret, type0, type1, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" без проверки наличия события и обработчика.
#define WEAK_CONNECT3(ret, type0, type1, type2, src, event, dest, handler) #define WEAK_CONNECT3(ret, type0, type1, type2, src, event, dest, handler)
/// \relatesalso PIObject @brief connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Connect event \"event\" from object \"src\" to event handler \"handler\" with return type \"ret\" from object \"dest\" without check of event exists
//! \~russian Соединяет событие \"event\" объекта \"src\" к обработчику или событию \"handler\" с возвращаемым типом \"ret\" объекта \"dest\" без проверки наличия события и обработчика.
#define WEAK_CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) #define WEAK_CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
/// \relatesalso PIObject @brief WEAK_CONNECT is synonym of WEAK_CONNECT0 //! \relatesalso PIObject
//! \deprecated
//! \~english Use \a CONNECTU() instead
//! \~russian Используйте \a CONNECTU()
//! \~\brief
//! \~english Synonym of \a WEAK_CONNECT0
//! \~russian Аналог \a WEAK_CONNECT0
#define WEAK_CONNECT WEAK_CONNECT0 #define WEAK_CONNECT WEAK_CONNECT0
/// \relatesalso PIObject @brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" //! \relatesalso PIObject
//! \~\brief
//! \~english piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\"
//! \~russian piDisconnect событие \"event\" объекта \"src\" от обработчика или события \"handler\" с возвращаемым типом \"ret\" объекта \"dest\"
#define DISCONNECT0(ret, src, event, dest, handler) #define DISCONNECT0(ret, src, event, dest, handler)
/// \relatesalso PIObject @brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" //! \relatesalso PIObject
//! \~\brief
//! \~english piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\"
//! \~russian piDisconnect событие \"event\" объекта \"src\" от обработчика или события \"handler\" с возвращаемым типом \"ret\" объекта \"dest\"
#define DISCONNECT1(ret, type0, src, event, dest, handler) #define DISCONNECT1(ret, type0, src, event, dest, handler)
/// \relatesalso PIObject @brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" //! \relatesalso PIObject
//! \~\brief
//! \~english piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\"
//! \~russian piDisconnect событие \"event\" объекта \"src\" от обработчика или события \"handler\" с возвращаемым типом \"ret\" объекта \"dest\"
#define DISCONNECT2(ret, type0, type1, src, event, dest, handler) #define DISCONNECT2(ret, type0, type1, src, event, dest, handler)
/// \relatesalso PIObject @brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" //! \relatesalso PIObject
//! \~\brief
//! \~english piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\"
//! \~russian piDisconnect событие \"event\" объекта \"src\" от обработчика или события \"handler\" с возвращаемым типом \"ret\" объекта \"dest\"
#define DISCONNECT3(ret, type0, type1, type2, src, event, dest, handler) #define DISCONNECT3(ret, type0, type1, type2, src, event, dest, handler)
/// \relatesalso PIObject @brief piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\" //! \relatesalso PIObject
//! \~\brief
//! \~english piDisconnect event \"event\" from object \"src\" from event handler \"handler\" with return type \"ret\" from object \"dest\"
//! \~russian piDisconnect событие \"event\" объекта \"src\" от обработчика или события \"handler\" с возвращаемым типом \"ret\" объекта \"dest\"
#define DISCONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler) #define DISCONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
/// \relatesalso PIObject @brief DISCONNECT is synonym of DISCONNECT0 //! \relatesalso PIObject
//! \~\brief
//! \~english Synonym of \a DISCONNECT0
//! \~russian Аналог \a DISCONNECT0
#define DISCONNECT DISCONNECT0 #define DISCONNECT DISCONNECT0
/// \relatesalso PIObject @brief Returns pointer to events handler \"handler\" //! \relatesalso PIObject
//! \~\brief
//! \~english Returns pointer to events handler \"handler\"
//! \~russian Возвращает указатель на обработчик события \"handler\"
#define HANDLER(handler) #define HANDLER(handler)
#define PIOBJECT(name)
#define PIOBJECT_SUBCLASS(name)
#else #else

View File

@@ -20,6 +20,62 @@
#include "pipropertystorage.h" #include "pipropertystorage.h"
//! \addtogroup Core
//! \{
//! \~\class PIPropertyStorage pipropertystorage.h
//! \~\brief
//! \~english This class provides key-value properties storage
//! \~russian Этот класс предоставляет ключ-значение хранение свойств
//!
//! \~\details
//! \~english \section PIPropertyStorage_sec0 Synopsis
//! \~russian \section PIPropertyStorage_sec0 Краткий обзор
//!
//! \~english
//! Key-value storage, based on PIVector with PIPropertyStorage::Property elements. Each element in vector
//! contains unique name. You can access property by name with \a propertyValueByName() or \a propertyByName().
//! You can add or replace property by \a addProperty(const Property&) or \a addProperty(const PIString&, const PIVariant&, const PIString&, int).
//!
//! \~russian
//! Хранилище свойств ключ-значние, основанный на PIVector с элементами PIPropertyStorage::Property.
//! Каждый элемент имеет уникальное имя. Доступ к свойствам через \a propertyValueByName() или \a propertyByName().
//! Добавление и перезапись свойств через \a addProperty(const Property&) или \a addProperty(const PIString&, const PIVariant&, const PIString&, int).
//!
//! \~english Example:
//! \~russian Пример:
//! \~\code{.cpp}
//! \endcode
//! \}
//! \addtogroup Core
//! \{
//! \~\class PIPropertyStorage::Property pipropertystorage.h
//! \~\brief
//! \~english PIPropertyStorage element
//! \~russian Элемент PIPropertyStorage
//!
//! \~\details
//! \~english \section PIPropertyStorage_sec0 Synopsis
//! \~russian \section PIPropertyStorage_sec0 Краткий обзор
//!
//! \~english
//! Key-value storage, based on PIVector with PIPropertyStorage::Property elements. Each element in vector
//! contains unique name. You can access property by name with \a propertyValueByName() or \a propertyByName().
//! You can add or replace property by \a addProperty(const Property&) or \a addProperty(const PIString&, const PIVariant&, const PIString&, int).
//!
//! \~russian
//! Хранилище свойств ключ-значние, основанный на PIVector с элементами PIPropertyStorage::Property.
//! Каждый элемент имеет уникальное имя. Доступ к свойствам через \a propertyValueByName() или \a propertyByName().
//! Добавление и перезапись свойств через \a addProperty(const Property&) или \a addProperty(const PIString&, const PIVariant&, const PIString&, int).
//!
//! \~english Example:
//! \~russian Пример:
//! \~\code{.cpp}
//! \endcode
//! \}
bool PIPropertyStorage::isPropertyExists(const PIString & _name) const { bool PIPropertyStorage::isPropertyExists(const PIString & _name) const {
for (uint i = 0; i < props.size(); ++i) for (uint i = 0; i < props.size(); ++i)
if (props[i].name == _name) if (props[i].name == _name)
@@ -28,6 +84,9 @@ bool PIPropertyStorage::isPropertyExists(const PIString & _name) const {
} }
//! \details
//! \~english Returns "true" if new property added, else if update existing property return "false"
//! \~russian Возвращает истину если новое свойство добавлено, в случае обновления "ложь"
bool PIPropertyStorage::addProperty(const PIPropertyStorage::Property & p) { bool PIPropertyStorage::addProperty(const PIPropertyStorage::Property & p) {
for (uint i = 0; i < props.size(); ++i) for (uint i = 0; i < props.size(); ++i)
if (props[i].name == p.name) { if (props[i].name == p.name) {
@@ -50,6 +109,9 @@ bool PIPropertyStorage::addProperty(PIPropertyStorage::Property && p) {
} }
//! \details
//! \~english Returns "true" if new property added, else if update existing property return "false"
//! \~russian Возвращает истину если новое свойство добавлено, в случае обновления "ложь"
bool PIPropertyStorage::addProperty(const PIString & _name, const PIVariant & _def_value, const PIString & _comment, int _flags) { bool PIPropertyStorage::addProperty(const PIString & _name, const PIVariant & _def_value, const PIString & _comment, int _flags) {
return addProperty(Property(_name, _comment, _def_value, _flags)); return addProperty(Property(_name, _comment, _def_value, _flags));
} }
@@ -66,6 +128,9 @@ bool PIPropertyStorage::removeProperty(const PIString & _name) {
} }
//! \details
//! \~english "flag" checked as bitfield
//! \~russian "flag" проверяется как битовое поле
int PIPropertyStorage::removePropertiesByFlag(int flag) { int PIPropertyStorage::removePropertiesByFlag(int flag) {
int ret = 0; int ret = 0;
for (int i = 0; i < props.size_s(); ++i) { for (int i = 0; i < props.size_s(); ++i) {
@@ -79,6 +144,9 @@ int PIPropertyStorage::removePropertiesByFlag(int flag) {
} }
//! \details
//! \~english "flag_ignore" is bitfield to ignore property in merge process
//! \~russian "flag_ignore" - битовое поле для исключения свойств из процесса слияния
void PIPropertyStorage::updateProperties(const PIVector<PIPropertyStorage::Property> & properties_, int flag_ignore) { void PIPropertyStorage::updateProperties(const PIVector<PIPropertyStorage::Property> & properties_, int flag_ignore) {
PIMap<PIString, PIVariant> values; PIMap<PIString, PIVariant> values;
piForeachC(Property & p, props) piForeachC(Property & p, props)

View File

@@ -1,8 +1,8 @@
/*! @file pipropertystorage.h /*! \file pipropertystorage.h
* @brief Storage of properties for GUI usage * \~\brief
* * \~english Properties array
* This file declare PIPropertyStorage * \~russian Массив свойств
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Storage of properties for GUI usage Storage of properties for GUI usage
@@ -27,25 +27,28 @@
#include "pivariant.h" #include "pivariant.h"
/**
* @brief Key-value storage, based on PIVector with PIPropertyStorage::Property elements. Each element in vector
* contains unique name and you can identify property by name with propertyValueByName(), propertyByName().
* You can add property using addProperty(const Property&), addProperty(const PIString&, const PIVariant&, const PIString&, int).
*/
class PIP_EXPORT PIPropertyStorage { class PIP_EXPORT PIPropertyStorage {
public: public:
//! \~english Contructs an empty %PIPropertyStorage
//! \~russian Создает пустой %PIPropertyStorage
PIPropertyStorage() {} PIPropertyStorage() {}
/**
* @brief PIPropertyStorage element.
*/
struct PIP_EXPORT Property { struct PIP_EXPORT Property {
Property(const PIString & n = PIString(), const PIString & c = PIString(), const PIVariant & v = PIVariant(), int f = 0):
name(n), comment(c), value(v), flags(f) {} //! \~english Contructs %PIPropertyStorage::Property with name "n", comment "c", value "v" and flags "f"
Property(const Property & o): //! \~russian Создает %PIPropertyStorage::Property с именем "n", комментарием "c", значением "v" и флагами "f"
name(o.name), comment(o.comment), value(o.value), flags(o.flags) {} Property(const PIString & n = PIString(), const PIString & c = PIString(), const PIVariant & v = PIVariant(), int f = 0): name(n), comment(c), value(v), flags(f) {}
//! \~english Contructs copy of another %PIPropertyStorage::Property "o"
//! \~russian Создает копию %PIPropertyStorage::Property "o"
Property(const Property & o): name(o.name), comment(o.comment), value(o.value), flags(o.flags) {}
Property(Property && o) {swap(o);} Property(Property && o) {swap(o);}
//! \~english Assign operator
//! \~russian Оператор присваивания
Property & operator =(const Property & v) { Property & operator =(const Property & v) {
name = v.name; name = v.name;
comment = v.comment; comment = v.comment;
@@ -56,10 +59,24 @@ public:
Property & operator =(Property && v) {swap(v); return *this;} Property & operator =(Property && v) {swap(v); return *this;}
//! \~english Returns value as boolean
//! \~russian Возвращает значение как логическое
bool toBool() const {return value.toBool();} bool toBool() const {return value.toBool();}
//! \~english Returns value as integer
//! \~russian Возвращает значение как целое
int toInt() const {return value.toInt();} int toInt() const {return value.toInt();}
//! \~english Returns value as float
//! \~russian Возвращает значение как float
float toFloat() const {return value.toFloat();} float toFloat() const {return value.toFloat();}
//! \~english Returns value as double
//! \~russian Возвращает значение как double
double toDouble() const {return value.toDouble();} double toDouble() const {return value.toDouble();}
//! \~english Returns value as string
//! \~russian Возвращает значение как строку
PIString toString() const {return value.toString();} PIString toString() const {return value.toString();}
void swap(Property & o) { void swap(Property & o) {
@@ -69,22 +86,30 @@ public:
piSwap(flags, o.flags); piSwap(flags, o.flags);
} }
/*! Uniqueue id of property */ //! \~english Property name (uniqueue for %PIPropertyStorage)
//! \~russian Имя свойства (уникальное для %PIPropertyStorage)
PIString name; PIString name;
/*! Optional description of property */ //! \~english Optional description of property
//! \~russian Опциональный комментарий свойства
PIString comment; PIString comment;
/*! Custom value of property */ //! \~english Property value
//! \~russian Значение свойства
PIVariant value; PIVariant value;
/*! Abstract flags which may be used for user needs */ //! \~english Abstract flags which may be used for user needs
//! \~russian Абстрактные флаги, могут быть использованы для своих нужд
int flags; int flags;
}; };
//! \~english Contructs %PIPropertyStorage with "pl" properties
//! \~russian Создает %PIPropertyStorage со свойствами "pl"
PIPropertyStorage(const PIVector<Property> & pl) {props = pl;} PIPropertyStorage(const PIVector<Property> & pl) {props = pl;}
PIPropertyStorage(PIVector<Property> && pl): props(std::move(pl)) {} //! \~english Contructs %PIPropertyStorage from another "o"
//! \~russian Создает %PIPropertyStorage из другого "o"
PIPropertyStorage(PIVector<Property> && o): props(std::move(o)) {}
typedef PIVector<Property>::const_iterator const_iterator; typedef PIVector<Property>::const_iterator const_iterator;
typedef PIVector<Property>::iterator iterator; typedef PIVector<Property>::iterator iterator;
@@ -95,115 +120,140 @@ public:
iterator end() {return props.end();} iterator end() {return props.end();}
const_iterator end() const {return props.end();} const_iterator end() const {return props.end();}
//! \~english Returns properties count
//! \~russian Возвращает количество свойств
int length() const {return props.length();} int length() const {return props.length();}
//! \~english Returns properties count
//! \~russian Возвращает количество свойств
int size() const {return props.size();} int size() const {return props.size();}
//! \~english Returns if no properties
//! \~russian Возвращает нет ли свойств
bool isEmpty() const {return props.isEmpty();} bool isEmpty() const {return props.isEmpty();}
//! \~english Returns if properties
//! \~russian Возвращает есть ли свойства
bool isNotEmpty() const {return props.isNotEmpty();}
//! \~english Returns first property
//! \~russian Возвращает первое свойство
Property & front() {return props.front();} Property & front() {return props.front();}
//! \~english Returns first property as const
//! \~russian Возвращает первое свойство как константу
const Property & front() const {return props.front();} const Property & front() const {return props.front();}
//! \~english Returns last property
//! \~russian Возвращает последнее свойство
Property & back() {return props.back();} Property & back() {return props.back();}
//! \~english Returns last property as const
//! \~russian Возвращает последнее свойство как константу
const Property & back() const {return props.back();} const Property & back() const {return props.back();}
//! \~english Remove property at index "i"
//! \~russian Удаляет свойство по индексу "i"
void removeAt(int i) {props.remove(i);} void removeAt(int i) {props.remove(i);}
//! \~english Remove all properties
//! \~russian Удаляет все свойства
void clear() {props.clear();} void clear() {props.clear();}
//! \~english Returns copy of this %PIPropertyStorage
//! \~russian Возвращает копию этого %PIPropertyStorage
PIPropertyStorage copy() const {return PIPropertyStorage(*this);} PIPropertyStorage copy() const {return PIPropertyStorage(*this);}
//! \~english Returns properties count
//! \~russian Возвращает количество свойств
int propertiesCount() const {return props.size();} int propertiesCount() const {return props.size();}
//! \~english Returns properties as PIVector
//! \~russian Возвращает свойства как PIVector
PIVector<Property> & properties() {return props;} PIVector<Property> & properties() {return props;}
//! \~english Returns properties as const PIVector
//! \~russian Возвращает свойства как константный PIVector
const PIVector<Property> & properties() const {return props;} const PIVector<Property> & properties() const {return props;}
const PIPropertyStorage & propertyStorage() const {return *this;} const PIPropertyStorage & propertyStorage() const {return *this;}
/** //! \~english Returns if properties with name "name" exists
* @brief Check if property with \a name exists //! \~russian Возвращает присутствует ли свойство с именем "name"
* @return "true" if property exists bool isPropertyExists(const PIString & name) const;
*/
bool isPropertyExists(const PIString & _name) const;
/** //! \~english Remove all properties
* @brief Remove all properties //! \~russian Удаляет все свойства
*/
void clearProperties() {props.clear();} void clearProperties() {props.clear();}
/** //! \~english Add property if name isn't present in storage, otherwrise update existing property with same name
* @brief Add property if name isn't present in storage, otherwrise update existing property with same name. //! \~russian Добавляет новое свойство, если его имени не было в контейнере, иначе обновляет существующее свойство с этим именем
* @return "true" if new property added, else if update existing property return "false"
* @param p to copy in storage
*/
bool addProperty(const Property & p); bool addProperty(const Property & p);
bool addProperty(Property && p); bool addProperty(Property && p);
/** //! \~english Add property if name isn't present in storage, otherwrise update existing property with same name
* @brief First of all construct Property with method params. After then add property if name isn't present //! \~russian Добавляет новое свойство, если его имени не было в контейнере, иначе обновляет существующее свойство с этим именем
* in storage, otherwrise update existing property with same name.
* @return "true" if new property added, else if update existing property return "false"
*/
bool addProperty(const PIString & _name, const PIVariant & _def_value, const PIString & _comment = PIString(), int _flags = 0); bool addProperty(const PIString & _name, const PIVariant & _def_value, const PIString & _comment = PIString(), int _flags = 0);
/** //! \~english Remove property with name "name", returns if property removed
* @brief Remove property with \a name //! \~russian Удаляет свойство с именем "name", возвращает было ли оно удалено
* @return "true" if property exists and removed bool removeProperty(const PIString & name);
*/
bool removeProperty(const PIString & _name);
/** //! \~english Remove all properties with flag "flag" set, returns removed properties count
* @brief Remove properties wich has \a flag set //! \~russian Удаляет все свойства с флагом "flag", возвращает количество удаленных свойств
* @return removed properties count
*/
int removePropertiesByFlag(int flag); int removePropertiesByFlag(int flag);
/** //! \~english Merge other "properties" into this
* @brief Merge other \a properties_ into this //! \~russian Объединяет "properties" с текущим контейнером
* @param flag_ignore - properties wich has this flag set will be ignored in merge void updateProperties(const PIVector<Property> & properties, int flag_ignore = 0);
*/
void updateProperties(const PIVector<Property> & properties_, int flag_ignore = 0);
/** //! \~english Returns property with name "name" or default-constructed %PIPropertyStorage::Property
* @brief Search property by name and return it. //! \~russian Возвращает свойство с именем "name" или пустое %PIPropertyStorage::Property
*
* @param name of property
* @return property value or default constructed Property
*/
Property propertyByName(const PIString & name) const; Property propertyByName(const PIString & name) const;
/** //! \~english Returns property value with name "name" or invalid %PIVariant
* @brief Search property by name and return property value. //! \~russian Возвращает значение свойства с именем "name" или недействительный %PIVariant
*
* @param name of property
* @return property value or invalid PIVariant if name unknown
*/
PIVariant propertyValueByName(const PIString & name) const; PIVariant propertyValueByName(const PIString & name) const;
/** //! \~english Set value of property with name "name" to "value", returns if property exists
* @brief Set value of property with specific name if name is present in storage. //! \~russian Устанавливает значение "value" свойству с именем "name", возвращает существует ли такое свойство
*
* @param name of property to set value
* @param value to set
* @return "true" if property exists and updated
*/
bool setPropertyValue(const PIString & name, const PIVariant & value); bool setPropertyValue(const PIString & name, const PIVariant & value);
/** //! \~english Set comment of property with name "name" to "comment", returns if property exists
* @brief Set comment of property with specific name if name is present in storage. //! \~russian Устанавливает комментарий "comment" свойству с именем "name", возвращает существует ли такое свойство
*
* @param name of property to set comment
* @param comment to set
* @return "true" if property exists and updated
*/
bool setPropertyComment(const PIString & name, const PIString & comment); bool setPropertyComment(const PIString & name, const PIString & comment);
/** //! \~english Set flags of property with name "name" to "flags", returns if property exists
* @brief Set flags of property with specific name if name is present in storage. //! \~russian Устанавливает флаги "flags" свойству с именем "name", возвращает существует ли такое свойство
*
* @param name of property to set flags
* @param flags to set
* @return "true" if property exists and updated
*/
bool setPropertyFlags(const PIString & name, int flags); bool setPropertyFlags(const PIString & name, int flags);
//! \~english Add property "p"
//! \~russian Добавляет свойство "p"
PIPropertyStorage & operator <<(const PIPropertyStorage::Property & p) {props << p; return *this;} PIPropertyStorage & operator <<(const PIPropertyStorage::Property & p) {props << p; return *this;}
//! \~english Add properties "p"
//! \~russian Добавляет свойства "p"
PIPropertyStorage & operator <<(const PIVector<Property> & p) {props << p; return *this;} PIPropertyStorage & operator <<(const PIVector<Property> & p) {props << p; return *this;}
//! \~english Add properties "p"
//! \~russian Добавляет свойства "p"
PIPropertyStorage & operator <<(const PIPropertyStorage & p) {props << p.props; return *this;} PIPropertyStorage & operator <<(const PIPropertyStorage & p) {props << p.props; return *this;}
//! \~english Returns property with index "i"
//! \~russian Возвращает свойство по индексу "i"
Property & operator[](int i) {return props[i];} Property & operator[](int i) {return props[i];}
//! \~english Returns property with index "i" as const
//! \~russian Возвращает свойство по индексу "i" как константу
const Property & operator[](int i) const {return props[i];} const Property & operator[](int i) const {return props[i];}
//! \~english Returns property with name "name"
//! \~russian Возвращает свойство с именем "name"
Property & operator[](const PIString & name); Property & operator[](const PIString & name);
//! \~english Returns property with name "name" as const
//! \~russian Возвращает свойство с именем "name" как константу
const Property operator[](const PIString & name) const; const Property operator[](const PIString & name) const;
static Property parsePropertyLine(PIString l); static Property parsePropertyLine(PIString l);

View File

@@ -36,7 +36,7 @@
#endif #endif
/*! \class PIString /*! \class PIString
* @brief String class * \brief String class
* \details PIP use this class for use string information. * \details PIP use this class for use string information.
* *
* \section PIString_sec0 Synopsis * \section PIString_sec0 Synopsis
@@ -72,7 +72,7 @@
/*! \fn int versionCompare(const PIString & v0, const PIString & v1, int components = 6) /*! \fn int versionCompare(const PIString & v0, const PIString & v1, int components = 6)
* \relatesalso PIString * \relatesalso PIString
* @brief Compare two version strings in free notation and returns 0, -1 or 1 * \brief Compare two version strings in free notation and returns 0, -1 or 1
* \details This function parse version to number codes and labels. Then it * \details This function parse version to number codes and labels. Then it
* compare no more than "components" codes. If there is no difference, compare * compare no more than "components" codes. If there is no difference, compare
* labels. Each label has corresponding integer value, so * labels. Each label has corresponding integer value, so
@@ -95,7 +95,7 @@
* *
* \fn PIString versionNormalize(const PIString & v) * \fn PIString versionNormalize(const PIString & v)
* \relatesalso PIString * \relatesalso PIString
* @brief Converts version string in free notation to classic view * \brief Converts version string in free notation to classic view
* \details Parse version as described in \a versionCompare() and * \details Parse version as described in \a versionCompare() and
* returns classic view of codes and labels: major.minor.revision[-build][_label]. * returns classic view of codes and labels: major.minor.revision[-build][_label].
* Example: * Example:

View File

@@ -1,5 +1,5 @@
/*! @file pistring.h /*! \file pistring.h
* @brief String * \brief String
* *
* This file declare string and string list classes * This file declare string and string list classes
*/ */
@@ -59,12 +59,12 @@ public:
PIString(const PIChar c): PIDeque<PIChar>() {*this += c;} PIString(const PIChar c): PIDeque<PIChar>() {*this += c;}
PIString(const char c): PIDeque<PIChar>() {*this += PIChar(c);} PIString(const char c): PIDeque<PIChar>() {*this += PIChar(c);}
/*! @brief Contructs string from c-string "str" /*! \brief Contructs string from c-string "str"
* \details "str" should be null-terminated\n * \details "str" should be null-terminated\n
* Example: \snippet pistring.cpp PIString(char * ) */ * Example: \snippet pistring.cpp PIString(char * ) */
PIString(const char * str): PIDeque<PIChar>() {*this += str;} PIString(const char * str): PIDeque<PIChar>() {*this += str;}
/*! @brief Contructs string from \c wchar_t c-string "str" /*! \brief Contructs string from \c wchar_t c-string "str"
* \details "str" should be null-terminated\n * \details "str" should be null-terminated\n
* Example: \snippet pistring.cpp PIString(wchar_t * ) */ * Example: \snippet pistring.cpp PIString(wchar_t * ) */
PIString(const wchar_t * str): PIDeque<PIChar>() {*this += str;} PIString(const wchar_t * str): PIDeque<PIChar>() {*this += str;}
@@ -72,18 +72,18 @@ public:
//! Contructs string from byte array "ba" //! Contructs string from byte array "ba"
PIString(const PIByteArray & ba): PIDeque<PIChar>() {*this += ba;} PIString(const PIByteArray & ba): PIDeque<PIChar>() {*this += ba;}
//! @brief Contructs string from "len" characters of buffer "str" //! \brief Contructs string from "len" characters of buffer "str"
PIString(const PIChar * str, const int len): PIDeque<PIChar>(str, size_t(len)) {} PIString(const PIChar * str, const int len): PIDeque<PIChar>(str, size_t(len)) {}
/*! @brief Contructs string from "len" characters of buffer "str" /*! \brief Contructs string from "len" characters of buffer "str"
* \details Example: \snippet pistring.cpp PIString(char * , int) */ * \details Example: \snippet pistring.cpp PIString(char * , int) */
PIString(const char * str, const int len): PIDeque<PIChar>() {appendFromChars(str, len);} PIString(const char * str, const int len): PIDeque<PIChar>() {appendFromChars(str, len);}
/*! @brief Contructs string as sequence of characters "c" of buffer with length "len" /*! \brief Contructs string as sequence of characters "c" of buffer with length "len"
* \details Example: \snippet pistring.cpp PIString(int, char) */ * \details Example: \snippet pistring.cpp PIString(int, char) */
PIString(const int len, const char c): PIDeque<PIChar>() {for (int i = 0; i < len; ++i) push_back(c);} PIString(const int len, const char c): PIDeque<PIChar>() {for (int i = 0; i < len; ++i) push_back(c);}
/*! @brief Contructs string as sequence of symbols "c" of buffer with length "len" /*! \brief Contructs string as sequence of symbols "c" of buffer with length "len"
* \details Example: \snippet pistring.cpp PIString(int, PIChar) */ * \details Example: \snippet pistring.cpp PIString(int, PIChar) */
PIString(const int len, const PIChar c): PIDeque<PIChar>() {for (int i = 0; i < len; ++i) push_back(c);} PIString(const int len, const PIChar c): PIDeque<PIChar>() {for (int i = 0; i < len; ++i) push_back(c);}
@@ -148,32 +148,32 @@ public:
//! Compare operator //! Compare operator
bool operator >=(const char * str) const {return *this >= PIString(str);} bool operator >=(const char * str) const {return *this >= PIString(str);}
/*! @brief Append string "str" at the end of string /*! \brief Append string "str" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(PIString) */ * \details Example: \snippet pistring.cpp PIString::<<(PIString) */
PIString & operator <<(const PIString & str) {*this += str; return *this;} PIString & operator <<(const PIString & str) {*this += str; return *this;}
/*! @brief Append symbol "c" at the end of string /*! \brief Append symbol "c" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(PIChar) */ * \details Example: \snippet pistring.cpp PIString::<<(PIChar) */
PIString & operator <<(const PIChar c) {*this += c; return *this;} PIString & operator <<(const PIChar c) {*this += c; return *this;}
/*! @brief Append symbol "c" at the end of string /*! \brief Append symbol "c" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(PIChar) */ * \details Example: \snippet pistring.cpp PIString::<<(PIChar) */
PIString & operator <<(const char c) {*this += PIChar(c); return *this;} PIString & operator <<(const char c) {*this += PIChar(c); return *this;}
/*! @brief Append c-string "str" at the end of string /*! \brief Append c-string "str" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(char * ) */ * \details Example: \snippet pistring.cpp PIString::<<(char * ) */
PIString & operator <<(const char * str) {*this += str; return *this;} PIString & operator <<(const char * str) {*this += str; return *this;}
/*! @brief Append \c wchar_t c-string "str" at the end of string /*! \brief Append \c wchar_t c-string "str" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(wchar_t * ) */ * \details Example: \snippet pistring.cpp PIString::<<(wchar_t * ) */
PIString & operator <<(const wchar_t * str) {*this += str; return *this;} PIString & operator <<(const wchar_t * str) {*this += str; return *this;}
/*! @brief Append string representation of "num" at the end of string /*! \brief Append string representation of "num" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(int) */ * \details Example: \snippet pistring.cpp PIString::<<(int) */
PIString & operator <<(const int & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const int & num) {*this += PIString::fromNumber(num); return *this;}
PIString & operator <<(const uint & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const uint & num) {*this += PIString::fromNumber(num); return *this;}
/*! @brief Append string representation of "num" at the end of string /*! \brief Append string representation of "num" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(int) */ * \details Example: \snippet pistring.cpp PIString::<<(int) */
PIString & operator <<(const long & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const long & num) {*this += PIString::fromNumber(num); return *this;}
PIString & operator <<(const ulong & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const ulong & num) {*this += PIString::fromNumber(num); return *this;}
@@ -181,101 +181,101 @@ public:
PIString & operator <<(const llong & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const llong & num) {*this += PIString::fromNumber(num); return *this;}
PIString & operator <<(const ullong & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const ullong & num) {*this += PIString::fromNumber(num); return *this;}
/*! @brief Append string representation of "num" at the end of string /*! \brief Append string representation of "num" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(int) */ * \details Example: \snippet pistring.cpp PIString::<<(int) */
PIString & operator <<(const float & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const float & num) {*this += PIString::fromNumber(num); return *this;}
/*! @brief Append string representation of "num" at the end of string /*! \brief Append string representation of "num" at the end of string
* \details Example: \snippet pistring.cpp PIString::<<(int) */ * \details Example: \snippet pistring.cpp PIString::<<(int) */
PIString & operator <<(const double & num) {*this += PIString::fromNumber(num); return *this;} PIString & operator <<(const double & num) {*this += PIString::fromNumber(num); return *this;}
//! @brief Insert string "str" at the begin of string //! \brief Insert string "str" at the begin of string
PIString & prepend(const PIString & str) {insert(0, str); return *this;} PIString & prepend(const PIString & str) {insert(0, str); return *this;}
//! @brief Insert string "str" at the end of string //! \brief Insert string "str" at the end of string
PIString & append(const PIString & str) {*this += str; return *this;} PIString & append(const PIString & str) {*this += str; return *this;}
/*! @brief Return part of string from symbol at index "start" and maximum length "len" /*! \brief Return part of string from symbol at index "start" and maximum length "len"
* \details All variants demonstrated in example: \snippet pistring.cpp PIString::mid * \details All variants demonstrated in example: \snippet pistring.cpp PIString::mid
* \sa \a left(), \a right() */ * \sa \a left(), \a right() */
PIString mid(const int start, const int len = -1) const; PIString mid(const int start, const int len = -1) const;
/*! @brief Return sub-string of string from symbol at index "start" and maximum length "len" */ /*! \brief Return sub-string of string from symbol at index "start" and maximum length "len" */
PIString subString(const int start, const int len = -1) const {return mid(start, len);} PIString subString(const int start, const int len = -1) const {return mid(start, len);}
/*! @brief Return part of string from left and maximum length "len" /*! \brief Return part of string from left and maximum length "len"
* \details Example: \snippet pistring.cpp PIString::left * \details Example: \snippet pistring.cpp PIString::left
* \sa \a mid(), \a right() */ * \sa \a mid(), \a right() */
PIString left(const int len) const {return len <= 0 ? PIString() : mid(0, len);} PIString left(const int len) const {return len <= 0 ? PIString() : mid(0, len);}
/*! @brief Return part of string from right and maximum length "len" /*! \brief Return part of string from right and maximum length "len"
* \details Example: \snippet pistring.cpp PIString::right * \details Example: \snippet pistring.cpp PIString::right
* \sa \a mid(), \a left() */ * \sa \a mid(), \a left() */
PIString right(const int len) const {return len <= 0 ? PIString() : mid(size() - len, len);} PIString right(const int len) const {return len <= 0 ? PIString() : mid(size() - len, len);}
/*! @brief Remove part of string from symbol as index "start" and maximum length "len" /*! \brief Remove part of string from symbol as index "start" and maximum length "len"
* and return this string * and return this string
* \details All variants demonstrated in example: \snippet pistring.cpp PIString::cutMid * \details All variants demonstrated in example: \snippet pistring.cpp PIString::cutMid
* \sa \a cutLeft(), \a cutRight() */ * \sa \a cutLeft(), \a cutRight() */
PIString & cutMid(const int start, const int len); PIString & cutMid(const int start, const int len);
/*! @brief Remove part of string from left and maximum length "len" and return this string /*! \brief Remove part of string from left and maximum length "len" and return this string
* \details Example: \snippet pistring.cpp PIString::cutLeft * \details Example: \snippet pistring.cpp PIString::cutLeft
* \sa \a cutMid(), \a cutRight() */ * \sa \a cutMid(), \a cutRight() */
PIString & cutLeft(const int len) {return len <= 0 ? *this : cutMid(0, len);} PIString & cutLeft(const int len) {return len <= 0 ? *this : cutMid(0, len);}
/*! @brief Remove part of string from right and maximum length "len" and return this string /*! \brief Remove part of string from right and maximum length "len" and return this string
* \details Example: \snippet pistring.cpp PIString::cutRight * \details Example: \snippet pistring.cpp PIString::cutRight
* \sa \a cutMid(), \a cutLeft() */ * \sa \a cutMid(), \a cutLeft() */
PIString & cutRight(const int len) {return len <= 0 ? *this : cutMid(size() - len, len);} PIString & cutRight(const int len) {return len <= 0 ? *this : cutMid(size() - len, len);}
/*! @brief Remove spaces at the start and at the end of string and return this string /*! \brief Remove spaces at the start and at the end of string and return this string
* \details Example: \snippet pistring.cpp PIString::trim * \details Example: \snippet pistring.cpp PIString::trim
* \sa \a trimmed() */ * \sa \a trimmed() */
PIString & trim(); PIString & trim();
/*! @brief Return copy of this string without spaces at the start and at the end /*! \brief Return copy of this string without spaces at the start and at the end
* \details Example: \snippet pistring.cpp PIString::trimmed * \details Example: \snippet pistring.cpp PIString::trimmed
* \sa \a trim() */ * \sa \a trim() */
PIString trimmed() const; PIString trimmed() const;
/*! @brief Replace part of string from index "from" and maximum length "len" /*! \brief Replace part of string from index "from" and maximum length "len"
* with string "with" and return this string * with string "with" and return this string
* \details Example: \snippet pistring.cpp PIString::replace_0 * \details Example: \snippet pistring.cpp PIString::replace_0
* \sa \a replaced(), \a replaceAll() */ * \sa \a replaced(), \a replaceAll() */
PIString & replace(const int from, const int count, const PIString & with); PIString & replace(const int from, const int count, const PIString & with);
/*! @brief Replace part copy of this string from index "from" and maximum length "len" /*! \brief Replace part copy of this string from index "from" and maximum length "len"
* with string "with" and return copied string * with string "with" and return copied string
* \details Example: \snippet pistring.cpp PIString::replaced_0 * \details Example: \snippet pistring.cpp PIString::replaced_0
* \sa \a replace(), \a replaceAll() */ * \sa \a replace(), \a replaceAll() */
PIString replaced(const int from, const int count, const PIString & with) const {PIString str(*this); str.replace(from, count, with); return str;} PIString replaced(const int from, const int count, const PIString & with) const {PIString str(*this); str.replace(from, count, with); return str;}
/*! @brief Replace first founded substring "what" with string "with" and return this string /*! \brief Replace first founded substring "what" with string "with" and return this string
* \details If "ok" is not null, it set to "true" if something was replaced\n * \details If "ok" is not null, it set to "true" if something was replaced\n
* Example: \snippet pistring.cpp PIString::replace_1 * Example: \snippet pistring.cpp PIString::replace_1
* \sa \a replaced(), \a replaceAll() */ * \sa \a replaced(), \a replaceAll() */
PIString & replace(const PIString & what, const PIString & with, bool * ok = 0); PIString & replace(const PIString & what, const PIString & with, bool * ok = 0);
/*! @brief Replace first founded substring "what" with string "with" and return copied string /*! \brief Replace first founded substring "what" with string "with" and return copied string
* \details If "ok" is not null, it set to "true" if something was replaced\n * \details If "ok" is not null, it set to "true" if something was replaced\n
* Example: \snippet pistring.cpp PIString::replaced_1 * Example: \snippet pistring.cpp PIString::replaced_1
* \sa \a replaced(), \a replaceAll() */ * \sa \a replaced(), \a replaceAll() */
PIString replaced(const PIString & what, const PIString & with, bool * ok = 0) const {PIString str(*this); str.replace(what, with, ok); return str;} PIString replaced(const PIString & what, const PIString & with, bool * ok = 0) const {PIString str(*this); str.replace(what, with, ok); return str;}
/*! @brief Replace all founded substrings "what" with strings "with" and return this string /*! \brief Replace all founded substrings "what" with strings "with" and return this string
* \details Example: \snippet pistring.cpp PIString::replaceAll * \details Example: \snippet pistring.cpp PIString::replaceAll
* \sa \a replace(), \a replaced() */ * \sa \a replace(), \a replaced() */
PIString & replaceAll(const PIString & what, const PIString & with); PIString & replaceAll(const PIString & what, const PIString & with);
/*! @brief Replace all founded substrings "what" with symbol "with" and return this string /*! \brief Replace all founded substrings "what" with symbol "with" and return this string
* \details Example: \snippet pistring.cpp PIString::replaceAll * \details Example: \snippet pistring.cpp PIString::replaceAll
* \sa \a replace(), \a replaced() */ * \sa \a replace(), \a replaced() */
PIString & replaceAll(const PIString & what, const char with); PIString & replaceAll(const PIString & what, const char with);
/*! @brief Replace all founded symbols "what" with symbol "with" and return this string /*! \brief Replace all founded symbols "what" with symbol "with" and return this string
* \details Example: \snippet pistring.cpp PIString::replaceAll * \details Example: \snippet pistring.cpp PIString::replaceAll
* \sa \a replace(), \a replaced() */ * \sa \a replace(), \a replaced() */
PIString & replaceAll(const char what, const char with); PIString & replaceAll(const char what, const char with);
@@ -288,119 +288,119 @@ public:
PIString & removeAll(char c) {PIDeque<PIChar>::removeAll(PIChar(c)); return *this;} PIString & removeAll(char c) {PIDeque<PIChar>::removeAll(PIChar(c)); return *this;}
/*! @brief Repeat content of string "times" times and return this string /*! \brief Repeat content of string "times" times and return this string
* \details Example: \snippet pistring.cpp PIString::repeat */ * \details Example: \snippet pistring.cpp PIString::repeat */
PIString & repeat(int times) {PIString ss(*this); times--; piForTimes (times) *this += ss; return *this;} PIString & repeat(int times) {PIString ss(*this); times--; piForTimes (times) *this += ss; return *this;}
/*! @brief Returns repeated "times" times string /*! \brief Returns repeated "times" times string
* \details Example: \snippet pistring.cpp PIString::repeated */ * \details Example: \snippet pistring.cpp PIString::repeated */
PIString repeated(int times) const {PIString ss(*this); return ss.repeat(times);} PIString repeated(int times) const {PIString ss(*this); return ss.repeat(times);}
/*! @brief Insert symbol "c" after index "index" and return this string /*! \brief Insert symbol "c" after index "index" and return this string
* \details Example: \snippet pistring.cpp PIString::insert_0 */ * \details Example: \snippet pistring.cpp PIString::insert_0 */
PIString & insert(const int index, const PIChar c) {PIDeque<PIChar>::insert(index, c); return *this;} PIString & insert(const int index, const PIChar c) {PIDeque<PIChar>::insert(index, c); return *this;}
/*! @brief Insert symbol "c" after index "index" and return this string /*! \brief Insert symbol "c" after index "index" and return this string
* \details Example: \snippet pistring.cpp PIString::insert_1 */ * \details Example: \snippet pistring.cpp PIString::insert_1 */
PIString & insert(const int index, const char c) {return insert(index, PIChar(c));} PIString & insert(const int index, const char c) {return insert(index, PIChar(c));}
/*! @brief Insert string "str" after index "index" and return this string /*! \brief Insert string "str" after index "index" and return this string
* \details Example: \snippet pistring.cpp PIString::insert_2 */ * \details Example: \snippet pistring.cpp PIString::insert_2 */
PIString & insert(const int index, const PIString & str); PIString & insert(const int index, const PIString & str);
/*! @brief Insert string "str" after index "index" and return this string /*! \brief Insert string "str" after index "index" and return this string
* \details Example: \snippet pistring.cpp PIString::insert_2 */ * \details Example: \snippet pistring.cpp PIString::insert_2 */
PIString & insert(const int index, const char * c) {return insert(index, PIString(c));} PIString & insert(const int index, const char * c) {return insert(index, PIString(c));}
/*! @brief Enlarge string to length "len" by addition sequence of symbols /*! \brief Enlarge string to length "len" by addition sequence of symbols
* "c" at the end of string, and return this string * "c" at the end of string, and return this string
* \details Example: \snippet pistring.cpp PIString::expandRightTo * \details Example: \snippet pistring.cpp PIString::expandRightTo
* \sa \a expandLeftTo() */ * \sa \a expandLeftTo() */
PIString & expandRightTo(const int len, const PIChar c) {if (len > length()) resize(len, c); return *this;} PIString & expandRightTo(const int len, const PIChar c) {if (len > length()) resize(len, c); return *this;}
/*! @brief Enlarge string to length "len" by addition sequence of symbols /*! \brief Enlarge string to length "len" by addition sequence of symbols
* "c" at the beginning of string, and return this string * "c" at the beginning of string, and return this string
* \details Example: \snippet pistring.cpp PIString::expandLeftTo * \details Example: \snippet pistring.cpp PIString::expandLeftTo
* \sa \a expandRightTo() */ * \sa \a expandRightTo() */
PIString & expandLeftTo(const int len, const PIChar c) {if (len > length()) insert(0, PIString(len - length(), c)); return *this;} PIString & expandLeftTo(const int len, const PIChar c) {if (len > length()) insert(0, PIString(len - length(), c)); return *this;}
/*! @brief Enlarge and returns copy of this string to length "len" /*! \brief Enlarge and returns copy of this string to length "len"
* by addition sequence of symbols "c" at the end of string * by addition sequence of symbols "c" at the end of string
* \sa \a expandRightTo() */ * \sa \a expandRightTo() */
PIString expandedRightTo(const int len, const PIChar c) const {return PIString(*this).expandRightTo(len, c);} PIString expandedRightTo(const int len, const PIChar c) const {return PIString(*this).expandRightTo(len, c);}
/*! @brief Enlarge and returns copy of this string to length "len" /*! \brief Enlarge and returns copy of this string to length "len"
* by addition sequence of symbols "c" at the beginning of string * by addition sequence of symbols "c" at the beginning of string
* \sa \a expandLeftTo() */ * \sa \a expandLeftTo() */
PIString expandedLeftTo(const int len, const PIChar c) const {return PIString(*this).expandLeftTo(len, c);} PIString expandedLeftTo(const int len, const PIChar c) const {return PIString(*this).expandLeftTo(len, c);}
/*! @brief Add "c" symbols at the beginning and end of the string, and return this string /*! \brief Add "c" symbols at the beginning and end of the string, and return this string
* \sa \a quoted() */ * \sa \a quoted() */
PIString & quote(PIChar c = PIChar('"')) {insert(0, c); *this += c; return *this;} PIString & quote(PIChar c = PIChar('"')) {insert(0, c); *this += c; return *this;}
/*! @brief Return quoted copy of this string /*! \brief Return quoted copy of this string
* \sa \a quote() */ * \sa \a quote() */
PIString quoted(PIChar c = PIChar('"')) {return PIString(*this).quote(c);} PIString quoted(PIChar c = PIChar('"')) {return PIString(*this).quote(c);}
/*! @brief Reverse string and return this string /*! \brief Reverse string and return this string
* \details Example: \snippet pistring.cpp PIString::reverse * \details Example: \snippet pistring.cpp PIString::reverse
* \sa \a reversed() */ * \sa \a reversed() */
PIString & reverse() {PIString str(*this); clear(); piForeachCR (PIChar c, str) push_back(c); return *this;} PIString & reverse() {PIString str(*this); clear(); piForeachCR (PIChar c, str) push_back(c); return *this;}
/*! @brief Reverse copy of this string and return it /*! \brief Reverse copy of this string and return it
* \details Example: \snippet pistring.cpp PIString::reversed * \details Example: \snippet pistring.cpp PIString::reversed
* \sa \a reverse() */ * \sa \a reverse() */
PIString reversed() const {PIString str(*this); str.reverse(); return str;} PIString reversed() const {PIString str(*this); str.reverse(); return str;}
/*! @brief Elide string to maximum size \"size\" and return this string /*! \brief Elide string to maximum size \"size\" and return this string
* \sa \a elided() */ * \sa \a elided() */
PIString & elide(int size, float pos = ElideCenter); PIString & elide(int size, float pos = ElideCenter);
/*! @brief Elide copy of this string to maximum size \"size\" and return it /*! \brief Elide copy of this string to maximum size \"size\" and return it
* \details Example: \snippet pistring.cpp PIString::elided * \details Example: \snippet pistring.cpp PIString::elided
* \sa \a elide() */ * \sa \a elide() */
PIString elided(int size, float pos = ElideCenter) const {PIString str(*this); str.elide(size, pos); return str;} PIString elided(int size, float pos = ElideCenter) const {PIString str(*this); str.elide(size, pos); return str;}
/*! @brief Take a part of string from symbol at index "start" and maximum length "len" and return it /*! \brief Take a part of string from symbol at index "start" and maximum length "len" and return it
* \sa \a takeLeft, \a takeRight() */ * \sa \a takeLeft, \a takeRight() */
PIString takeMid(const int start, const int len = -1) {PIString ret(mid(start, len)); cutMid(start, len); return ret;} PIString takeMid(const int start, const int len = -1) {PIString ret(mid(start, len)); cutMid(start, len); return ret;}
/*! @brief Take a part from the begin of string with maximum length "len" and return it /*! \brief Take a part from the begin of string with maximum length "len" and return it
* \sa \a takeMid(), \a takeRight() */ * \sa \a takeMid(), \a takeRight() */
PIString takeLeft(const int len) {PIString ret(left(len)); cutLeft(len); return ret;} PIString takeLeft(const int len) {PIString ret(left(len)); cutLeft(len); return ret;}
/*! @brief Take a part from the end of string with maximum length "len" and return it /*! \brief Take a part from the end of string with maximum length "len" and return it
* \sa \a takeMid(), \a takeLeft() */ * \sa \a takeMid(), \a takeLeft() */
PIString takeRight(const int len) {PIString ret(right(len)); cutRight(len); return ret;} PIString takeRight(const int len) {PIString ret(right(len)); cutRight(len); return ret;}
/*! @brief Take a symbol from the begin of this string and return it /*! \brief Take a symbol from the begin of this string and return it
* \details Example: \snippet pistring.cpp PIString::takeSymbol * \details Example: \snippet pistring.cpp PIString::takeSymbol
* \sa \a takeWord(), \a takeCWord(), \a takeLine(), \a takeNumber(), \a takeRange() */ * \sa \a takeWord(), \a takeCWord(), \a takeLine(), \a takeNumber(), \a takeRange() */
PIString takeSymbol(); PIString takeSymbol();
/*! @brief Take a word from the begin of this string and return it /*! \brief Take a word from the begin of this string and return it
* \details Example: \snippet pistring.cpp PIString::takeWord * \details Example: \snippet pistring.cpp PIString::takeWord
* \sa \a takeSymbol(), \a takeCWord(), \a takeLine(), \a takeNumber(), \a takeRange() */ * \sa \a takeSymbol(), \a takeCWord(), \a takeLine(), \a takeNumber(), \a takeRange() */
PIString takeWord(); PIString takeWord();
/*! @brief Take a word with letters, numbers and '_' symbols from the /*! \brief Take a word with letters, numbers and '_' symbols from the
* begin of this string and return it * begin of this string and return it
* \details Example: \snippet pistring.cpp PIString::takeCWord * \details Example: \snippet pistring.cpp PIString::takeCWord
* \sa \a takeSymbol(), \a takeWord(), \a takeLine(), \a takeNumber(), \a takeRange() */ * \sa \a takeSymbol(), \a takeWord(), \a takeLine(), \a takeNumber(), \a takeRange() */
PIString takeCWord(); PIString takeCWord();
/*! @brief Take a line from the begin of this string and return it /*! \brief Take a line from the begin of this string and return it
* \details Example: \snippet pistring.cpp PIString::takeLine * \details Example: \snippet pistring.cpp PIString::takeLine
* \sa \a takeSymbol(), \a takeWord(), \a takeCWord(), \a takeNumber(), \a takeRange() */ * \sa \a takeSymbol(), \a takeWord(), \a takeCWord(), \a takeNumber(), \a takeRange() */
PIString takeLine(); PIString takeLine();
/*! @brief Take a number with C-format from the begin of this string and return it /*! \brief Take a number with C-format from the begin of this string and return it
* \details Example: \snippet pistring.cpp PIString::takeNumber * \details Example: \snippet pistring.cpp PIString::takeNumber
* \sa \a takeSymbol(), \a takeWord(), \a takeCWord(), \a takeLine(), \a takeRange() */ * \sa \a takeSymbol(), \a takeWord(), \a takeCWord(), \a takeLine(), \a takeRange() */
PIString takeNumber(); PIString takeNumber();
/*! @brief Take a range between "start" and "end" symbols from the begin of this /*! \brief Take a range between "start" and "end" symbols from the begin of this
* string and return it. * string and return it.
* \details "Shield" symbol prevent analysis of the next symbol. * \details "Shield" symbol prevent analysis of the next symbol.
* Example: \snippet pistring.cpp PIString::takeRange * Example: \snippet pistring.cpp PIString::takeRange
@@ -408,19 +408,19 @@ public:
PIString takeRange(const PIChar start, const PIChar end, const PIChar shield = '\\'); PIString takeRange(const PIChar start, const PIChar end, const PIChar shield = '\\');
/*! @brief Return a string in brackets "start" and "end" symbols from the begin of this /*! \brief Return a string in brackets "start" and "end" symbols from the begin of this
* string and return it. * string and return it.
* \details Example: string = "a(b(c)d)e"; inBrackets('(', ')') = "b(c)d"; */ * \details Example: string = "a(b(c)d)e"; inBrackets('(', ')') = "b(c)d"; */
PIString inBrackets(const PIChar start, const PIChar end) const; PIString inBrackets(const PIChar start, const PIChar end) const;
/*! @brief Return real bytes count of this string /*! \brief Return real bytes count of this string
* \details It`s equivalent length of char sequence * \details It`s equivalent length of char sequence
* returned by function \a data() - 1, without terminating null-char \n * returned by function \a data() - 1, without terminating null-char \n
* Example: \snippet pistring.cpp PIString::lengthAscii * Example: \snippet pistring.cpp PIString::lengthAscii
* \sa \a data() */ * \sa \a data() */
int lengthAscii() const {buildData(__syslocname__); return data_.size_s() - 1;} int lengthAscii() const {buildData(__syslocname__); return data_.size_s() - 1;}
/*! @brief Return \c char * representation of this string in system codepage /*! \brief Return \c char * representation of this string in system codepage
* \details This function fill buffer by sequence * \details This function fill buffer by sequence
* of chars. Minimum length of this buffer is count * of chars. Minimum length of this buffer is count
* of symbols. Returned \c char * is valid until next * of symbols. Returned \c char * is valid until next
@@ -429,7 +429,7 @@ public:
* \sa \a dataConsole(), \a dataUTF8() */ * \sa \a dataConsole(), \a dataUTF8() */
const char * data() const {buildData(__syslocname__); return (const char *)(data_.data());} const char * data() const {buildData(__syslocname__); return (const char *)(data_.data());}
/*! @brief Return \c char * representation of this string in terminal codepage /*! \brief Return \c char * representation of this string in terminal codepage
* \details This function fill buffer by sequence * \details This function fill buffer by sequence
* of chars. Minimum length of this buffer is count * of chars. Minimum length of this buffer is count
* of symbols. Returned \c char * is valid until next * of symbols. Returned \c char * is valid until next
@@ -437,7 +437,7 @@ public:
* \sa \a data(), \a dataUTF8() */ * \sa \a data(), \a dataUTF8() */
const char * dataConsole() const; const char * dataConsole() const;
/*! @brief Return \c char * representation of this string in UTF-8 /*! \brief Return \c char * representation of this string in UTF-8
* \details This function fill buffer by sequence * \details This function fill buffer by sequence
* of chars. Minimum length of this buffer is count * of chars. Minimum length of this buffer is count
* of symbols. Returned \c char * is valid until next * of symbols. Returned \c char * is valid until next
@@ -445,7 +445,7 @@ public:
* \sa \a data(), \a dataConsole() */ * \sa \a data(), \a dataConsole() */
const char * dataUTF8() const; const char * dataUTF8() const;
/*! @brief Return \c char * representation of this string in ASCII /*! \brief Return \c char * representation of this string in ASCII
* \details This function fill buffer by sequence * \details This function fill buffer by sequence
* of chars. Minimum length of this buffer is count * of chars. Minimum length of this buffer is count
* of symbols. Returned \c char * is valid until next * of symbols. Returned \c char * is valid until next
@@ -455,277 +455,277 @@ public:
//! Returns hash //! Returns hash
uint hash() const; uint hash() const;
//! @brief Return \a PIByteArray contains \a data() of this string without terminating null-char //! \brief Return \a PIByteArray contains \a data() of this string without terminating null-char
PIByteArray toByteArray() const {buildData(__utf8name__); return data_.resized(data_.size_s() - 1);} PIByteArray toByteArray() const {buildData(__utf8name__); return data_.resized(data_.size_s() - 1);}
//! @brief Return \a PIByteArray contains UTF-8 \a data() of this string without terminating null-char //! \brief Return \a PIByteArray contains UTF-8 \a data() of this string without terminating null-char
PIByteArray toUTF8() const; PIByteArray toUTF8() const;
//! @brief Return \a PIByteArray contains custom charset representation of this string without terminating null-char //! \brief Return \a PIByteArray contains custom charset representation of this string without terminating null-char
PIByteArray toCharset(const char * c) const; PIByteArray toCharset(const char * c) const;
/*! @brief Split string with delimiter "delim" to \a PIStringList and return it /*! \brief Split string with delimiter "delim" to \a PIStringList and return it
* \details Example: \snippet pistring.cpp PIString::split */ * \details Example: \snippet pistring.cpp PIString::split */
PIStringList split(const PIString & delim) const; PIStringList split(const PIString & delim) const;
//! @brief Convert each symbol in copyed string to upper case and return it //! \brief Convert each symbol in copyed string to upper case and return it
PIString toUpperCase() const; PIString toUpperCase() const;
//! @brief Convert each symbol in copyed string to lower case and return it //! \brief Convert each symbol in copyed string to lower case and return it
PIString toLowerCase() const; PIString toLowerCase() const;
PIString toNativeDecimalPoints() const; PIString toNativeDecimalPoints() const;
//! @brief Returns if string contains "c" //! \brief Returns if string contains "c"
bool contains(const char c) const {return PIDeque<PIChar>::contains(PIChar(c));} bool contains(const char c) const {return PIDeque<PIChar>::contains(PIChar(c));}
//! @brief Returns if string contains "str" //! \brief Returns if string contains "str"
bool contains(const char * str) const {return contains(PIString(str));} bool contains(const char * str) const {return contains(PIString(str));}
//! @brief Returns if string contains "str" //! \brief Returns if string contains "str"
bool contains(const PIString & str) const {return find(str) >= 0;} bool contains(const PIString & str) const {return find(str) >= 0;}
//! @brief Search symbol "c" from symbol at index "start" and return first occur position //! \brief Search symbol "c" from symbol at index "start" and return first occur position
//! \details Example: \snippet pistring.cpp PIString::find //! \details Example: \snippet pistring.cpp PIString::find
int find(const char c, const int start = 0) const; int find(const char c, const int start = 0) const;
//! @brief Search substring "str" from symbol at index "start" and return first occur position //! \brief Search substring "str" from symbol at index "start" and return first occur position
//! \details Example: \snippet pistring.cpp PIString::find //! \details Example: \snippet pistring.cpp PIString::find
int find(const PIString & str, const int start = 0) const; int find(const PIString & str, const int start = 0) const;
//! @brief Search substring "str" from symbol at index "start" and return first occur position //! \brief Search substring "str" from symbol at index "start" and return first occur position
//! \details Example: \snippet pistring.cpp PIString::find //! \details Example: \snippet pistring.cpp PIString::find
int find(const char * str, const int start = 0) const {return find(PIString(str), start);} int find(const char * str, const int start = 0) const {return find(PIString(str), start);}
//! @brief Search symbol "c" from symbol at index "start" and return last occur position //! \brief Search symbol "c" from symbol at index "start" and return last occur position
//! \details Example: \snippet pistring.cpp PIString::findLast //! \details Example: \snippet pistring.cpp PIString::findLast
int findLast(const char c, const int start = 0) const; int findLast(const char c, const int start = 0) const;
//! @brief Search substring "str" from symbol at index "start" and return last occur position //! \brief Search substring "str" from symbol at index "start" and return last occur position
//! \details Example: \snippet pistring.cpp PIString::findLast //! \details Example: \snippet pistring.cpp PIString::findLast
int findLast(const PIString & str, const int start = 0) const; int findLast(const PIString & str, const int start = 0) const;
//! @brief Search substring "str" from symbol at index "start" and return last occur position //! \brief Search substring "str" from symbol at index "start" and return last occur position
//! \details Example: \snippet pistring.cpp PIString::findLast //! \details Example: \snippet pistring.cpp PIString::findLast
int findLast(const char * str, const int start = 0) const {return findLast(PIString(str), start);} int findLast(const char * str, const int start = 0) const {return findLast(PIString(str), start);}
//! @brief Search word "word" from symbol at index "start" and return first occur position. //! \brief Search word "word" from symbol at index "start" and return first occur position.
//! \details Example: \snippet pistring.cpp PIString::findWord //! \details Example: \snippet pistring.cpp PIString::findWord
int findWord(const PIString & word, const int start = 0) const; int findWord(const PIString & word, const int start = 0) const;
//! @brief Search C-style word "word" from symbol at index "start" and return first occur position. //! \brief Search C-style word "word" from symbol at index "start" and return first occur position.
//! \details Example: \snippet pistring.cpp PIString::findCWord //! \details Example: \snippet pistring.cpp PIString::findCWord
int findCWord(const PIString & word, const int start = 0) const; int findCWord(const PIString & word, const int start = 0) const;
//! @brief Search range between "start" and "end" symbols at index "start_index" and return first occur position. //! \brief Search range between "start" and "end" symbols at index "start_index" and return first occur position.
//! \details Example: \snippet pistring.cpp PIString::findRange //! \details Example: \snippet pistring.cpp PIString::findRange
int findRange(const PIChar start, const PIChar end, const PIChar shield = '\\', const int start_index = 0, int * len = 0) const; int findRange(const PIChar start, const PIChar end, const PIChar shield = '\\', const int start_index = 0, int * len = 0) const;
//! @brief Search any symbol of "str" from symbol at index "start" and return first occur position //! \brief Search any symbol of "str" from symbol at index "start" and return first occur position
//! \details Example: \snippet pistring.cpp PIString::findAny //! \details Example: \snippet pistring.cpp PIString::findAny
int findAny(const PIString & str, const int start = 0) const; int findAny(const PIString & str, const int start = 0) const;
//! @brief Search any symbol of "str" from symbol at index "start" and return first occur position //! \brief Search any symbol of "str" from symbol at index "start" and return first occur position
//! \details Example: \snippet pistring.cpp PIString::findAny //! \details Example: \snippet pistring.cpp PIString::findAny
int findAny(const char * str, const int start = 0) const {return findAny(PIString(str), start);} int findAny(const char * str, const int start = 0) const {return findAny(PIString(str), start);}
//! @brief Search any symbol of "str" from symbol at index "start" and return last occur position //! \brief Search any symbol of "str" from symbol at index "start" and return last occur position
//! \details Example: \snippet pistring.cpp PIString::findAnyLast //! \details Example: \snippet pistring.cpp PIString::findAnyLast
int findAnyLast(const PIString & str, const int start = 0) const; int findAnyLast(const PIString & str, const int start = 0) const;
//! @brief Search any symbol of "str" from symbol at index "start" and return last occur position //! \brief Search any symbol of "str" from symbol at index "start" and return last occur position
//! \details Example: \snippet pistring.cpp PIString::findAnyLast //! \details Example: \snippet pistring.cpp PIString::findAnyLast
int findAnyLast(const char * str, const int start = 0) const {return findAnyLast(PIString(str), start);} int findAnyLast(const char * str, const int start = 0) const {return findAnyLast(PIString(str), start);}
//! @brief Returns number of occurrences of symbol "c" //! \brief Returns number of occurrences of symbol "c"
int entries(const PIChar c) const; int entries(const PIChar c) const;
//! @brief Returns number of occurrences of symbol "c" //! \brief Returns number of occurrences of symbol "c"
int entries(char c) const {return entries(PIChar(c));} int entries(char c) const {return entries(PIChar(c));}
//! @brief Return if string starts with "str" //! \brief Return if string starts with "str"
bool startsWith(const PIString & str) const; bool startsWith(const PIString & str) const;
//! @brief Return if string ends with "str" //! \brief Return if string ends with "str"
bool endsWith(const PIString & str) const; bool endsWith(const PIString & str) const;
//! @brief Return symbols length of string //! \brief Return symbols length of string
int length() const {return size();} int length() const {return size();}
//! @brief Return \c true if string is empty, i.e. length = 0 //! \brief Return \c true if string is empty, i.e. length = 0
bool isEmpty() const {return (size() == 0 || *this == "");} bool isEmpty() const {return (size() == 0 || *this == "");}
//! @brief Return \c true if string equal "true", "yes", "on" or positive not null numeric value //! \brief Return \c true if string equal "true", "yes", "on" or positive not null numeric value
bool toBool() const; bool toBool() const;
//! @brief Return \c char numeric value of string //! \brief Return \c char numeric value of string
char toChar() const; char toChar() const;
//! @brief Return \c short numeric value of string in base "base" //! \brief Return \c short numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
short toShort(int base = -1, bool * ok = 0) const {return short(toNumberBase(*this, base, ok));} short toShort(int base = -1, bool * ok = 0) const {return short(toNumberBase(*this, base, ok));}
//! @brief Return \c ushort numeric value of string in base "base" //! \brief Return \c ushort numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
ushort toUShort(int base = -1, bool * ok = 0) const {return ushort(toNumberBase(*this, base, ok));} ushort toUShort(int base = -1, bool * ok = 0) const {return ushort(toNumberBase(*this, base, ok));}
//! @brief Return \c int numeric value of string in base "base" //! \brief Return \c int numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
int toInt(int base = -1, bool * ok = 0) const {return int(toNumberBase(*this, base, ok));} int toInt(int base = -1, bool * ok = 0) const {return int(toNumberBase(*this, base, ok));}
//! @brief Return \c uint numeric value of string in base "base" //! \brief Return \c uint numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
uint toUInt(int base = -1, bool * ok = 0) const {return uint(toNumberBase(*this, base, ok));} uint toUInt(int base = -1, bool * ok = 0) const {return uint(toNumberBase(*this, base, ok));}
//! @brief Return \c long numeric value of string in base "base" //! \brief Return \c long numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
long toLong(int base = -1, bool * ok = 0) const {return long(toNumberBase(*this, base, ok));} long toLong(int base = -1, bool * ok = 0) const {return long(toNumberBase(*this, base, ok));}
//! @brief Return \c ulong numeric value of string in base "base" //! \brief Return \c ulong numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
ulong toULong(int base = -1, bool * ok = 0) const {return ulong(toNumberBase(*this, base, ok));} ulong toULong(int base = -1, bool * ok = 0) const {return ulong(toNumberBase(*this, base, ok));}
//! @brief Return \c llong numeric value of string in base "base" //! \brief Return \c llong numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
llong toLLong(int base = -1, bool * ok = 0) const {return toNumberBase(*this, base, ok);} llong toLLong(int base = -1, bool * ok = 0) const {return toNumberBase(*this, base, ok);}
//! @brief Return \c ullong numeric value of string in base "base" //! \brief Return \c ullong numeric value of string in base "base"
//! \details Example: \snippet pistring.cpp PIString::toNumber //! \details Example: \snippet pistring.cpp PIString::toNumber
ullong toULLong(int base = -1, bool * ok = 0) const {return ullong(toNumberBase(*this, base, ok));} ullong toULLong(int base = -1, bool * ok = 0) const {return ullong(toNumberBase(*this, base, ok));}
//! @brief Return \c float numeric value of string //! \brief Return \c float numeric value of string
//! \details Example: \snippet pistring.cpp PIString::toFloat //! \details Example: \snippet pistring.cpp PIString::toFloat
float toFloat() const; float toFloat() const;
//! @brief Return \c double numeric value of string //! \brief Return \c double numeric value of string
//! \details Example: \snippet pistring.cpp PIString::toFloat //! \details Example: \snippet pistring.cpp PIString::toFloat
double toDouble() const; double toDouble() const;
//! @brief Return \c ldouble numeric value of string //! \brief Return \c ldouble numeric value of string
//! \details Example: \snippet pistring.cpp PIString::toFloat //! \details Example: \snippet pistring.cpp PIString::toFloat
ldouble toLDouble() const; ldouble toLDouble() const;
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const short value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const short value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const ushort value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const ushort value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const int value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const int value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const uint value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const uint value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const long value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const long value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const ulong value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const ulong value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const llong & value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const llong & value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" in base "base" //! \brief Set string content to numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::setNumber //! \details Example: \snippet pistring.cpp PIString::setNumber
PIString & setNumber(const ullong & value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;} PIString & setNumber(const ullong & value, int base = 10, bool * ok = 0) {clear(); *this += PIString::fromNumber(value, base, ok); return *this;}
//! @brief Set string content to numeric representation of "value" //! \brief Set string content to numeric representation of "value"
//! \details Example: \snippet pistring.cpp PIString::setFloat //! \details Example: \snippet pistring.cpp PIString::setFloat
PIString & setNumber(const float value, char format = 'f', int precision = 8) {clear(); *this += PIString::fromNumber(value, format, precision); return *this;} PIString & setNumber(const float value, char format = 'f', int precision = 8) {clear(); *this += PIString::fromNumber(value, format, precision); return *this;}
//! @brief Set string content to numeric representation of "value" //! \brief Set string content to numeric representation of "value"
//! \details Example: \snippet pistring.cpp PIString::setFloat //! \details Example: \snippet pistring.cpp PIString::setFloat
PIString & setNumber(const double & value, char format = 'f', int precision = 8) {clear(); *this += PIString::fromNumber(value, format, precision); return *this;} PIString & setNumber(const double & value, char format = 'f', int precision = 8) {clear(); *this += PIString::fromNumber(value, format, precision); return *this;}
//! @brief Set string content to numeric representation of "value" //! \brief Set string content to numeric representation of "value"
//! \details Example: \snippet pistring.cpp PIString::setFloat //! \details Example: \snippet pistring.cpp PIString::setFloat
PIString & setNumber(const ldouble & value, char format = 'f', int precision = 8) {clear(); *this += PIString::fromNumber(value, format, precision); return *this;} PIString & setNumber(const ldouble & value, char format = 'f', int precision = 8) {clear(); *this += PIString::fromNumber(value, format, precision); return *this;}
//! @brief Set string content to human readable size in B/kB/MB/GB/TB //! \brief Set string content to human readable size in B/kB/MB/GB/TB
//! \details Example: \snippet pistring.cpp PIString::setReadableSize //! \details Example: \snippet pistring.cpp PIString::setReadableSize
PIString & setReadableSize(llong bytes); PIString & setReadableSize(llong bytes);
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const short value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);} static PIString fromNumber(const short value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const ushort value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);} static PIString fromNumber(const ushort value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const int value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);} static PIString fromNumber(const int value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const uint value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);} static PIString fromNumber(const uint value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const long value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);} static PIString fromNumber(const long value, int base = 10, bool * ok = 0) {return fromNumberBaseS(llong(value), base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const ulong value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);} static PIString fromNumber(const ulong value, int base = 10, bool * ok = 0) {return fromNumberBaseU(ullong(value), base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const llong & value, int base = 10, bool * ok = 0) {return fromNumberBaseS(value, base, ok);} static PIString fromNumber(const llong & value, int base = 10, bool * ok = 0) {return fromNumberBaseS(value, base, ok);}
//! @brief Return string contains numeric representation of "value" in base "base" //! \brief Return string contains numeric representation of "value" in base "base"
//! \details Example: \snippet pistring.cpp PIString::fromNumber //! \details Example: \snippet pistring.cpp PIString::fromNumber
static PIString fromNumber(const ullong & value, int base = 10, bool * ok = 0) {return fromNumberBaseU(value, base, ok);} static PIString fromNumber(const ullong & value, int base = 10, bool * ok = 0) {return fromNumberBaseU(value, base, ok);}
//! @brief Return string contains numeric representation of "value" //! \brief Return string contains numeric representation of "value"
//! \details Example: \snippet pistring.cpp PIString::fromFloat //! \details Example: \snippet pistring.cpp PIString::fromFloat
static PIString fromNumber(const float value, char format = 'f', int precision = 8) {return ftos(value, format, precision);} static PIString fromNumber(const float value, char format = 'f', int precision = 8) {return ftos(value, format, precision);}
//! @brief Return string contains numeric representation of "value" //! \brief Return string contains numeric representation of "value"
//! \details Example: \snippet pistring.cpp PIString::fromFloat //! \details Example: \snippet pistring.cpp PIString::fromFloat
static PIString fromNumber(const double & value, char format = 'f', int precision = 8) {return dtos(value, format, precision);} static PIString fromNumber(const double & value, char format = 'f', int precision = 8) {return dtos(value, format, precision);}
//! @brief Return string contains numeric representation of "value" //! \brief Return string contains numeric representation of "value"
//! \details Example: \snippet pistring.cpp PIString::fromFloat //! \details Example: \snippet pistring.cpp PIString::fromFloat
static PIString fromNumber(const ldouble & value, char format = 'f', int precision = 8) {return dtos(value, format, precision);} static PIString fromNumber(const ldouble & value, char format = 'f', int precision = 8) {return dtos(value, format, precision);}
//! @brief Return "true" or "false" //! \brief Return "true" or "false"
static PIString fromBool(const bool value) {return PIString(value ? "true" : "false");} static PIString fromBool(const bool value) {return PIString(value ? "true" : "false");}
//! @brief Return string constructed from terminal codepage //! \brief Return string constructed from terminal codepage
static PIString fromConsole(const char * s); static PIString fromConsole(const char * s);
//! @brief Return string constructed from system codepage //! \brief Return string constructed from system codepage
static PIString fromSystem(const char * s); static PIString fromSystem(const char * s);
//! @brief Return string constructed from UTF-8 //! \brief Return string constructed from UTF-8
static PIString fromUTF8(const char * s); static PIString fromUTF8(const char * s);
//! @brief Return string constructed from UTF-8 //! \brief Return string constructed from UTF-8
static PIString fromUTF8(const PIByteArray &ba); static PIString fromUTF8(const PIByteArray &ba);
//! @brief Return string constructed from ASCII //! \brief Return string constructed from ASCII
static PIString fromAscii(const char * s); static PIString fromAscii(const char * s);
//! @brief Return string constructed from "len" chars ASCII //! \brief Return string constructed from "len" chars ASCII
static PIString fromAscii(const char * s, int len); static PIString fromAscii(const char * s, int len);
//! @brief Return string constructed from "c" codepage //! \brief Return string constructed from "c" codepage
static PIString fromCodepage(const char * s, const char * c); static PIString fromCodepage(const char * s, const char * c);
//! @brief Return string contains human readable size in B/kB/MB/GB/TB //! \brief Return string contains human readable size in B/kB/MB/GB/TB
//! \details Example: \snippet pistring.cpp PIString::readableSize //! \details Example: \snippet pistring.cpp PIString::readableSize
static PIString readableSize(llong bytes); static PIString readableSize(llong bytes);
@@ -751,30 +751,30 @@ private:
}; };
//! \relatesalso PICout @brief Output operator to PICout //! \relatesalso PICout \brief Output operator to PICout
PIP_EXPORT PICout operator <<(PICout s, const PIString & v); PIP_EXPORT PICout operator <<(PICout s, const PIString & v);
//! \relatesalso PIByteArray @brief Output operator to PIByteArray //! \relatesalso PIByteArray \brief Output operator to PIByteArray
inline PIByteArray & operator <<(PIByteArray & s, const PIString & v) {s << *(PIDeque<PIChar>*)&v; return s;} inline PIByteArray & operator <<(PIByteArray & s, const PIString & v) {s << *(PIDeque<PIChar>*)&v; return s;}
//! \relatesalso PIByteArray @brief Input operator from PIByteArray //! \relatesalso PIByteArray \brief Input operator from PIByteArray
inline PIByteArray & operator >>(PIByteArray & s, PIString & v) {v.clear(); s >> *(PIDeque<PIChar>*)&v; return s;} inline PIByteArray & operator >>(PIByteArray & s, PIString & v) {v.clear(); s >> *(PIDeque<PIChar>*)&v; return s;}
//! @brief Return concatenated string //! \brief Return concatenated string
inline PIString operator +(const PIString & str, const PIString & f) {PIString s(str); s += f; return s;} inline PIString operator +(const PIString & str, const PIString & f) {PIString s(str); s += f; return s;}
//! @brief Return concatenated string //! \brief Return concatenated string
inline PIString operator +(const PIString & f, const char * str) {PIString s(f); s += str; return s;} inline PIString operator +(const PIString & f, const char * str) {PIString s(f); s += str; return s;}
//! @brief Return concatenated string //! \brief Return concatenated string
inline PIString operator +(const char * str, const PIString & f) {return PIString(str) + f;} inline PIString operator +(const char * str, const PIString & f) {return PIString(str) + f;}
//! \relatesalso PIString @brief Return concatenated string //! \relatesalso PIString \brief Return concatenated string
inline PIString operator +(const char c, const PIString & f) {return PIChar(c) + f;} inline PIString operator +(const char c, const PIString & f) {return PIChar(c) + f;}
//! @brief Return concatenated string //! \brief Return concatenated string
inline PIString operator +(const PIString & f, const char c) {return f + PIChar(c);} inline PIString operator +(const PIString & f, const char c) {return f + PIChar(c);}

View File

@@ -1,5 +1,5 @@
/*! @file pistring_std.h /*! \file pistring_std.h
* @brief STD for PIString * \brief STD for PIString
* *
* This file declare std operators and string conversions * This file declare std operators and string conversions
*/ */
@@ -70,24 +70,24 @@ inline PIString StdWString2PIString(const std::wstring & v) {
//! \relatesalso PIChar @brief Output operator to \c std::ostream //! \relatesalso PIChar \brief Output operator to \c std::ostream
inline std::ostream & operator <<(std::ostream & s, const PIChar & v) {s << v.toCharPtr(); return s;} inline std::ostream & operator <<(std::ostream & s, const PIChar & v) {s << v.toCharPtr(); return s;}
//! \relatesalso PIString @brief Return concatenated string //! \relatesalso PIString \brief Return concatenated string
inline PIString operator +(const PIString & f, const std::string & str) {PIString s(f); s += StdString2PIString(str); return s;} inline PIString operator +(const PIString & f, const std::string & str) {PIString s(f); s += StdString2PIString(str); return s;}
//! \relatesalso PIString @brief Return concatenated string //! \relatesalso PIString \brief Return concatenated string
inline PIString operator +(const std::string & str, const PIString & f) {return StdString2PIString(str) + f;} inline PIString operator +(const std::string & str, const PIString & f) {return StdString2PIString(str) + f;}
//! \relatesalso PIString @brief Output operator to std::ostream (cout) //! \relatesalso PIString \brief Output operator to std::ostream (cout)
inline std::ostream & operator <<(std::ostream & s, const PIString & v) {for (int i = 0; i < v.length(); ++i) s << v[i]; return s;} inline std::ostream & operator <<(std::ostream & s, const PIString & v) {for (int i = 0; i < v.length(); ++i) s << v[i]; return s;}
//! \relatesalso PIString @brief Input operator from std::istream (cin) //! \relatesalso PIString \brief Input operator from std::istream (cin)
inline std::istream & operator >>(std::istream & s, PIString & v) {std::string ss; s >> ss; v = StdString2PIString(ss); return s;} inline std::istream & operator >>(std::istream & s, PIString & v) {std::string ss; s >> ss; v = StdString2PIString(ss); return s;}
//! \relatesalso PIStringList @brief Output operator to std::ostream (cout) //! \relatesalso PIStringList \brief Output operator to std::ostream (cout)
inline std::ostream & operator <<(std::ostream & s, const PIStringList & v) { inline std::ostream & operator <<(std::ostream & s, const PIStringList & v) {
s << PIChar("{"); s << PIChar("{");
for (uint i = 0; i < v.size(); ++i) { for (uint i = 0; i < v.size(); ++i) {

View File

@@ -20,6 +20,52 @@
#include "pistringlist.h" #include "pistringlist.h"
//! \addtogroup Core
//! \{
//! \~\class PIStringList pistringlist.h
//! \~\brief
//! \~english Based on \a PIDeque<PIString> strings list
//! \~russian Основанный на \a PIDeque<PIString> массив строк
//!
//! \~\details
//!
//! \}
//! \details
//! \~english Example:
//! \~russian Пример:
//! \~\snippet pistring.cpp PIStringList::join
PIString PIStringList::join(const PIString & delim) const {
PIString s;
for (uint i = 0; i < size(); ++i) {
s += at(i);
if (i < size() - 1)
s += delim;
}
return s;
}
//! \details
//! \~english Example:
//! \~russian Пример:
//! \~\snippet pistring.cpp PIStringList::removeStrings
PIStringList & PIStringList::removeStrings(const PIString & value) {
for (uint i = 0; i < size(); ++i) {
if (at(i) == value) {
remove(i);
--i;
}
}
return *this;
}
//! \details
//! \~english Example:
//! \~russian Пример:
//! \~\snippet pistring.cpp PIStringList::removeDuplicates
PIStringList& PIStringList::removeDuplicates() { PIStringList& PIStringList::removeDuplicates() {
PIStringList l; PIStringList l;
PIString s; PIString s;
@@ -40,3 +86,14 @@ PIStringList& PIStringList::removeDuplicates() {
} }
return *this; return *this;
} }
//! \details
//! \~english Example:
//! \~russian Пример:
//! \~\snippet pistring.cpp PIStringList::trim
PIStringList & PIStringList::trim() {
for (uint i = 0; i < size(); ++i)
(*this)[i].trim();
return *this;
}

View File

@@ -1,6 +1,8 @@
/*! @brief Strings array class /*! \file pistringlist.h
* \details This class is based on \a PIDeque<PIString> and * \~\brief
* expand it functionality. */ * \~english Based on \a PIDeque<PIString> strings list
* \~russian Основанный на \a PIDeque<PIString> массив строк
*/
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
Strings array class Strings array class
@@ -30,80 +32,108 @@ class PIP_EXPORT PIStringList: public PIDeque<PIString>
{ {
public: public:
//! Contructs empty strings list //! \~english Contructs an empty strings list
//! \~russian Создает пустой список строк
PIStringList() {;} PIStringList() {;}
~PIStringList() {;} //! \~english Contructs strings list with one string "str"
//! \~russian Создает список строк с одной строкой "str"
//! Contructs strings list with one string "str"
PIStringList(const PIString & str) {push_back(str);} PIStringList(const PIString & str) {push_back(str);}
PIStringList(PIString && str) {push_back(std::move(str));} PIStringList(PIString && str) {push_back(std::move(str));}
//! Contructs empty strings list with strings "s0" and "s1" //! \~english Contructs strings list with strings "s0" and "s1"
//! \~russian Создает список строк со строками "s0" и "s1"
PIStringList(const PIString & s0, const PIString & s1) {push_back(s0); push_back(s1);} PIStringList(const PIString & s0, const PIString & s1) {push_back(s0); push_back(s1);}
PIStringList(PIString && s0, PIString && s1) {push_back(std::move(s0)); push_back(std::move(s1));} PIStringList(PIString && s0, PIString && s1) {push_back(std::move(s0)); push_back(std::move(s1));}
//! Contructs empty strings list with strings "s0", "s1" and "s2" //! \~english Contructs strings list with strings "s0", "s1" and "s2"
//! \~russian Создает список строк со строками "s0", "s1" и "s2"
PIStringList(const PIString & s0, const PIString & s1, const PIString & s2) {push_back(s0); push_back(s1); push_back(s2);} PIStringList(const PIString & s0, const PIString & s1, const PIString & s2) {push_back(s0); push_back(s1); push_back(s2);}
PIStringList(PIString && s0, PIString && s1, PIString && s2) {push_back(std::move(s0)); push_back(std::move(s1)); push_back(std::move(s2));} PIStringList(PIString && s0, PIString && s1, PIString && s2) {push_back(std::move(s0)); push_back(std::move(s1)); push_back(std::move(s2));}
//! Contructs empty strings list with strings "s0", "s1", "s2" and "s3" //! \~english Contructs strings list with strings "s0", "s1", "s2" and "s3"
//! \~russian Создает список строк со строками "s0", "s1", "s2" и "s3"
PIStringList(const PIString & s0, const PIString & s1, const PIString & s2, const PIString & s3) {push_back(s0); push_back(s1); push_back(s2); push_back(s3);} PIStringList(const PIString & s0, const PIString & s1, const PIString & s2, const PIString & s3) {push_back(s0); push_back(s1); push_back(s2); push_back(s3);}
PIStringList(PIString && s0, PIString && s1, PIString && s2, PIString && s3) {push_back(std::move(s0)); push_back(std::move(s1)); push_back(std::move(s2)); push_back(std::move(s3));} PIStringList(PIString && s0, PIString && s1, PIString && s2, PIString && s3) {push_back(std::move(s0)); push_back(std::move(s1)); push_back(std::move(s2)); push_back(std::move(s3));}
//! \~english Contructs strings list with strings "o"
//! \~russian Создает список строк со строками "o"
PIStringList(const PIStringList & o): PIDeque<PIString>(o) {} PIStringList(const PIStringList & o): PIDeque<PIString>(o) {}
PIStringList(PIStringList && o): PIDeque<PIString>(std::move(o)) {} PIStringList(PIStringList && o): PIDeque<PIString>(std::move(o)) {}
//! \~english Contructs strings list with strings "o"
//! \~russian Создает список строк со строками "o"
PIStringList(const PIVector<PIString> & o): PIDeque<PIString>() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];} PIStringList(const PIVector<PIString> & o): PIDeque<PIString>() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];}
//! \~english Contructs strings list with strings "o"
//! \~russian Создает список строк со строками "o"
PIStringList(const PIDeque<PIString> & o): PIDeque<PIString>() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];} PIStringList(const PIDeque<PIString> & o): PIDeque<PIString>() {resize(o.size()); for (uint i = 0; i < size(); ++i) (*this)[i] = o[i];}
//! Contructs strings list with std::initializer_list //! \~english Contructs strings list with strings "init_list" in std::initializer_list format
//! \~russian Создает список строк со строками "init_list" в формате std::initializer_list
PIStringList(std::initializer_list<PIString> init_list): PIDeque<PIString>(init_list) {} PIStringList(std::initializer_list<PIString> init_list): PIDeque<PIString>(init_list) {}
//! @brief Join all strings in one with delimiter "delim" and return it //! \~english Join all strings in one with delimiter "delim" and returns it
//! \details Example: \snippet pistring.cpp PIStringList::join //! \~russian Соединяет все строки в одну через разделитель "delim" и возвращает её
PIString join(const PIString & delim) const {PIString s; for (uint i = 0; i < size(); ++i) {s += at(i); if (i < size() - 1) s += delim;} return s;} PIString join(const PIString & delim) const;
//! @brief Remove all strings equal "value" and return this //! \~english Remove all strings equal "value" and returns reference to this
//! \details Example: \snippet pistring.cpp PIStringList::removeStrings //! \~russian Удаляет все строки равные "value" и возвращает ссылку на этот список строк
PIStringList & removeStrings(const PIString & value) {for (uint i = 0; i < size(); ++i) {if (at(i) == value) {remove(i); --i;}} return *this;} PIStringList & removeStrings(const PIString & value);
PIStringList & remove(uint num) {PIDeque<PIString>::remove(num); return *this;} PIStringList & remove(uint num) {PIDeque<PIString>::remove(num); return *this;}
PIStringList & remove(uint num, uint count) {PIDeque<PIString>::remove(num, count); return *this;} PIStringList & remove(uint num, uint count) {PIDeque<PIString>::remove(num, count); return *this;}
//! @brief Remove duplicated strings and return this //! \~english Remove duplicated strings and returns reference to this
//! \details Example: \snippet pistring.cpp PIStringList::removeDuplicates //! \~russian Удаляет все дублированные строки и возвращает ссылку на этот список строк
PIStringList & removeDuplicates(); PIStringList & removeDuplicates();
//! @brief Trim all strings //! \~english Trim all strings and returns reference to this
//! \details Example: \snippet pistring.cpp PIString::trim //! \~russian Подчищает у всех строк пробельные символы в начале и в конце и возвращает ссылку на этот список строк
PIStringList & trim() {for (uint i = 0; i < size(); ++i) (*this)[i].trim(); return *this;} PIStringList & trim();
//! Return sum of lengths of all strings //! \~english Returns sum of lengths of all strings
//! \~russian Возвращает сумму длин всех строк
uint contentSize() {uint s = 0; for (uint i = 0; i < size(); ++i) s += at(i).size(); return s;} uint contentSize() {uint s = 0; for (uint i = 0; i < size(); ++i) s += at(i).size(); return s;}
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator ==(const PIStringList & o) const {if (size() != o.size()) return false; for (size_t i = 0; i < size(); ++i) if (o[i] != (*this)[i]) return false; return true;} bool operator ==(const PIStringList & o) const {if (size() != o.size()) return false; for (size_t i = 0; i < size(); ++i) if (o[i] != (*this)[i]) return false; return true;}
//! Compare operator //! \~english Compare operator
//! \~russian Оператор сравнения
bool operator !=(const PIStringList & o) const {return !(o == (*this));} bool operator !=(const PIStringList & o) const {return !(o == (*this));}
//! \~english Assign operator
//! \~russian Оператор присваивания
PIStringList & operator =(const PIStringList & o) {PIDeque<PIString>::operator=(o); return *this;} PIStringList & operator =(const PIStringList & o) {PIDeque<PIString>::operator=(o); return *this;}
//! \~english Append string "str"
//! \~russian Добавляет строку "str"
PIStringList & operator <<(const PIString & str) {append(str); return *this;} PIStringList & operator <<(const PIString & str) {append(str); return *this;}
PIStringList & operator <<(PIString && str) {append(std::move(str)); return *this;} PIStringList & operator <<(PIString && str) {append(std::move(str)); return *this;}
//! \~english Append strings list "sl"
//! \~russian Добавляет список строк "sl"
PIStringList & operator <<(const PIStringList & sl) {append(sl); return *this;} PIStringList & operator <<(const PIStringList & sl) {append(sl); return *this;}
}; };
//! \relatesalso PIByteArray @brief Output operator to PIByteArray //! \relatesalso PIByteArray
//! \~english Store operator
//! \~russian Оператор сохранения
inline PIByteArray & operator <<(PIByteArray & s, const PIStringList & v) {s << int(v.size_s()); for (int i = 0; i < v.size_s(); ++i) s << v[i]; return s;} inline PIByteArray & operator <<(PIByteArray & s, const PIStringList & v) {s << int(v.size_s()); for (int i = 0; i < v.size_s(); ++i) s << v[i]; return s;}
//! relatesalso PIByteArray @brief Input operator from PIByteArray //! \relatesalso PIByteArray
//! \~english Restore operator
//! \~russian Оператор извлечения
inline PIByteArray & operator >>(PIByteArray & s, PIStringList & v) {int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;} inline PIByteArray & operator >>(PIByteArray & s, PIStringList & v) {int sz; s >> sz; v.resize(sz); for (int i = 0; i < sz; ++i) s >> v[i]; return s;}
//! \relatesalso PICout @brief Output operator to PICout //! \relatesalso PICout
//! \~english Output operator to \a PICout
//! \~russian Оператор вывода в \a PICout
inline PICout operator <<(PICout s, const PIStringList & v) {s.space(); s.setControl(0, true); s << "{"; for (uint i = 0; i < v.size(); ++i) {s << "\"" << v[i] << "\""; if (i < v.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;} inline PICout operator <<(PICout s, const PIStringList & v) {s.space(); s.setControl(0, true); s << "{"; for (uint i = 0; i < v.size(); ++i) {s << "\"" << v[i] << "\""; if (i < v.size() - 1) s << ", ";} s << "}"; s.restoreControl(); return s;}
#endif // PISTRINGLIST_H #endif // PISTRINGLIST_H

View File

@@ -39,31 +39,73 @@
# include <sys/time.h> # include <sys/time.h>
#endif #endif
/*! \class PISystemTime //! \addtogroup Core
* @brief System time //! \{
* //! \class PISystemTime pitime.h
* \section PISystemTime_sec0 Synopsis //! \brief
* This class provide arithmetic functions for POSIX system time. //! \~english System time with nanosecond precision
* This time represents as seconds and nanosecons in integer formats. //! \~russian Системное время с точностью до наносекунд
* You can take current system time with function \a PISystemTime::current(), //!
* compare times, sum or subtract two times, convert time to/from //! \~english \section PISystemTime_sec0 Synopsis
* seconds, milliseconds, microseconds or nanoseconds. //! \~russian \section PISystemTime_sec0 Краткий обзор
* \section PISystemTime_sec1 Example //! \~english
* \snippet pitimer.cpp system_time //! This class provide arithmetic functions for POSIX system time.
*/ //! This time represents as seconds and nanosecons in integer formats.
//! You can take current system time with function \a PISystemTime::current(),
//! compare times, sum or subtract two times, convert time to/from
//! seconds, milliseconds, microseconds or nanoseconds.
//!
//! \~russian
//! Этот класс предоставляет арифметику для системного времени в формате POSIX.
//! Это время представлено в виде целочисленных секунд и наносекунд.
//! Можно взять текущее время с помощью метода \a PISystemTime::current(),
//! сравнивать, суммировать и вычитать времена, преобразовывать в/из
//! секунд, миллисекунд, микросекунд и наносекунд.
//!
//! \~english \section PISystemTime_sec1 Example
//! \~russian \section PISystemTime_sec1 Пример
//! \~\snippet pitimer.cpp system_time
//!
//! \}
/*! \class PITimeMeasurer //! \addtogroup Core
* @brief Time measurements //! \{
* //! \class PITimeMeasurer pitime.h
* \section PITimeMeasurer_sec0 Synopsis //! \brief
* Function \a reset() set time mark to current //! \~english Time measurements
* system time, then functions double elapsed_*() returns time elapsed from this mark. //! \~russian Измерение времени
* These functions can returns nano-, micro-, milli- and seconds with suffixes "n", "u", "m" //!
* and "s" //! \~english \section PITimeMeasurer_sec0 Usage
*/ //! \~russian \section PITimeMeasurer_sec0 Использование
//! \~english
//! Function \a reset() set time mark to current
//! system time, then functions "double elapsed_*()" returns time elapsed from this mark.
//! These functions can returns nano-, micro-, milli- and seconds with suffixes "n", "u", "m"
//! and "s"
//!
//! \~russian
//! Метод \a reset() устанавливает текущую метку системного времени. Далее методы
//! "double elapsed_*()" возвращают время, прошедшее от установленной метки.
//! Эти методы возвращают нано, микро, милли и секунды с приставками
//! "n", "u", "m" и "s".
//!
//! \}
//! \details
//! \~english
//! This function consider \c "usleep" offset
//! on QNX/Linux/Mac, which is calculated with
//! \a pip_sys_test program. If this is correct
//! offset value in system config, this function
//! wait \b exactly "usecs" microseconds.
//! \~russian
//! Этот метод учитывает смещение \c "usleep"
//! на QNX/Linux/Mac, которое расчитывается с помощью
//! утилиты \a pip_sys_test. Если это значение в системном
//! конфиге действительно, то этот метод будет ожидать
//! \b точно "usecs" микросекунд.
void piUSleep(int usecs) { void piUSleep(int usecs) {
if (usecs <= 0) return; if (usecs <= 0) return;
#ifdef WINDOWS #ifdef WINDOWS

View File

@@ -1,5 +1,8 @@
/*! @file pitime.h /*! \file pitime.h
* @brief Time structs * \ingroup Core
* \~\brief
* \~english Time structs and methods
* \~russian Типы и методы времени
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -30,23 +33,28 @@
# include <time.h> # include <time.h>
#endif #endif
/*! @brief Precise sleep for "usecs" microseconds //! \~english Precise sleep for "usecs" microseconds
* \details This function consider \c "usleep" offset //! \~russian Точно ожидает "usecs" микросекунд
* on QNX/Linux/Mac, which is calculated with
* \a pip_sys_test program. If there is correct
* offset value in system config, this function
* wait \b exactly "usecs" microseconds. */
PIP_EXPORT void piUSleep(int usecs); // on !Windows consider constant "usleep" offset PIP_EXPORT void piUSleep(int usecs); // on !Windows consider constant "usleep" offset
/*! @brief Precise sleep for "msecs" milliseconds //! ~\brief
* \details This function exec \a piUSleep (msecs * 1000). */ //! \~english Precise sleep for "msecs" milliseconds
//! \~russian Точно ожидает "msecs" миллисекунд
//! ~\details
//! \~english This function exec \a piUSleep (msecs * 1000)
//! \~russian Этот метод вызывает \a piUSleep (msecs * 1000)
inline void piMSleep(double msecs) {piUSleep(int(msecs * 1000.));} // on !Windows consider constant "usleep" offset inline void piMSleep(double msecs) {piUSleep(int(msecs * 1000.));} // on !Windows consider constant "usleep" offset
/*! @brief Precise sleep for "secs" seconds //! ~\brief
* \details This function exec \a piUSleep (msecs * 1000000). */ //! \~english Precise sleep for "secs" seconds
//! \~russian Точно ожидает "secs" секунд
//! ~\details
//! \~english This function exec \a piUSleep (msecs * 1000000)
//! \~russianЭтот метод вызывает \a piUSleep (msecs * 1000000)
inline void piSleep(double secs) {piUSleep(int(secs * 1000000.));} // on !Windows consider constant "usleep" offset inline void piSleep(double secs) {piUSleep(int(secs * 1000000.));} // on !Windows consider constant "usleep" offset
//! Shortest available on current system sleep //! \~english Shortest available on current system sleep
//! \~russian Наименее возможное для данной системы по длительности ожидание
inline void piMinSleep() {piMSleep(PIP_MIN_MSLEEP);} inline void piMinSleep() {piMSleep(PIP_MIN_MSLEEP);}
@@ -167,7 +175,7 @@ private:
}; };
//! \relatesalso PICout @brief Output operator to PICout //! \relatesalso PICout \brief Output operator to PICout
inline PICout operator <<(PICout s, const PISystemTime & v) {s.space(); s.setControl(0, true); s << "(" << v.seconds << " s, " << v.nanoseconds << " ns)"; s.restoreControl(); return s;} inline PICout operator <<(PICout s, const PISystemTime & v) {s.space(); s.setControl(0, true); s << "(" << v.seconds << " s, " << v.nanoseconds << " ns)"; s.restoreControl(); return s;}
@@ -191,7 +199,7 @@ inline bool operator !=(const PITime & t0, const PITime & t1) {return !(t0 == t1
inline bool operator <=(const PITime & t0, const PITime & t1) {return !(t0 > t1);} inline bool operator <=(const PITime & t0, const PITime & t1) {return !(t0 > t1);}
inline bool operator >=(const PITime & t0, const PITime & t1) {return !(t0 < t1);} inline bool operator >=(const PITime & t0, const PITime & t1) {return !(t0 < t1);}
//! \relatesalso PICout @brief Output operator to PICout //! \relatesalso PICout \brief Output operator to PICout
PIP_EXPORT PICout operator <<(PICout s, const PITime & v); PIP_EXPORT PICout operator <<(PICout s, const PITime & v);
@@ -213,7 +221,7 @@ inline bool operator !=(const PIDate & t0, const PIDate & t1) {return !(t0 == t1
inline bool operator <=(const PIDate & t0, const PIDate & t1) {return !(t0 > t1);} inline bool operator <=(const PIDate & t0, const PIDate & t1) {return !(t0 > t1);}
inline bool operator >=(const PIDate & t0, const PIDate & t1) {return !(t0 < t1);} inline bool operator >=(const PIDate & t0, const PIDate & t1) {return !(t0 < t1);}
//! \relatesalso PICout @brief Output operator to PICout //! \relatesalso PICout \brief Output operator to PICout
PIP_EXPORT PICout operator <<(PICout s, const PIDate & v); PIP_EXPORT PICout operator <<(PICout s, const PIDate & v);
@@ -258,7 +266,7 @@ inline bool operator >=(const PIDateTime & t0, const PIDateTime & t1) {return !(
inline PIByteArray & operator <<(PIByteArray & s, const PIDateTime & v) {s << v.year << v.month << v.day << v.hours << v.minutes << v.seconds << v.milliseconds; return s;} inline PIByteArray & operator <<(PIByteArray & s, const PIDateTime & v) {s << v.year << v.month << v.day << v.hours << v.minutes << v.seconds << v.milliseconds; return s;}
inline PIByteArray & operator >>(PIByteArray & s, PIDateTime & v) {s >> v.year >> v.month >> v.day >> v.hours >> v.minutes >> v.seconds >> v.milliseconds; return s;} inline PIByteArray & operator >>(PIByteArray & s, PIDateTime & v) {s >> v.year >> v.month >> v.day >> v.hours >> v.minutes >> v.seconds >> v.milliseconds; return s;}
//! \relatesalso PICout @brief Output operator to PICout //! \relatesalso PICout \brief Output operator to PICout
PIP_EXPORT PICout operator <<(PICout s, const PIDateTime & v); PIP_EXPORT PICout operator <<(PICout s, const PIDateTime & v);
@@ -268,7 +276,7 @@ class PIP_EXPORT PITimeMeasurer {
public: public:
PITimeMeasurer(); PITimeMeasurer();
/** @brief Set internal time mark to current system time /** \brief Set internal time mark to current system time
* \details This function used for set start time mark. Later * \details This function used for set start time mark. Later
* you can find out elapsed time from this time mark to any * you can find out elapsed time from this time mark to any
* moment of time with \a elapsed_s(), \a elapsed_m(), * moment of time with \a elapsed_s(), \a elapsed_m(),
@@ -276,19 +284,19 @@ public:
* \sa \a elapsed_s(), \a elapsed_m(), \a elapsed_u(), \a elapsed_n() */ * \sa \a elapsed_s(), \a elapsed_m(), \a elapsed_u(), \a elapsed_n() */
void reset() {t_st = PISystemTime::current(true);} void reset() {t_st = PISystemTime::current(true);}
//! @brief Returns nanoseconds elapsed from last \a reset() execution or from timer measurer creation. //! \brief Returns nanoseconds elapsed from last \a reset() execution or from timer measurer creation.
double elapsed_n() const; double elapsed_n() const;
//! @brief Returns microseconds elapsed from last \a reset() execution or from timer measurer creation. //! \brief Returns microseconds elapsed from last \a reset() execution or from timer measurer creation.
double elapsed_u() const; double elapsed_u() const;
//! @brief Returns milliseconds elapsed from last \a reset() execution or from timer measurer creation. //! \brief Returns milliseconds elapsed from last \a reset() execution or from timer measurer creation.
double elapsed_m() const; double elapsed_m() const;
//! @brief Returns seconds elapsed from last \a reset() execution or from timer measurer creation. //! \brief Returns seconds elapsed from last \a reset() execution or from timer measurer creation.
double elapsed_s() const; double elapsed_s() const;
//! @brief Returns PISystemTime elapsed from last \a reset() execution or from timer measurer creation. //! \brief Returns PISystemTime elapsed from last \a reset() execution or from timer measurer creation.
PISystemTime elapsed() const; PISystemTime elapsed() const;
double reset_time_n() const {return t_st.toNanoseconds();} double reset_time_n() const {return t_st.toNanoseconds();}
@@ -296,22 +304,22 @@ public:
double reset_time_m() const {return t_st.toMilliseconds();} double reset_time_m() const {return t_st.toMilliseconds();}
double reset_time_s() const {return t_st.toSeconds();} double reset_time_s() const {return t_st.toSeconds();}
//! @brief Returns time mark of last \a reset() execution or timer measurer creation. //! \brief Returns time mark of last \a reset() execution or timer measurer creation.
PISystemTime reset_time() {return t_st;} PISystemTime reset_time() {return t_st;}
//! @brief Returns nanoseconds representation of current system time. //! \brief Returns nanoseconds representation of current system time.
static double elapsed_system_n() {return PISystemTime::current(true).toNanoseconds();} static double elapsed_system_n() {return PISystemTime::current(true).toNanoseconds();}
//! @brief Returns microseconds representation of current system time. //! \brief Returns microseconds representation of current system time.
static double elapsed_system_u() {return PISystemTime::current(true).toMicroseconds();} static double elapsed_system_u() {return PISystemTime::current(true).toMicroseconds();}
//! @brief Returns milliseconds representation of current system time. //! \brief Returns milliseconds representation of current system time.
static double elapsed_system_m() {return PISystemTime::current(true).toMilliseconds();} static double elapsed_system_m() {return PISystemTime::current(true).toMilliseconds();}
//! @brief Returns seconds representation of current system time. //! \brief Returns seconds representation of current system time.
static double elapsed_system_s() {return PISystemTime::current(true).toSeconds();} static double elapsed_system_s() {return PISystemTime::current(true).toSeconds();}
//! @brief Returns time mark of current system time. //! \brief Returns time mark of current system time.
static PISystemTime elapsed_system() {return PISystemTime::current(true);} static PISystemTime elapsed_system() {return PISystemTime::current(true);}
private: private:

View File

@@ -1,5 +1,5 @@
/*! @file pitime_win.h /*! \file pitime_win.h
* @brief PITime conversions for Windows * \brief PITime conversions for Windows
* *
* This file declare time conversions for Windows * This file declare time conversions for Windows
*/ */

View File

@@ -21,7 +21,7 @@
/** \class PIVariant /** \class PIVariant
* @brief Variant type * \brief Variant type
* \details * \details
* \section PIVariant_sec0 Synopsis * \section PIVariant_sec0 Synopsis
* This class provides general type that can contains all standard types, some * This class provides general type that can contains all standard types, some
@@ -220,7 +220,7 @@ PIString PIVariant::typeName(PIVariant::Type type) {
} }
/** @brief Returns variant content as boolean /** \brief Returns variant content as boolean
* \details In case of numeric types returns \b true if value != 0. \n * \details In case of numeric types returns \b true if value != 0. \n
* In case of String type returns \a PIString::toBool(). \n * In case of String type returns \a PIString::toBool(). \n
* In case of StringList type returns \b false if string list is empty, * In case of StringList type returns \b false if string list is empty,
@@ -251,7 +251,7 @@ bool PIVariant::toBool() const {
/** @brief Returns variant content as int /** \brief Returns variant content as int
* \details In case of numeric types returns integer value. \n * \details In case of numeric types returns integer value. \n
* In case of String type returns \a PIString::toInt(). \n * In case of String type returns \a PIString::toInt(). \n
* In case of StringList type returns \b 0 if string list is empty, * In case of StringList type returns \b 0 if string list is empty,
@@ -283,7 +283,7 @@ int PIVariant::toInt() const {
} }
/** @brief Returns variant content as long long /** \brief Returns variant content as long long
* \details In case of numeric types returns integer value. \n * \details In case of numeric types returns integer value. \n
* In case of String type returns \a PIString::toLLong(). \n * In case of String type returns \a PIString::toLLong(). \n
* In case of StringList type returns \b 0L if string list is empty, * In case of StringList type returns \b 0L if string list is empty,
@@ -314,7 +314,7 @@ llong PIVariant::toLLong() const {
} }
/** @brief Returns variant content as float /** \brief Returns variant content as float
* \details In case of numeric types returns float value. \n * \details In case of numeric types returns float value. \n
* In case of String type returns \a PIString::toFloat(). \n * In case of String type returns \a PIString::toFloat(). \n
* In case of StringList type returns \b 0.f if string list is empty, * In case of StringList type returns \b 0.f if string list is empty,
@@ -345,7 +345,7 @@ float PIVariant::toFloat() const {
} }
/** @brief Returns variant content as double /** \brief Returns variant content as double
* \details In case of numeric types returns double value. \n * \details In case of numeric types returns double value. \n
* In case of String type returns \a PIString::toDouble(). \n * In case of String type returns \a PIString::toDouble(). \n
* In case of StringList type returns \b 0. if string list is empty, * In case of StringList type returns \b 0. if string list is empty,
@@ -376,7 +376,7 @@ double PIVariant::toDouble() const {
} }
/** @brief Returns variant content as long double /** \brief Returns variant content as long double
* \details In case of numeric types returns long double value. \n * \details In case of numeric types returns long double value. \n
* In case of String type returns \a PIString::toLDouble(). \n * In case of String type returns \a PIString::toLDouble(). \n
* In case of StringList type returns \b 0. if string list is empty, * In case of StringList type returns \b 0. if string list is empty,
@@ -407,7 +407,7 @@ ldouble PIVariant::toLDouble() const {
} }
/** @brief Returns variant content as time /** \brief Returns variant content as time
* \details In case of Time type returns time value. \n * \details In case of Time type returns time value. \n
* In case of DateTime type returns time part of value. \n * In case of DateTime type returns time part of value. \n
* In case of other types returns \a PITime(). */ * In case of other types returns \a PITime(). */
@@ -420,7 +420,7 @@ PITime PIVariant::toTime() const {
} }
/** @brief Returns variant content as date /** \brief Returns variant content as date
* \details In case of Date type returns date value. \n * \details In case of Date type returns date value. \n
* In case of DateTime type returns date part of value. \n * In case of DateTime type returns date part of value. \n
* In case of other types returns \a PIDate(). */ * In case of other types returns \a PIDate(). */
@@ -433,7 +433,7 @@ PIDate PIVariant::toDate() const {
} }
/** @brief Returns variant content as date and time /** \brief Returns variant content as date and time
* \details In case of Time type returns time value with null date. \n * \details In case of Time type returns time value with null date. \n
* In case of Date type returns date value with null time. \n * In case of Date type returns date value with null time. \n
* In case of DateTime type returns date and time. \n * In case of DateTime type returns date and time. \n
@@ -448,7 +448,7 @@ PIDateTime PIVariant::toDateTime() const {
} }
/** @brief Returns variant content as system time /** \brief Returns variant content as system time
* \details In case of SystemTime type returns system time. \n * \details In case of SystemTime type returns system time. \n
* In case of other types returns \a PISystemTime::fromSeconds() from * In case of other types returns \a PISystemTime::fromSeconds() from
* double value of variant content. */ * double value of variant content. */
@@ -460,7 +460,7 @@ PISystemTime PIVariant::toSystemTime() const {
} }
/** @brief Returns variant content as string /** \brief Returns variant content as string
* \details In case of numeric types returns \a PIString::fromNumber(). \n * \details In case of numeric types returns \a PIString::fromNumber(). \n
* In case of String type returns string value. \n * In case of String type returns string value. \n
* In case of StringList type returns joined string ("(" + PIStringList::join("; ") + ")"). \n * In case of StringList type returns joined string ("(" + PIStringList::join("; ") + ")"). \n
@@ -501,7 +501,7 @@ PIString PIVariant::toString() const {
} }
/** @brief Returns variant content as strings list /** \brief Returns variant content as strings list
* \details In case of StringList type returns strings list value. \n * \details In case of StringList type returns strings list value. \n
* In case of other types returns \a PIStringList with one string value of variant content. */ * In case of other types returns \a PIStringList with one string value of variant content. */
PIStringList PIVariant::toStringList() const { PIStringList PIVariant::toStringList() const {
@@ -513,7 +513,7 @@ PIStringList PIVariant::toStringList() const {
} }
/** @brief Returns variant content as bit array /** \brief Returns variant content as bit array
* \details In case of BitArray type returns bit array value. \n * \details In case of BitArray type returns bit array value. \n
* In case of other types returns \a PIBitArray from \a toLLong() value. */ * In case of other types returns \a PIBitArray from \a toLLong() value. */
PIBitArray PIVariant::toBitArray() const { PIBitArray PIVariant::toBitArray() const {
@@ -524,7 +524,7 @@ PIBitArray PIVariant::toBitArray() const {
} }
/** @brief Returns variant content as byte array /** \brief Returns variant content as byte array
* \details In case of ByteArray type returns byte array value. \n * \details In case of ByteArray type returns byte array value. \n
* In case of other types returns empty \a PIByteArray. */ * In case of other types returns empty \a PIByteArray. */
PIByteArray PIVariant::toByteArray() const { PIByteArray PIVariant::toByteArray() const {
@@ -535,7 +535,7 @@ PIByteArray PIVariant::toByteArray() const {
} }
/** @brief Returns variant content as enum /** \brief Returns variant content as enum
* \details In case of Enum type returns enum value. \n * \details In case of Enum type returns enum value. \n
* In case of String returns Enum with one member. \n * In case of String returns Enum with one member. \n
* In case of StringList returns Enum with corresponding members. \n * In case of StringList returns Enum with corresponding members. \n
@@ -550,7 +550,7 @@ PIVariantTypes::Enum PIVariant::toEnum() const {
} }
/** @brief Returns variant content as file /** \brief Returns variant content as file
* \details In case of File type returns file value. \n * \details In case of File type returns file value. \n
* In case of String returns File with string value path. \n * In case of String returns File with string value path. \n
* In case of other types returns empty File. */ * In case of other types returns empty File. */
@@ -563,7 +563,7 @@ PIVariantTypes::File PIVariant::toFile() const {
} }
/** @brief Returns variant content as dir /** \brief Returns variant content as dir
* \details In case of Dir type returns dir value. \n * \details In case of Dir type returns dir value. \n
* In case of String returns Dir with string value path. \n * In case of String returns Dir with string value path. \n
* In case of other types returns empty Dir. */ * In case of other types returns empty Dir. */
@@ -576,7 +576,7 @@ PIVariantTypes::Dir PIVariant::toDir() const {
} }
/** @brief Returns variant content as color /** \brief Returns variant content as color
* \details In case of Color type returns color value. \n * \details In case of Color type returns color value. \n
* In case of int returns color with int value. \n * In case of int returns color with int value. \n
* In case of other types returns empty Color. */ * In case of other types returns empty Color. */
@@ -589,7 +589,7 @@ PIVariantTypes::Color PIVariant::toColor() const {
} }
/** @brief Returns variant content as IODevice /** \brief Returns variant content as IODevice
* \details In case of IODevice type returns IODevice value. \n * \details In case of IODevice type returns IODevice value. \n
* In case of other types returns empty IODevice. */ * In case of other types returns empty IODevice. */
PIVariantTypes::IODevice PIVariant::toIODevice() const { PIVariantTypes::IODevice PIVariant::toIODevice() const {
@@ -599,7 +599,7 @@ PIVariantTypes::IODevice PIVariant::toIODevice() const {
} }
/** @brief Returns variant content as point /** \brief Returns variant content as point
* \details In case of PIPointd type returns point value. \n * \details In case of PIPointd type returns point value. \n
* In case of other types returns empty PIPointd. */ * In case of other types returns empty PIPointd. */
PIPointd PIVariant::toPoint() const { PIPointd PIVariant::toPoint() const {
@@ -609,7 +609,7 @@ PIPointd PIVariant::toPoint() const {
} }
/** @brief Returns variant content as rect /** \brief Returns variant content as rect
* \details In case of PIRectd type returns rect value. \n * \details In case of PIRectd type returns rect value. \n
* In case of other types returns empty PIRectd. */ * In case of other types returns empty PIRectd. */
PIRectd PIVariant::toRect() const { PIRectd PIVariant::toRect() const {
@@ -619,7 +619,7 @@ PIRectd PIVariant::toRect() const {
} }
/** @brief Returns variant content as rect /** \brief Returns variant content as line
* \details In case of PILined type returns line value. \n * \details In case of PILined type returns line value. \n
* In case of other types returns empty PILined. */ * In case of other types returns empty PILined. */
PILined PIVariant::toLine() const { PILined PIVariant::toLine() const {
@@ -629,7 +629,7 @@ PILined PIVariant::toLine() const {
} }
/** @brief Returns variant content as math vector /** \brief Returns variant content as math vector
* \details In case of PIMathVectord type returns rect value. \n * \details In case of PIMathVectord type returns rect value. \n
* In case of other types returns empty PIMathVectord. */ * In case of other types returns empty PIMathVectord. */
PIMathVectord PIVariant::toMathVector() const { PIMathVectord PIVariant::toMathVector() const {
@@ -639,7 +639,7 @@ PIMathVectord PIVariant::toMathVector() const {
} }
/** @brief Returns variant content as math matrix /** \brief Returns variant content as math matrix
* \details In case of PIMathMatrixd type returns rect value. \n * \details In case of PIMathMatrixd type returns rect value. \n
* In case of other types returns empty PIMathMatrixd. */ * In case of other types returns empty PIMathMatrixd. */
PIMathMatrixd PIVariant::toMathMatrix() const { PIMathMatrixd PIVariant::toMathMatrix() const {

View File

@@ -1,5 +1,5 @@
/*! @file pivariant.h /*! \file pivariant.h
* @brief Variant type * \brief Variant type
* *
* This file declares PIVariant * This file declares PIVariant
*/ */
@@ -468,7 +468,7 @@ public:
PIMathMatrixd toMathMatrix() const; PIMathMatrixd toMathMatrix() const;
/** @brief Returns variant content as custom type /** \brief Returns variant content as custom type
* \details In case of known types this function equivalent \a to<Type> function. \n * \details In case of known types this function equivalent \a to<Type> function. \n
* Otherwise returns content as type T. */ * Otherwise returns content as type T. */
template<typename T> template<typename T>
@@ -561,7 +561,7 @@ public:
void swap(PIVariant & v); void swap(PIVariant & v);
/** @brief Returns new variant from custom type /** \brief Returns new variant from custom type
* \details In case of known types this function equivalent \a PIVariant(T) constructors. \n * \details In case of known types this function equivalent \a PIVariant(T) constructors. \n
* Otherwise returns variant with content \a v and type Custom. */ * Otherwise returns variant with content \a v and type Custom. */
template <typename T> template <typename T>

View File

@@ -1,5 +1,5 @@
/*! @file pivariantsimple.h /*! \file pivariantsimple.h
* @brief Variant simple type * \brief Variant simple type
* *
* This file declares PIVariantSimple * This file declares PIVariantSimple
*/ */

View File

@@ -1,5 +1,5 @@
/*! @file pivarianttypes.h /*! \file pivarianttypes.h
* @brief Variant type * \brief Variant type
* *
* This file declares PIVariant * This file declares PIVariant
*/ */
@@ -34,7 +34,7 @@ class PIPropertyStorage;
namespace PIVariantTypes { namespace PIVariantTypes {
/** /**
* @brief name-value pair * \brief name-value pair
*/ */
struct PIP_EXPORT Enumerator { struct PIP_EXPORT Enumerator {
Enumerator(int v = 0, const PIString & n = PIString()): value(v), name(n) {} Enumerator(int v = 0, const PIString & n = PIString()): value(v), name(n) {}
@@ -43,26 +43,26 @@ struct PIP_EXPORT Enumerator {
}; };
/** /**
* @brief Collection of PIVariantTypes::Enumerator. It's replace classic c-style enum. * \brief Collection of PIVariantTypes::Enumerator. It's replace classic c-style enum.
* Contains elements with unique name and not uniqueue values. * Contains elements with unique name and not uniqueue values.
*/ */
struct PIP_EXPORT Enum { struct PIP_EXPORT Enum {
Enum(const PIString & n = PIString()): enum_name(n) {} Enum(const PIString & n = PIString()): enum_name(n) {}
/** /**
* @brief Find selected value. * \brief Find selected value.
* @return selected value, otherwrise 0 * @return selected value, otherwrise 0
*/ */
int selectedValue() const; int selectedValue() const;
/** /**
* @brief Get selected name * \brief Get selected name
* @return selected name, otherwrise empty PIString * @return selected name, otherwrise empty PIString
*/ */
PIString selectedName() const {return selected;} PIString selectedName() const {return selected;}
/** /**
* @brief Select value if exists in Enum. If Enum contains several PIVariantTypes::Enumerator with same values, * \brief Select value if exists in Enum. If Enum contains several PIVariantTypes::Enumerator with same values,
* first PIVariantTypes::Enumerator will selected * first PIVariantTypes::Enumerator will selected
* @param v value for selection * @param v value for selection
* @return true if value exists in Enum, false otherwrise * @return true if value exists in Enum, false otherwrise
@@ -70,55 +70,55 @@ struct PIP_EXPORT Enum {
bool selectValue(int v); bool selectValue(int v);
/** /**
* @brief Select name if exists in enum * \brief Select name if exists in enum
* @param n name for selection * @param n name for selection
* @return true if name exists in Enum, false otherwrise * @return true if name exists in Enum, false otherwrise
*/ */
bool selectName(const PIString & n); bool selectName(const PIString & n);
/** /**
* @brief Find PIVariantTypes::Enumerator with specific name and return it value * \brief Find PIVariantTypes::Enumerator with specific name and return it value
* @param n name for search * @param n name for search
* @return value of founded PIVariantTypes::Enumerator, 0 otherwrise * @return value of founded PIVariantTypes::Enumerator, 0 otherwrise
*/ */
int value(const PIString & n) const; int value(const PIString & n) const;
/** /**
* @brief Find first PIVariantTypes::Enumerator with specific value and return it name * \brief Find first PIVariantTypes::Enumerator with specific value and return it name
* @param v value for search * @param v value for search
* @return name of founded PIVariantTypes::Enumerator, empty string otherwrise * @return name of founded PIVariantTypes::Enumerator, empty string otherwrise
*/ */
PIString name(int v) const; PIString name(int v) const;
/** /**
* @brief Make vector of Enum values * \brief Make vector of Enum values
*/ */
PIVector<int> values() const; PIVector<int> values() const;
/** /**
* @brief Make vector of Enum names * \brief Make vector of Enum names
*/ */
PIStringList names() const; PIStringList names() const;
/** /**
* @brief Add PIVariantTypes::Enumerator to Enum * \brief Add PIVariantTypes::Enumerator to Enum
*/ */
Enum & operator <<(const Enumerator & v); Enum & operator <<(const Enumerator & v);
/** /**
* @brief Add PIVariantTypes::Enumerator element to Enum. Element contains specific name and value more per * \brief Add PIVariantTypes::Enumerator element to Enum. Element contains specific name and value more per
* unit then last element. If the is no elements, contains zero value. * unit then last element. If the is no elements, contains zero value.
* @param v name for new PIVariantTypes::Enumerator element * @param v name for new PIVariantTypes::Enumerator element
*/ */
Enum & operator <<(const PIString & v); Enum & operator <<(const PIString & v);
/** /**
* @brief Add PIVariantTypes::Enumerator element for each name in vector * \brief Add PIVariantTypes::Enumerator element for each name in vector
*/ */
Enum & operator <<(const PIStringList & v); Enum & operator <<(const PIStringList & v);
/** /**
* @brief Return true if Enum is empty * \brief Return true if Enum is empty
*/ */
bool isEmpty() const {return enum_list.isEmpty();} bool isEmpty() const {return enum_list.isEmpty();}

View File

@@ -1,5 +1,5 @@
/*! @file piauth.h /*! \file piauth.h
* @brief PIP Authentication API * \brief PIP Authentication API
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file picrypt.h /*! \file picrypt.h
* @brief Cryptographic class using lib Sodium * \brief Cryptographic class using lib Sodium
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file piellipsoidmodel.h /*! \file piellipsoidmodel.h
* @brief Contains geo ellipsoid models * \brief Contains geo ellipsoid models
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -1,5 +1,5 @@
/*! @file pigeoposition.h /*! \file pigeoposition.h
* @brief Class for geo position storage and conversions * \brief Class for geo position storage and conversions
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -24,7 +24,7 @@
#define PIBINARYLOG_VERSION_OLD 0x31 #define PIBINARYLOG_VERSION_OLD 0x31
/*! \class PIBinaryLog /*! \class PIBinaryLog
* @brief Class for read and write binary data to logfile, and playback this data in realtime, or custom speed * \brief Class for read and write binary data to logfile, and playback this data in realtime, or custom speed
* *
* \section PIBinaryLog_sec0 Synopsis * \section PIBinaryLog_sec0 Synopsis
* Binary Log is a file with simple header, where you can read and write some binary data. * Binary Log is a file with simple header, where you can read and write some binary data.

View File

@@ -1,5 +1,5 @@
/*! @file pibinarylog.h /*! \file pibinarylog.h
* @brief Binary log * \brief Binary log
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -33,14 +33,14 @@ public:
explicit PIBinaryLog(); explicit PIBinaryLog();
virtual ~PIBinaryLog(); virtual ~PIBinaryLog();
//! @brief Play modes for \a PIBinaryLog //! \brief Play modes for \a PIBinaryLog
enum PlayMode { enum PlayMode {
PlayRealTime /*! Play in system realtime, default mode */ , PlayRealTime /*! Play in system realtime, default mode */ ,
PlayVariableSpeed /*! Play in software realtime with speed, set by \a setSpeed */ , PlayVariableSpeed /*! Play in software realtime with speed, set by \a setSpeed */ ,
PlayStaticDelay /*! Play with custom static delay, ignoring timestamp */ PlayStaticDelay /*! Play with custom static delay, ignoring timestamp */
}; };
//! @brief Different split modes for writing \a PIBinaryLog, which can separate files by size, by time or by records count //! \brief Different split modes for writing \a PIBinaryLog, which can separate files by size, by time or by records count
enum SplitMode { enum SplitMode {
SplitNone /*! Without separate, default mode */ , SplitNone /*! Without separate, default mode */ ,
SplitTime /*! Separate files by record time */ , SplitTime /*! Separate files by record time */ ,
@@ -48,7 +48,7 @@ public:
SplitCount /*! Separate files by records count */ SplitCount /*! Separate files by records count */
}; };
//! @brief Struct contains information about all records with same ID //! \brief Struct contains information about all records with same ID
struct PIP_EXPORT BinLogRecordInfo { struct PIP_EXPORT BinLogRecordInfo {
BinLogRecordInfo() { BinLogRecordInfo() {
id = count = 0; id = count = 0;
@@ -62,7 +62,7 @@ public:
PISystemTime end_time; PISystemTime end_time;
}; };
//! @brief Struct contains full information about Binary Log file and about all Records using map of \a BinLogRecordInfo //! \brief Struct contains full information about Binary Log file and about all Records using map of \a BinLogRecordInfo
struct PIP_EXPORT BinLogInfo { struct PIP_EXPORT BinLogInfo {
PIString path; PIString path;
int records_count; int records_count;
@@ -73,7 +73,7 @@ public:
PIByteArray user_header; PIByteArray user_header;
}; };
//! @brief Struct contains position, ID and timestamp of record in file //! \brief Struct contains position, ID and timestamp of record in file
struct PIP_EXPORT BinLogIndex { struct PIP_EXPORT BinLogIndex {
int id; int id;
int data_size; int data_size;
@@ -256,7 +256,7 @@ public:
//! \{ //! \{
//! \fn PIString createNewFile() //! \fn PIString createNewFile()
//! @brief Create new binlog file in \a logDir, if successful returns filename, else returns empty string. //! \brief Create new binlog file in \a logDir, if successful returns filename, else returns empty string.
//! Filename is like \a filePrefix + "yyyy_MM_dd__hh_mm_ss.binlog" //! Filename is like \a filePrefix + "yyyy_MM_dd__hh_mm_ss.binlog"
//! \} //! \}
@@ -264,13 +264,13 @@ public:
//! \{ //! \{
//! \fn void fileEnd() //! \fn void fileEnd()
//! @brief Raise on file end while reading //! \brief Raise on file end while reading
//! \fn void fileError() //! \fn void fileError()
//! @brief Raise on file creation error //! \brief Raise on file creation error
//! \fn void newFile(const PIString & filename) //! \fn void newFile(const PIString & filename)
//! @brief Raise on new file created //! \brief Raise on new file created
//! \} //! \}
@@ -331,7 +331,7 @@ private:
PIByteArray user_header; PIByteArray user_header;
}; };
//! \relatesalso PICout @brief Output operator PIBinaryLog::BinLogInfo to PICout //! \relatesalso PICout \brief Output operator PIBinaryLog::BinLogInfo to PICout
inline PICout operator <<(PICout s, const PIBinaryLog::BinLogInfo & bi) { inline PICout operator <<(PICout s, const PIBinaryLog::BinLogInfo & bi) {
s.space(); s.space();
s.setControl(0, true); s.setControl(0, true);

View File

@@ -1,5 +1,5 @@
/*! @file pican.h /*! \file pican.h
* @brief CAN device * \brief CAN device
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -26,7 +26,7 @@
# include <iostream> # include <iostream>
#endif #endif
/*! \class PIConfig /*! \class PIConfig
* @brief Configuration file * \brief Configuration file
* \details This class provide handle access to configuration file. * \details This class provide handle access to configuration file.
* *
* \section PIConfig_sec0 Synopsis * \section PIConfig_sec0 Synopsis
@@ -67,7 +67,7 @@
*/ */
/*! \class PIConfig::Entry /*! \class PIConfig::Entry
* @brief %Entry of configuration file * \brief %Entry of configuration file
* \details This class is node of internal PIConfig tree. * \details This class is node of internal PIConfig tree.
* %Entry provide access to elements of PIConfig. Each entry has * %Entry provide access to elements of PIConfig. Each entry has
* children or next properties: * children or next properties:
@@ -91,7 +91,7 @@
*/ */
/*! \class PIConfig::Branch /*! \class PIConfig::Branch
* @brief %Branch is a list of entries of configuration file * \brief %Branch is a list of entries of configuration file
* \details %Branch provides some features to get entries lists. * \details %Branch provides some features to get entries lists.
* \snippet piconfig.cpp PIConfig::Branch * \snippet piconfig.cpp PIConfig::Branch
* *

View File

@@ -1,5 +1,5 @@
/*! @file piconfig.h /*! \file piconfig.h
* @brief Configuration parser and writer * \brief Configuration parser and writer
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -148,7 +148,7 @@ public:
//! Returns comment //! Returns comment
const PIString & comment() const {return _comment;} const PIString & comment() const {return _comment;}
/** @brief Returns full name, i.e. name as it looks in file /** \brief Returns full name, i.e. name as it looks in file
* \details In case of default entry full name always is empty * \details In case of default entry full name always is empty
* \snippet piconfig.cpp fullName */ * \snippet piconfig.cpp fullName */
const PIString & fullName() const {return _full_name;} const PIString & fullName() const {return _full_name;}
@@ -205,7 +205,7 @@ public:
Entry & setValue(const double value) {setValue(PIString::fromNumber(value)); setType("f"); return *this;} Entry & setValue(const double value) {setValue(PIString::fromNumber(value)); setType("f"); return *this;}
/** @brief Returns entry with name "vname" and default value "def" /** \brief Returns entry with name "vname" and default value "def"
* \details If there is no suitable entry found, reference to default internal entry with * \details If there is no suitable entry found, reference to default internal entry with
* value = "def" will be returned, and if "exists" not null it will be set to \b false */ * value = "def" will be returned, and if "exists" not null it will be set to \b false */
Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0); Entry & getValue(const PIString & vname, const PIString & def = PIString(), bool * exists = 0);
@@ -213,43 +213,43 @@ public:
PICONFIG_GET_VALUE PICONFIG_GET_VALUE
//! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const bool def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const bool def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const short def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const short def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const int def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const int def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const long def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const long def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const uint def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const uint def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const float def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const float def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const double def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const double def, bool * exists = 0)
//! @brief Returns entry with name "vname" and default value "def" //! \brief Returns entry with name "vname" and default value "def"
//! Find all entries with names with substrings "vname" and returns them as \a PIConfig::Branch //! Find all entries with names with substrings "vname" and returns them as \a PIConfig::Branch
@@ -341,43 +341,43 @@ public:
PICONFIG_GET_VALUE PICONFIG_GET_VALUE
//! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const char * def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const PIStringList & def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const bool def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const bool def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const short def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const short def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const int def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const int def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const long def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const long def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const uchar def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const ushort def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const uint def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const uint def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const ulong def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const float def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const float def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! \fn Entry & getValue(const PIString & vname, const double def, bool * exists = 0) //! \fn Entry & getValue(const PIString & vname, const double def, bool * exists = 0)
//! @brief Returns top-level entry with name "vname" and default value "def" //! \brief Returns top-level entry with name "vname" and default value "def"
//! Returns top-level entries with names with substrings "vname" //! Returns top-level entries with names with substrings "vname"
@@ -517,7 +517,7 @@ inline PICout operator <<(PICout s, const PIConfig::Entry & v) {
/** \relatesalso PIConfig \relatesalso PIIODevice /** \relatesalso PIConfig \relatesalso PIIODevice
* @brief Service function. useful for configuring devices * \brief Service function. useful for configuring devices
* \details Function takes entry name "name", default value "def" and two * \details Function takes entry name "name", default value "def" and two
* \a PIConfig::Entry sections: "em" and their parent "ep". If there is no * \a PIConfig::Entry sections: "em" and their parent "ep". If there is no
* parent ep = 0. If "ep" is not null and entry "name" exists in "ep" function * parent ep = 0. If "ep" is not null and entry "name" exists in "ep" function

View File

@@ -46,7 +46,7 @@ extern "C" {
#endif #endif
/*! \class PIDir /*! \class PIDir
* @brief Local directory * \brief Local directory
* *
* \section PIDir_sec0 Synopsis * \section PIDir_sec0 Synopsis
* This class provide access to local file. You can manipulate * This class provide access to local file. You can manipulate

View File

@@ -1,5 +1,5 @@
/*! @file pidir.h /*! \file pidir.h
* @brief Local directory * \brief Local directory
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -57,7 +57,7 @@ public:
//! Returns absolute path of this directory //! Returns absolute path of this directory
PIString absolutePath() const; PIString absolutePath() const;
/** @brief Simplify path of this directory /** \brief Simplify path of this directory
* \details This function remove repeatedly separators and * \details This function remove repeatedly separators and
* resolve ".." in path. E.g. "/home/.//peri4/src/../.." will * resolve ".." in path. E.g. "/home/.//peri4/src/../.." will
* become "/home" \n This function returns reference to this %PIDir */ * become "/home" \n This function returns reference to this %PIDir */
@@ -76,7 +76,7 @@ public:
bool setCurrent() {return PIDir::setCurrent(path());} bool setCurrent() {return PIDir::setCurrent(path());}
/** @brief Returns this directory content /** \brief Returns this directory content
* \details Scan this directory and returns all directories * \details Scan this directory and returns all directories
* and files in one list, sorted alphabetically. This list * and files in one list, sorted alphabetically. This list
* contains also "." and ".." members. There are absolute * contains also "." and ".." members. There are absolute
@@ -85,7 +85,7 @@ public:
* directories! */ * directories! */
PIVector<PIFile::FileInfo> entries(); PIVector<PIFile::FileInfo> entries();
/** @brief Returns all this directory content /** \brief Returns all this directory content
* \details Scan this directory recursively and returns all * \details Scan this directory recursively and returns all
* directories and files in one list, sorted alphabetically. * directories and files in one list, sorted alphabetically.
* This list doesn`t contains "." and ".." members. There * This list doesn`t contains "." and ".." members. There

View File

@@ -69,9 +69,11 @@
#include <errno.h> #include <errno.h>
/** \class PIEthernet /** \class PIEthernet piethernet.h
* @brief Ethernet device * \brief
* \details * Ethernet device
*
* \details
* \section PIEthernet_sec0 Synopsis * \section PIEthernet_sec0 Synopsis
* %PIEthernet designed to work with IPv4 network via two protocols: * %PIEthernet designed to work with IPv4 network via two protocols:
* UDP and TCP. This class allow you send and receive packets to/from * UDP and TCP. This class allow you send and receive packets to/from

View File

@@ -1,5 +1,5 @@
/*! @file piethernet.h /*! \file piethernet.h
* @brief Ethernet device * \brief Ethernet device
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -42,7 +42,7 @@ public:
//! Contructs UDP %PIEthernet with empty read address //! Contructs UDP %PIEthernet with empty read address
explicit PIEthernet(); explicit PIEthernet();
//! @brief Type of %PIEthernet //! \brief Type of %PIEthernet
enum Type { enum Type {
UDP /** UDP - User Datagram Protocol */ , UDP /** UDP - User Datagram Protocol */ ,
TCP_Client /** TCP client - allow connection to TCP server */ , TCP_Client /** TCP client - allow connection to TCP server */ ,
@@ -50,7 +50,7 @@ public:
TCP_SingleTCP /** TCP client single mode - connect & send & disconnect, on each packet */ TCP_SingleTCP /** TCP client single mode - connect & send & disconnect, on each packet */
}; };
//! @brief Parameters of %PIEthernet //! \brief Parameters of %PIEthernet
enum Parameters { enum Parameters {
ReuseAddress /** Rebind address if there is already binded. Enabled by default */ = 0x1, ReuseAddress /** Rebind address if there is already binded. Enabled by default */ = 0x1,
Broadcast /** Broadcast send. Disabled by default */ = 0x2, Broadcast /** Broadcast send. Disabled by default */ = 0x2,
@@ -62,7 +62,7 @@ public:
}; };
//! @brief IPv4 network address, IP and port //! \brief IPv4 network address, IP and port
class PIP_EXPORT Address { class PIP_EXPORT Address {
friend class PIEthernet; friend class PIEthernet;
public: public:
@@ -421,37 +421,37 @@ public:
//! \{ //! \{
//! \fn void newConnection(PIEthernet * client) //! \fn void newConnection(PIEthernet * client)
//! @brief Raise on new TCP connection received //! \brief Raise on new TCP connection received
//! \fn void connected() //! \fn void connected()
//! @brief Raise if succesfull TCP connection //! \brief Raise if succesfull TCP connection
//! \fn void disconnected(bool withError) //! \fn void disconnected(bool withError)
//! @brief Raise if TCP connection was closed //! \brief Raise if TCP connection was closed
//! \} //! \}
//! \ioparams //! \ioparams
//! \{ //! \{
#ifdef DOXYGEN #ifdef DOXYGEN
//! @brief read ip, default "" //! \brief read ip, default ""
string ip; string ip;
//! @brief read port, default 0 //! \brief read port, default 0
int port; int port;
//! @brief ethernet parameters //! \brief ethernet parameters
int parameters; int parameters;
//! @brief read timeout, default 1000 ms //! \brief read timeout, default 1000 ms
double readTimeout; double readTimeout;
//! @brief write timeout, default 1000 ms //! \brief write timeout, default 1000 ms
double writeTimeout; double writeTimeout;
//! @brief time-to-live, default 64 //! \brief time-to-live, default 64
int TTL; int TTL;
//! @brief time-to-live for multicast, default 1 //! \brief time-to-live for multicast, default 1
int multicastTTL; int multicastTTL;
#endif #endif
//! \} //! \}

View File

@@ -70,7 +70,7 @@
#endif #endif
/*! \class PIFile /*! \class PIFile
* @brief Local file * \brief Local file
* *
* \section PIFile_sec0 Synopsis * \section PIFile_sec0 Synopsis
* This class provide access to local file. You can manipulate * This class provide access to local file. You can manipulate

View File

@@ -1,5 +1,5 @@
/*! @file pifile.h /*! \file pifile.h
* @brief Local file * \brief Local file
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -267,16 +267,16 @@ public:
//! \{ //! \{
//! \fn void clear() //! \fn void clear()
//! @brief Clear content of file //! \brief Clear content of file
//! \fn void resize(llong new_size) //! \fn void resize(llong new_size)
//! @brief Resize file to "new_size" with "fill" filling //! \brief Resize file to "new_size" with "fill" filling
//! \fn void resize(llong new_size, uchar fill) //! \fn void resize(llong new_size, uchar fill)
//! @brief Resize file to "new_size" with "fill" filling //! \brief Resize file to "new_size" with "fill" filling
//! \fn void remove() //! \fn void remove()
//! @brief Remove file //! \brief Remove file
//! \} //! \}
//! \ioparams //! \ioparams

View File

@@ -29,7 +29,7 @@
/*! \class PIGPIO /*! \class PIGPIO
* @brief GPIO support * \brief GPIO support
* *
* \section PIGPIO_sec0 Synopsis * \section PIGPIO_sec0 Synopsis
* This class provide initialize, get/set and watch functions for GPIO. * This class provide initialize, get/set and watch functions for GPIO.

View File

@@ -1,5 +1,5 @@
/*! @file pigpio.h /*! \file pigpio.h
* @brief GPIO * \brief GPIO
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives
@@ -33,41 +33,41 @@ public:
PIGPIO(); PIGPIO();
virtual ~PIGPIO(); virtual ~PIGPIO();
//! @brief Work mode for pin //! \brief Work mode for pin
enum Direction { enum Direction {
In /** Input direction (read) */, In /** Input direction (read) */,
Out /** Output direction (write) */ Out /** Output direction (write) */
}; };
//! @brief Returns singleton object of %PIGPIO //! \brief Returns singleton object of %PIGPIO
static PIGPIO * instance(); static PIGPIO * instance();
//! @brief Initialize pin \"gpio_num\" for \"dir\" mode //! \brief Initialize pin \"gpio_num\" for \"dir\" mode
void initPin(int gpio_num, Direction dir = PIGPIO::In); void initPin(int gpio_num, Direction dir = PIGPIO::In);
//! @brief Set pin \"gpio_num\" value to \"value\" //! \brief Set pin \"gpio_num\" value to \"value\"
void pinSet (int gpio_num, bool value); void pinSet (int gpio_num, bool value);
//! @brief Set pin \"gpio_num\" value to \b true //! \brief Set pin \"gpio_num\" value to \b true
void pinHigh (int gpio_num) {pinSet(gpio_num, true );} void pinHigh (int gpio_num) {pinSet(gpio_num, true );}
//! @brief Set pin \"gpio_num\" value to \b false //! \brief Set pin \"gpio_num\" value to \b false
void pinLow (int gpio_num) {pinSet(gpio_num, false);} void pinLow (int gpio_num) {pinSet(gpio_num, false);}
//! @brief Returns pin \"gpio_num\" state //! \brief Returns pin \"gpio_num\" state
bool pinState(int gpio_num); bool pinState(int gpio_num);
//! @brief Starts watch for pin \"gpio_num\". //! \brief Starts watch for pin \"gpio_num\".
//! \details Pins watching starts only with \a PIThread::start() function! //! \details Pins watching starts only with \a PIThread::start() function!
//! This function doesn`t affect thread state //! This function doesn`t affect thread state
void pinBeginWatch(int gpio_num); void pinBeginWatch(int gpio_num);
//! @brief End watch for pin \"gpio_num\". //! \brief End watch for pin \"gpio_num\".
//! \details Pins watching starts only with \a PIThread::start() function! //! \details Pins watching starts only with \a PIThread::start() function!
//! This function doesn`t affect thread state //! This function doesn`t affect thread state
void pinEndWatch (int gpio_num); void pinEndWatch (int gpio_num);
//! @brief End watch for all pins. //! \brief End watch for all pins.
//! \details Pins watching starts only with \a PIThread::start() function! //! \details Pins watching starts only with \a PIThread::start() function!
//! This function doesn`t affect thread state //! This function doesn`t affect thread state
void clearWatch(); void clearWatch();
@@ -78,7 +78,7 @@ public:
//! \{ //! \{
//! \fn void pinChanged(int gpio_num, bool new_value) //! \fn void pinChanged(int gpio_num, bool new_value)
//! @brief Raise on pin \"gpio_num\" state changes to \"new_value\" //! \brief Raise on pin \"gpio_num\" state changes to \"new_value\"
//! \details Important! This event will be raised only with started //! \details Important! This event will be raised only with started
//! thread. //! thread.

View File

@@ -21,7 +21,7 @@
/*! \class PIIOByteArray /*! \class PIIOByteArray
* @brief PIIODevice wrapper around PIByteArray * \brief PIIODevice wrapper around PIByteArray
* *
* \section PIIOByteArray_sec0 Synopsis * \section PIIOByteArray_sec0 Synopsis
* This class sllow you to use PIByteArray as PIIODevice and pass it to, e.g. PIConfig * This class sllow you to use PIByteArray as PIIODevice and pass it to, e.g. PIConfig

View File

@@ -1,5 +1,5 @@
/*! @file piiobytearray.h /*! \file piiobytearray.h
* @brief PIIODevice wrapper around PIByteArray * \brief PIIODevice wrapper around PIByteArray
*/ */
/* /*
PIP - Platform Independent Primitives PIP - Platform Independent Primitives

View File

@@ -24,7 +24,7 @@
/*! \class PIIODevice /*! \class PIIODevice
* @brief Base class for input/output classes * \brief Base class for input/output classes
* *
* \section PIIODevice_sec0 Synopsis * \section PIIODevice_sec0 Synopsis
* This class provide open/close logic, threaded read/write and virtual input/output * This class provide open/close logic, threaded read/write and virtual input/output
@@ -125,7 +125,7 @@ PIIODevice::PIIODevice(): PIThread() {
} }
/*! @brief Constructs a PIIODevice with path and mode /*! \brief Constructs a PIIODevice with path and mode
* \param path path to device * \param path path to device
* \param type mode for open */ * \param type mode for open */
PIIODevice::PIIODevice(const PIString & path, PIIODevice::DeviceMode mode): PIThread() { PIIODevice::PIIODevice(const PIString & path, PIIODevice::DeviceMode mode): PIThread() {

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