diff --git a/.clang-format b/.clang-format
new file mode 100644
index 0000000..3ed6866
--- /dev/null
+++ b/.clang-format
@@ -0,0 +1,104 @@
+Language: Cpp
+# BasedOnStyle: Google
+AccessModifierOffset: -2
+AlignAfterOpenBracket: Align
+AlignConsecutiveAssignments: true
+AlignConsecutiveDeclarations: false
+AlignEscapedNewlines: Right
+AlignOperands: true
+AlignTrailingComments: true
+AllowAllParametersOfDeclarationOnNextLine: true
+AllowShortBlocksOnASingleLine: false
+AllowShortCaseLabelsOnASingleLine: false
+AllowShortFunctionsOnASingleLine: Inline
+AllowShortIfStatementsOnASingleLine: false
+AllowShortLoopsOnASingleLine: true
+AlwaysBreakAfterDefinitionReturnType: None
+AlwaysBreakAfterReturnType: TopLevelDefinitions
+AlwaysBreakBeforeMultilineStrings: true
+AlwaysBreakTemplateDeclarations: true
+BinPackArguments: false
+BinPackParameters: false
+BreakBeforeBraces : Custom
+BraceWrapping:
+ AfterClass: false
+ AfterControlStatement: false
+ AfterEnum: false
+ AfterFunction: true
+ AfterNamespace: false
+ AfterObjCDeclaration: false
+ AfterStruct: false
+ AfterUnion: false
+ BeforeCatch: true
+ BeforeElse: true
+ IndentBraces: false
+ SplitEmptyFunction: true
+ SplitEmptyRecord: true
+ SplitEmptyNamespace: true
+BreakBeforeBinaryOperators: None
+BreakBeforeInheritanceComma: true
+BreakBeforeTernaryOperators: true
+BreakConstructorInitializers: BeforeColon
+BreakAfterJavaFieldAnnotations: false
+BreakStringLiterals: true
+ColumnLimit: 80
+CommentPragmas: '^ IWYU pragma:'
+CompactNamespaces: false
+ConstructorInitializerAllOnOneLineOrOnePerLine: true
+ConstructorInitializerIndentWidth: 4
+ContinuationIndentWidth: 4
+Cpp11BracedListStyle: true
+DerivePointerAlignment: false
+DisableFormat: false
+ExperimentalAutoDetectBinPacking: false
+FixNamespaceComments: true
+ForEachMacros:
+ - foreach
+ - Q_FOREACH
+ - BOOST_FOREACH
+IncludeCategories:
+ - Regex: '^<.*\.h>'
+ Priority: 1
+ - Regex: '^<.*'
+ Priority: 2
+ - Regex: '.*'
+ Priority: 3
+IncludeIsMainRegex: '([-_](test|unittest))?$'
+IndentCaseLabels: false
+IndentWidth: 2
+IndentWrappedFunctionNames: false
+JavaScriptQuotes: Leave
+JavaScriptWrapImports: true
+KeepEmptyLinesAtTheStartOfBlocks: false
+MacroBlockBegin: ''
+MacroBlockEnd: ''
+MaxEmptyLinesToKeep: 1
+NamespaceIndentation: None
+ObjCBlockIndentWidth: 2
+ObjCSpaceAfterProperty: false
+ObjCSpaceBeforeProtocolList: false
+PenaltyBreakAssignment: 2
+PenaltyBreakBeforeFirstCallParameter: 1
+PenaltyBreakComment: 300
+PenaltyBreakFirstLessLess: 120
+PenaltyBreakString: 1000
+PenaltyExcessCharacter: 1000000
+PenaltyReturnTypeOnItsOwnLine: 200
+PointerAlignment: Left
+ReflowComments: true
+SortIncludes: true
+SortUsingDeclarations: true
+SpaceAfterCStyleCast: true
+SpaceAfterTemplateKeyword: true
+SpaceBeforeAssignmentOperators: true
+SpaceBeforeParens: ControlStatements
+SpaceInEmptyParentheses: false
+SpacesBeforeTrailingComments: 2
+SpacesInAngles: false
+SpacesInContainerLiterals: false
+SpacesInCStyleCastParentheses: false
+SpacesInParentheses: false
+SpacesInSquareBrackets: false
+Standard: Cpp11
+TabWidth: 2
+UseTab: Never
diff --git a/.clang-tidy b/.clang-tidy
new file mode 100644
index 0000000..2df8804
--- /dev/null
+++ b/.clang-tidy
@@ -0,0 +1,411 @@
+---
+Checks: 'clang-diagnostic-*,clang-analyzer-*,*'
+WarningsAsErrors: ''
+HeaderFilterRegex: ''
+AnalyzeTemporaryDtors: false
+User: brgirgis
+CheckOptions:
+ - key: cert-dcl59-cpp.HeaderFileExtensions
+ value: h,hh,hpp,hxx
+ - key: cert-err09-cpp.CheckThrowTemporaries
+ value: '1'
+ - key: cert-err61-cpp.CheckThrowTemporaries
+ value: '1'
+ - key: cert-oop11-cpp.IncludeStyle
+ value: llvm
+ - key: cppcoreguidelines-pro-bounds-constant-array-index.GslHeader
+ value: ''
+ - key: cppcoreguidelines-pro-bounds-constant-array-index.IncludeStyle
+ value: '0'
+ - key: cppcoreguidelines-pro-type-member-init.IgnoreArrays
+ value: '0'
+ - key: google-build-namespaces.HeaderFileExtensions
+ value: h,hh,hpp,hxx
+ - key: google-global-names-in-headers.HeaderFileExtensions
+ value: h
+ - key: google-readability-braces-around-statements.ShortStatementLines
+ value: '1'
+ - key: google-readability-function-size.BranchThreshold
+ value: '100'
+ - key: google-readability-function-size.LineThreshold
+ value: '300'
+ - key: google-readability-function-size.StatementThreshold
+ value: '5'
+ - key: google-readability-namespace-comments.ShortNamespaceLines
+ value: '10'
+ - key: google-readability-namespace-comments.SpacesBeforeComments
+ value: '2'
+ - key: google-runtime-int.SignedTypePrefix
+ value: int
+ - key: google-runtime-int.TypeSuffix
+ value: ''
+ - key: google-runtime-int.UnsignedTypePrefix
+ value: uint
+ - key: google-runtime-references.WhiteListTypes
+ value: ''
+ - key: llvm-header-guard.HeaderFileExtensions
+ value: ',h,hh,hpp,hxx'
+ - key: llvm-namespace-comment.ShortNamespaceLines
+ value: '1'
+ - key: llvm-namespace-comment.SpacesBeforeComments
+ value: '2'
+ - key: misc-argument-comment.StrictMode
+ value: '0'
+ - key: misc-assert-side-effect.AssertMacros
+ value: assert
+ - key: misc-assert-side-effect.CheckFunctionCalls
+ value: '0'
+ - key: misc-dangling-handle.HandleClasses
+ value: 'std::basic_string_view;std::experimental::basic_string_view'
+ - key: misc-definitions-in-headers.HeaderFileExtensions
+ value: ',h,hh,hpp,hxx'
+ - key: misc-definitions-in-headers.UseHeaderFileExtension
+ value: '0'
+ - key: misc-misplaced-widening-cast.CheckImplicitCasts
+ value: '1'
+ - key: misc-move-constructor-init.IncludeStyle
+ value: llvm
+ - key: misc-sizeof-expression.WarnOnSizeOfCompareToConstant
+ value: '1'
+ - key: misc-sizeof-expression.WarnOnSizeOfConstant
+ value: '1'
+ - key: misc-sizeof-expression.WarnOnSizeOfThis
+ value: '1'
+ - key: misc-string-constructor.LargeLengthThreshold
+ value: '8388608'
+ - key: misc-string-constructor.WarnOnLargeLength
+ value: '1'
+ - key: misc-suspicious-enum-usage.StrictMode
+ value: '0'
+ - key: misc-suspicious-missing-comma.MaxConcatenatedTokens
+ value: '5'
+ - key: misc-suspicious-missing-comma.RatioThreshold
+ value: '0.200000'
+ - key: misc-suspicious-missing-comma.SizeThreshold
+ value: '5'
+ - key: misc-suspicious-string-compare.StringCompareLikeFunctions
+ value: ''
+ - key: misc-suspicious-string-compare.WarnOnImplicitComparison
+ value: '1'
+ - key: misc-suspicious-string-compare.WarnOnLogicalNotComparison
+ value: '0'
+ - key: misc-throw-by-value-catch-by-reference.CheckThrowTemporaries
+ value: '1'
+ - key: modernize-loop-convert.MaxCopySize
+ value: '16'
+ - key: modernize-loop-convert.MinConfidence
+ value: reasonable
+ - key: modernize-loop-convert.NamingStyle
+ value: CamelCase
+ - key: modernize-pass-by-value.IncludeStyle
+ value: llvm
+ - key: modernize-pass-by-value.ValuesOnly
+ value: '0'
+ - key: modernize-replace-auto-ptr.IncludeStyle
+ value: llvm
+ - key: modernize-use-auto.RemoveStars
+ value: '0'
+ - key: modernize-use-default-member-init.UseAssignment
+ value: '0'
+ - key: modernize-use-emplace.ContainersWithPushBack
+ value: '::std::vector;::std::list;::std::deque'
+ - key: modernize-use-emplace.SmartPointers
+ value: '::std::shared_ptr;::std::unique_ptr;::std::auto_ptr;::std::weak_ptr'
+ - key: modernize-use-nullptr.NullMacros
+ value: 'NULL'
+ - key: modernize-use-transparent-functors.SafeMode
+ value: '0'
+ - key: performance-faster-string-find.StringLikeClasses
+ value: 'std::basic_string'
+ - key: performance-for-range-copy.WarnOnAllAutoCopies
+ value: '0'
+ - key: performance-inefficient-string-concatenation.StrictMode
+ value: '0'
+ - key: performance-type-promotion-in-math-fn.IncludeStyle
+ value: llvm
+ - key: performance-unnecessary-value-param.IncludeStyle
+ value: llvm
+ - key: readability-braces-around-statements.ShortStatementLines
+ value: '0'
+ - key: readability-function-size.BranchThreshold
+ value: '100'
+ - key: readability-function-size.LineThreshold
+ value: '300'
+ - key: readability-function-size.StatementThreshold
+ value: '5'
+ - key: readability-identifier-naming.AbstractClassCase
+ value: CamelCase
+ - key: readability-identifier-naming.AbstractClassPrefix
+ value: 'I'
+ - key: readability-identifier-naming.AbstractClassSuffix
+ value: ''
+ - key: readability-identifier-naming.ClassCase
+ value: CamelCase
+ - key: readability-identifier-naming.ClassConstantCase
+ value: aNy_CasE
+ - key: readability-identifier-naming.ClassConstantPrefix
+ value: ''
+ - key: readability-identifier-naming.ClassConstantSuffix
+ value: ''
+ - key: readability-identifier-naming.ClassMemberCase
+ value: CamelCase
+ - key: readability-identifier-naming.ClassMemberPrefix
+ value: ''
+ - key: readability-identifier-naming.ClassMemberSuffix
+ value: ''
+ - key: readability-identifier-naming.ClassMethodCase
+ value: camelBack
+ - key: readability-identifier-naming.ClassMethodPrefix
+ value: ''
+ - key: readability-identifier-naming.ClassMethodSuffix
+ value: ''
+ - key: readability-identifier-naming.ClassPrefix
+ value: ''
+ - key: readability-identifier-naming.ClassSuffix
+ value: ''
+ - key: readability-identifier-naming.ConstantCase
+ value: aNy_CasE
+ - key: readability-identifier-naming.ConstantMemberCase
+ value: camelBack
+ - key: readability-identifier-naming.ConstantMemberPrefix
+ value: ''
+ - key: readability-identifier-naming.ConstantMemberSuffix
+ value: ''
+ - key: readability-identifier-naming.ConstantParameterCase
+ value: camelBack
+ - key: readability-identifier-naming.ConstantParameterPrefix
+ value: ''
+ - key: readability-identifier-naming.ConstantParameterSuffix
+ value: ''
+ - key: readability-identifier-naming.ConstantPrefix
+ value: ''
+ - key: readability-identifier-naming.ConstantSuffix
+ value: ''
+ - key: readability-identifier-naming.ConstexprFunctionCase
+ value: camelBack
+ - key: readability-identifier-naming.ConstexprFunctionPrefix
+ value: ''
+ - key: readability-identifier-naming.ConstexprFunctionSuffix
+ value: ''
+ - key: readability-identifier-naming.ConstexprMethodCase
+ value: camelBack
+ - key: readability-identifier-naming.ConstexprMethodPrefix
+ value: ''
+ - key: readability-identifier-naming.ConstexprMethodSuffix
+ value: ''
+ - key: readability-identifier-naming.ConstexprVariableCase
+ value: camelBack
+ - key: readability-identifier-naming.ConstexprVariablePrefix
+ value: ''
+ - key: readability-identifier-naming.ConstexprVariableSuffix
+ value: ''
+ - key: readability-identifier-naming.EnumCase
+ value: aNy_CasE
+ - key: readability-identifier-naming.EnumConstantCase
+ value: aNy_CasE
+ - key: readability-identifier-naming.EnumConstantPrefix
+ value: ''
+ - key: readability-identifier-naming.EnumConstantSuffix
+ value: ''
+ - key: readability-identifier-naming.EnumPrefix
+ value: ''
+ - key: readability-identifier-naming.EnumSuffix
+ value: ''
+ - key: readability-identifier-naming.FunctionCase
+ value: camelBack
+ - key: readability-identifier-naming.FunctionPrefix
+ value: ''
+ - key: readability-identifier-naming.FunctionSuffix
+ value: ''
+ - key: readability-identifier-naming.GlobalConstantCase
+ value: camelBack
+ - key: readability-identifier-naming.GlobalConstantPrefix
+ value: ''
+ - key: readability-identifier-naming.GlobalConstantSuffix
+ value: ''
+ - key: readability-identifier-naming.GlobalFunctionCase
+ value: camelBack
+ - key: readability-identifier-naming.GlobalFunctionPrefix
+ value: ''
+ - key: readability-identifier-naming.GlobalFunctionSuffix
+ value: ''
+ - key: readability-identifier-naming.GlobalVariableCase
+ value: lower_case
+ - key: readability-identifier-naming.GlobalVariablePrefix
+ value: ''
+ - key: readability-identifier-naming.GlobalVariableSuffix
+ value: ''
+ - key: readability-identifier-naming.IgnoreFailedSplit
+ value: '0'
+ - key: readability-identifier-naming.InlineNamespaceCase
+ value: lower_case
+ - key: readability-identifier-naming.InlineNamespacePrefix
+ value: ''
+ - key: readability-identifier-naming.InlineNamespaceSuffix
+ value: ''
+ - key: readability-identifier-naming.LocalConstantCase
+ value: camelBack
+ - key: readability-identifier-naming.LocalConstantPrefix
+ value: ''
+ - key: readability-identifier-naming.LocalConstantSuffix
+ value: ''
+ - key: readability-identifier-naming.LocalVariableCase
+ value: camelBack
+ - key: readability-identifier-naming.LocalVariablePrefix
+ value: ''
+ - key: readability-identifier-naming.LocalVariableSuffix
+ value: ''
+ - key: readability-identifier-naming.MacroDefinitionCase
+ value: UPPER_CASE
+ - key: readability-identifier-naming.MacroDefinitionPrefix
+ value: ''
+ - key: readability-identifier-naming.MacroDefinitionSuffix
+ value: ''
+ - key: readability-identifier-naming.MemberCase
+ value: camelBack
+ - key: readability-identifier-naming.MemberPrefix
+ value: ''
+ - key: readability-identifier-naming.MemberSuffix
+ value: ''
+ - key: readability-identifier-naming.MethodCase
+ value: camelBack
+ - key: readability-identifier-naming.MethodPrefix
+ value: ''
+ - key: readability-identifier-naming.MethodSuffix
+ value: ''
+ - key: readability-identifier-naming.NamespaceCase
+ value: lower_case
+ - key: readability-identifier-naming.NamespacePrefix
+ value: ''
+ - key: readability-identifier-naming.NamespaceSuffix
+ value: ''
+ - key: readability-identifier-naming.ParameterCase
+ value: camelBack
+ - key: readability-identifier-naming.ParameterPackCase
+ value: camelBack
+ - key: readability-identifier-naming.ParameterPackPrefix
+ value: ''
+ - key: readability-identifier-naming.ParameterPackSuffix
+ value: ''
+ - key: readability-identifier-naming.ParameterPrefix
+ value: ''
+ - key: readability-identifier-naming.ParameterSuffix
+ value: ''
+ - key: readability-identifier-naming.PrivateMemberCase
+ value: camelBack
+ - key: readability-identifier-naming.PrivateMemberPrefix
+ value: 'm_'
+ - key: readability-identifier-naming.PrivateMemberSuffix
+ value: ''
+ - key: readability-identifier-naming.PrivateMethodCase
+ value: camelBack
+ - key: readability-identifier-naming.PrivateMethodPrefix
+ value: ''
+ - key: readability-identifier-naming.PrivateMethodSuffix
+ value: ''
+ - key: readability-identifier-naming.ProtectedMemberCase
+ value: camelBack
+ - key: readability-identifier-naming.ProtectedMemberPrefix
+ value: ''
+ - key: readability-identifier-naming.ProtectedMemberSuffix
+ value: ''
+ - key: readability-identifier-naming.ProtectedMethodCase
+ value: camelBack
+ - key: readability-identifier-naming.ProtectedMethodPrefix
+ value: ''
+ - key: readability-identifier-naming.ProtectedMethodSuffix
+ value: ''
+ - key: readability-identifier-naming.PublicMemberCase
+ value: camelBack
+ - key: readability-identifier-naming.PublicMemberPrefix
+ value: ''
+ - key: readability-identifier-naming.PublicMemberSuffix
+ value: ''
+ - key: readability-identifier-naming.PublicMethodCase
+ value: camelBack
+ - key: readability-identifier-naming.PublicMethodPrefix
+ value: ''
+ - key: readability-identifier-naming.PublicMethodSuffix
+ value: ''
+ - key: readability-identifier-naming.StaticConstantCase
+ value: camelBack
+ - key: readability-identifier-naming.StaticConstantPrefix
+ value: ''
+ - key: readability-identifier-naming.StaticConstantSuffix
+ value: ''
+ - key: readability-identifier-naming.StaticVariableCase
+ value: camelBack
+ - key: readability-identifier-naming.StaticVariablePrefix
+ value: ''
+ - key: readability-identifier-naming.StaticVariableSuffix
+ value: ''
+ - key: readability-identifier-naming.StructCase
+ value: CamelCase
+ - key: readability-identifier-naming.StructPrefix
+ value: ''
+ - key: readability-identifier-naming.StructSuffix
+ value: ''
+ - key: readability-identifier-naming.TemplateParameterCase
+ value: CamelCase
+ - key: readability-identifier-naming.TemplateParameterPrefix
+ value: ''
+ - key: readability-identifier-naming.TemplateParameterSuffix
+ value: ''
+ - key: readability-identifier-naming.TemplateTemplateParameterCase
+ value: CamelCase
+ - key: readability-identifier-naming.TemplateTemplateParameterPrefix
+ value: ''
+ - key: readability-identifier-naming.TemplateTemplateParameterSuffix
+ value: ''
+ - key: readability-identifier-naming.TypeAliasCase
+ value: CamelCase
+ - key: readability-identifier-naming.TypeAliasPrefix
+ value: ''
+ - key: readability-identifier-naming.TypeAliasSuffix
+ value: ''
+ - key: readability-identifier-naming.TypeTemplateParameterCase
+ value: CamelCase
+ - key: readability-identifier-naming.TypeTemplateParameterPrefix
+ value: ''
+ - key: readability-identifier-naming.TypeTemplateParameterSuffix
+ value: ''
+ - key: readability-identifier-naming.TypedefCase
+ value: CamelCase
+ - key: readability-identifier-naming.TypedefPrefix
+ value: ''
+ - key: readability-identifier-naming.TypedefSuffix
+ value: ''
+ - key: readability-identifier-naming.UnionCase
+ value: aNy_CasE
+ - key: readability-identifier-naming.UnionPrefix
+ value: ''
+ - key: readability-identifier-naming.UnionSuffix
+ value: ''
+ - key: readability-identifier-naming.ValueTemplateParameterCase
+ value: CamelCase
+ - key: readability-identifier-naming.ValueTemplateParameterPrefix
+ value: ''
+ - key: readability-identifier-naming.ValueTemplateParameterSuffix
+ value: ''
+ - key: readability-identifier-naming.VariableCase
+ value: camelBack
+ - key: readability-identifier-naming.VariablePrefix
+ value: ''
+ - key: readability-identifier-naming.VariableSuffix
+ value: ''
+ - key: readability-identifier-naming.VirtualMethodCase
+ value: camelBack
+ - key: readability-identifier-naming.VirtualMethodPrefix
+ value: ''
+ - key: readability-identifier-naming.VirtualMethodSuffix
+ value: ''
+ - key: readability-implicit-bool-cast.AllowConditionalIntegerCasts
+ value: '0'
+ - key: readability-implicit-bool-cast.AllowConditionalPointerCasts
+ value: '0'
+ - key: readability-simplify-boolean-expr.ChainedConditionalAssignment
+ value: '0'
+ - key: readability-simplify-boolean-expr.ChainedConditionalReturn
+ value: '0'
+...
+
diff --git a/.cproject b/.cproject
new file mode 100644
index 0000000..7c2fecd
--- /dev/null
+++ b/.cproject
@@ -0,0 +1,124 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.gitignore b/.gitignore
index 259148f..113acee 100644
--- a/.gitignore
+++ b/.gitignore
@@ -30,3 +30,12 @@
*.exe
*.out
*.app
+
+build/
+install/
+.test/
+
+*.dblite
+*.pdb
+*.out
+
diff --git a/.project b/.project
new file mode 100644
index 0000000..5ed610a
--- /dev/null
+++ b/.project
@@ -0,0 +1,33 @@
+
+
+ CPP-Patterns
+
+
+
+
+
+ org.python.pydev.PyDevBuilder
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.eclipse.cdt.core.ccnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+ org.python.pydev.pythonNature
+
+
diff --git a/.pydevproject b/.pydevproject
new file mode 100644
index 0000000..31b2c77
--- /dev/null
+++ b/.pydevproject
@@ -0,0 +1,8 @@
+
+
+Default
+python 3.6
+
+/${PROJECT_DIR_NAME}/src/site_scons
+
+
diff --git a/.settings/language.settings.xml b/.settings/language.settings.xml
new file mode 100644
index 0000000..879de53
--- /dev/null
+++ b/.settings/language.settings.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/.settings/org.eclipse.cdt.codan.core.prefs b/.settings/org.eclipse.cdt.codan.core.prefs
new file mode 100644
index 0000000..9eb9a80
--- /dev/null
+++ b/.settings/org.eclipse.cdt.codan.core.prefs
@@ -0,0 +1,201 @@
+eclipse.preferences.version=1
+org.eclipse.cdt.codan.checkers.errnoreturn=Warning
+org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false}
+org.eclipse.cdt.codan.checkers.errreturnvalue=Error
+org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"}
+org.eclipse.cdt.codan.checkers.nocommentinside=-Error
+org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"}
+org.eclipse.cdt.codan.checkers.nolinecomment=-Error
+org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"}
+org.eclipse.cdt.codan.checkers.noreturn=Error
+org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false}
+org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
+org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"}
+org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
+org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"}
+org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"}
+org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
+org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"}
+org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false}
+org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
+org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()}
+org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
+org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"}
+org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
+org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true}
+org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error
+org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"}
+org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
+org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"}
+org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
+org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"}
+org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
+org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"}
+org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
+org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"}
+org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
+org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
+org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"}
+org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
+org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"}
+org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
+org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"}
+org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"}
+org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
+org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"}
+org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
+org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"}
+org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()}
+org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false}
+org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false}
+org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"}
+org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true}
+org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true}
+org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
+org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")}
+org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
+org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"}
+org.wangzw.plugin.cppstyle.cpplint.build.c++11=Error
+org.wangzw.plugin.cppstyle.cpplint.build.c++11.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.categorized=Error
+org.wangzw.plugin.cppstyle.cpplint.build.categorized.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.deprecated=Error
+org.wangzw.plugin.cppstyle.cpplint.build.deprecated.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.endif_comment=Error
+org.wangzw.plugin.cppstyle.cpplint.build.endif_comment.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.explicit_make_pair=Error
+org.wangzw.plugin.cppstyle.cpplint.build.explicit_make_pair.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.forward_decl=Error
+org.wangzw.plugin.cppstyle.cpplint.build.forward_decl.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.header_guard=Error
+org.wangzw.plugin.cppstyle.cpplint.build.header_guard.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.include=Error
+org.wangzw.plugin.cppstyle.cpplint.build.include.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.include_alpha=Error
+org.wangzw.plugin.cppstyle.cpplint.build.include_alpha.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.include_order=Error
+org.wangzw.plugin.cppstyle.cpplint.build.include_order.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.include_what_you_use=Error
+org.wangzw.plugin.cppstyle.cpplint.build.include_what_you_use.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.namespaces=Error
+org.wangzw.plugin.cppstyle.cpplint.build.namespaces.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.printf_format=Error
+org.wangzw.plugin.cppstyle.cpplint.build.printf_format.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.build.storage_class=Error
+org.wangzw.plugin.cppstyle.cpplint.build.storage_class.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.legal.copyright=Error
+org.wangzw.plugin.cppstyle.cpplint.legal.copyright.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.alt_tokens=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.alt_tokens.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.braces=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.braces.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.casting=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.casting.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.check=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.check.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.constructors=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.constructors.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.fn_size=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.fn_size.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.function=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.function.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.inheritance=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.inheritance.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.multiline_comment=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.multiline_comment.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.multiline_string=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.multiline_string.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.namespace=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.namespace.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.nolint=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.nolint.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.nul=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.nul.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.strings=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.strings.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.todo=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.todo.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.readability.utf8=Error
+org.wangzw.plugin.cppstyle.cpplint.readability.utf8.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.arrays=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.arrays.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.casting=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.casting.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.explicit=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.explicit.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.indentation_namespace=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.indentation_namespace.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.init=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.init.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.int=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.int.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.invalid_increment=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.invalid_increment.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.member_string_references=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.member_string_references.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.memset=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.memset.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.operator=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.operator.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.printf=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.printf.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.printf_format=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.printf_format.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.references=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.references.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.string=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.string.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.threadsafe_fn=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.threadsafe_fn.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.runtime.vlog=Error
+org.wangzw.plugin.cppstyle.cpplint.runtime.vlog.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.blank_line=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.blank_line.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.braces=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.braces.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.comma=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.comma.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.comments=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.comments.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.empty_conditional_body=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.empty_conditional_body.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.empty_loop_body=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.empty_loop_body.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.end_of_line=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.end_of_line.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.ending_newline=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.ending_newline.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.forcolon=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.forcolon.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.indent=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.indent.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.line_length=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.line_length.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.newline=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.newline.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.operators=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.operators.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.parens=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.parens.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.semicolon=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.semicolon.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.tab=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.tab.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
+org.wangzw.plugin.cppstyle.cpplint.whitespace.todo=Error
+org.wangzw.plugin.cppstyle.cpplint.whitespace.todo.params={fileScope\=>inclusion\=>("*.cc","*.h","*.cpp","*.cu","*.cuh","*.hpp"),exclusion\=>(),launchModes\=>{RUN_ON_FULL_BUILD\=>false,RUN_ON_INC_BUILD\=>false,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>true,RUN_AS_YOU_TYPE\=>false,RUN_ON_DEMAND\=>true},suppression_comment\=>null}
diff --git a/.settings/org.eclipse.cdt.core.prefs b/.settings/org.eclipse.cdt.core.prefs
new file mode 100644
index 0000000..0d27426
--- /dev/null
+++ b/.settings/org.eclipse.cdt.core.prefs
@@ -0,0 +1,165 @@
+eclipse.preferences.version=1
+org.eclipse.cdt.core.code_formatter=org.eclipse.cdt.core.defaultCodeFormatter
+org.eclipse.cdt.core.formatter.alignment_for_arguments_in_method_invocation=83
+org.eclipse.cdt.core.formatter.alignment_for_assignment=16
+org.eclipse.cdt.core.formatter.alignment_for_base_clause_in_type_declaration=80
+org.eclipse.cdt.core.formatter.alignment_for_binary_expression=16
+org.eclipse.cdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.cdt.core.formatter.alignment_for_conditional_expression=34
+org.eclipse.cdt.core.formatter.alignment_for_conditional_expression_chain=18
+org.eclipse.cdt.core.formatter.alignment_for_constructor_initializer_list=83
+org.eclipse.cdt.core.formatter.alignment_for_declarator_list=16
+org.eclipse.cdt.core.formatter.alignment_for_enumerator_list=83
+org.eclipse.cdt.core.formatter.alignment_for_expression_list=0
+org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer=18
+org.eclipse.cdt.core.formatter.alignment_for_member_access=0
+org.eclipse.cdt.core.formatter.alignment_for_overloaded_left_shift_chain=18
+org.eclipse.cdt.core.formatter.alignment_for_parameters_in_method_declaration=83
+org.eclipse.cdt.core.formatter.alignment_for_throws_clause_in_method_declaration=83
+org.eclipse.cdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.cdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.cdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.cdt.core.formatter.brace_position_for_method_declaration=next_line
+org.eclipse.cdt.core.formatter.brace_position_for_namespace_declaration=end_of_line
+org.eclipse.cdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.cdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.cdt.core.formatter.comment.line_up_line_comment_in_blocks_on_first_column=false
+org.eclipse.cdt.core.formatter.comment.min_distance_between_code_and_line_comment=1
+org.eclipse.cdt.core.formatter.comment.never_indent_line_comments_on_first_column=true
+org.eclipse.cdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=true
+org.eclipse.cdt.core.formatter.compact_else_if=true
+org.eclipse.cdt.core.formatter.continuation_indentation=2
+org.eclipse.cdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.cdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.cdt.core.formatter.indent_access_specifier_compare_to_type_header=false
+org.eclipse.cdt.core.formatter.indent_access_specifier_extra_spaces=0
+org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_access_specifier=true
+org.eclipse.cdt.core.formatter.indent_body_declarations_compare_to_namespace_header=false
+org.eclipse.cdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.cdt.core.formatter.indent_declaration_compare_to_template_header=false
+org.eclipse.cdt.core.formatter.indent_empty_lines=false
+org.eclipse.cdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.cdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.cdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.cdt.core.formatter.indentation.size=2
+org.eclipse.cdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.cdt.core.formatter.insert_new_line_after_template_declaration=do not insert
+org.eclipse.cdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
+org.eclipse.cdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.cdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.cdt.core.formatter.insert_new_line_before_colon_in_constructor_initializer_list=do not insert
+org.eclipse.cdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.cdt.core.formatter.insert_new_line_before_identifier_in_function_declaration=do not insert
+org.eclipse.cdt.core.formatter.insert_new_line_before_while_in_do_statement=insert
+org.eclipse.cdt.core.formatter.insert_new_line_in_empty_block=insert
+org.eclipse.cdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.cdt.core.formatter.insert_space_after_binary_operator=insert
+org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_arguments=insert
+org.eclipse.cdt.core.formatter.insert_space_after_closing_angle_bracket_in_template_parameters=insert
+org.eclipse.cdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.cdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
+org.eclipse.cdt.core.formatter.insert_space_after_colon_in_base_clause=insert
+org.eclipse.cdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.cdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.cdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_base_types=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_declarator_list=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_expression_list=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_arguments=insert
+org.eclipse.cdt.core.formatter.insert_space_after_comma_in_template_parameters=insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_arguments=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_angle_bracket_in_template_parameters=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_bracket=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_exception_specification=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.cdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.cdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.cdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_assignment_operator=insert
+org.eclipse.cdt.core.formatter.insert_space_before_binary_operator=insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_arguments=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_angle_bracket_in_template_parameters=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_bracket=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_exception_specification=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_colon_in_base_clause=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.cdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_base_types=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_declarator_list=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_expression_list=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_arguments=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_comma_in_template_parameters=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_arguments=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_angle_bracket_in_template_parameters=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_namespace_declaration=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_bracket=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_exception_specification=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.cdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.cdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.cdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.cdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.cdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.cdt.core.formatter.insert_space_between_empty_brackets=do not insert
+org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_exception_specification=do not insert
+org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.cdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.cdt.core.formatter.join_wrapped_lines=true
+org.eclipse.cdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.cdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.cdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.cdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.cdt.core.formatter.lineSplit=80
+org.eclipse.cdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.cdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.cdt.core.formatter.tabulation.char=space
+org.eclipse.cdt.core.formatter.tabulation.size=2
+org.eclipse.cdt.core.formatter.use_tabs_only_for_leading_indentations=false
diff --git a/.settings/org.eclipse.cdt.ui.prefs b/.settings/org.eclipse.cdt.ui.prefs
new file mode 100644
index 0000000..647df3c
--- /dev/null
+++ b/.settings/org.eclipse.cdt.ui.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+formatter_profile=_K&R [built-in] modified
+formatter_settings_version=1
diff --git a/src/.style.yapf b/src/.style.yapf
new file mode 100644
index 0000000..39d7823
--- /dev/null
+++ b/src/.style.yapf
@@ -0,0 +1,217 @@
+[style]
+# Align closing bracket with visual indentation.
+align_closing_bracket_with_visual_indent=False
+
+# Allow dictionary keys to exist on multiple lines. For example:
+#
+# x = {
+# ('this is the first element of a tuple',
+# 'this is the second element of a tuple'):
+# value,
+# }
+allow_multiline_dictionary_keys=False
+
+# Allow lambdas to be formatted on more than one line.
+allow_multiline_lambdas=False
+
+# Allow splits before the dictionary value.
+allow_split_before_dict_value=True
+
+# Insert a blank line before a class-level docstring.
+blank_line_before_class_docstring=False
+
+# Insert a blank line before a 'def' or 'class' immediately nested
+# within another 'def' or 'class'. For example:
+#
+# class Foo:
+# # <------ this blank line
+# def method():
+# ...
+blank_line_before_nested_class_or_def=True
+
+# Do not split consecutive brackets. Only relevant when
+# dedent_closing_brackets is set. For example:
+#
+# call_func_that_takes_a_dict(
+# {
+# 'key1': 'value1',
+# 'key2': 'value2',
+# }
+# )
+#
+# would reformat to:
+#
+# call_func_that_takes_a_dict({
+# 'key1': 'value1',
+# 'key2': 'value2',
+# })
+coalesce_brackets=False
+
+# The column limit.
+column_limit=80
+
+# Indent width used for line continuations.
+continuation_indent_width=4
+
+# Put closing brackets on a separate line, dedented, if the bracketed
+# expression can't fit in a single line. Applies to all kinds of brackets,
+# including function definitions and calls. For example:
+#
+# config = {
+# 'key1': 'value1',
+# 'key2': 'value2',
+# } # <--- this bracket is dedented and on a separate line
+#
+# time_series = self.remote_client.query_entity_counters(
+# entity='dev3246.region1',
+# key='dns.query_latency_tcp',
+# transform=Transformation.AVERAGE(window=timedelta(seconds=60)),
+# start_ts=now()-timedelta(days=3),
+# end_ts=now(),
+# ) # <--- this bracket is dedented and on a separate line
+dedent_closing_brackets=True
+
+# Place each dictionary entry onto its own line.
+each_dict_entry_on_separate_line=True
+
+# The regex for an i18n comment. The presence of this comment stops
+# reformatting of that line, because the comments are required to be
+# next to the string they translate.
+i18n_comment=#\..*
+
+# The i18n function call names. The presence of this function stops
+# reformattting on that line, because the string it has cannot be moved
+# away from the i18n comment.
+i18n_function_call=['N_', '_']
+
+# Indent the dictionary value if it cannot fit on the same line as the
+# dictionary key. For example:
+#
+# config = {
+# 'key1':
+# 'value1',
+# 'key2': value1 +
+# value2,
+# }
+indent_dictionary_value=False
+
+# The number of columns to use for indentation.
+indent_width=4
+
+# Join short lines into one line. E.g., single line 'if' statements.
+join_multiple_lines=True
+
+# Do not include spaces around selected binary operators. For example:
+#
+# 1 + 2 * 3 - 4 / 5
+#
+# will be formatted as follows when configured with a value "*,/":
+#
+# 1 + 2*3 - 4/5
+#
+no_spaces_around_selected_binary_operators=set()
+
+# Use spaces around default or named assigns.
+spaces_around_default_or_named_assign=False
+
+# Use spaces around the power operator.
+spaces_around_power_operator=False
+
+# The number of spaces required before a trailing comment.
+spaces_before_comment=2
+
+# Insert a space between the ending comma and closing bracket of a list,
+# etc.
+space_between_ending_comma_and_closing_bracket=False
+
+# Split before arguments if the argument list is terminated by a
+# comma.
+split_arguments_when_comma_terminated=False
+
+# Set to True to prefer splitting before '&', '|' or '^' rather than
+# after.
+split_before_bitwise_operator=False
+
+# Split before a dictionary or set generator (comp_for). For example, note
+# the split before the 'for':
+#
+# foo = {
+# variable: 'Hello world, have a nice day!'
+# for variable in bar if variable != 42
+# }
+split_before_dict_set_generator=True
+
+# Split after the opening paren which surrounds an expression if it doesn't
+# fit on a single line.
+split_before_expression_after_opening_paren=False
+
+# If an argument / parameter list is going to be split, then split before
+# the first argument.
+split_before_first_argument=False
+
+# Set to True to prefer splitting before 'and' or 'or' rather than
+# after.
+split_before_logical_operator=False
+
+# Split named assignments onto individual lines.
+split_before_named_assigns=True
+
+# Set to True to split list comprehensions and generators that have
+# non-trivial expressions and multiple clauses before each of these
+# clauses. For example:
+#
+# result = [
+# a_long_var + 100 for a_long_var in xrange(1000)
+# if a_long_var % 10]
+#
+# would reformat to something like:
+#
+# result = [
+# a_long_var + 100
+# for a_long_var in xrange(1000)
+# if a_long_var % 10]
+split_complex_comprehension=True
+
+# The penalty for splitting right after the opening bracket.
+split_penalty_after_opening_bracket=30
+
+# The penalty for splitting the line after a unary operator.
+split_penalty_after_unary_operator=10000
+
+# The penalty for splitting right before an if expression.
+split_penalty_before_if_expr=0
+
+# The penalty of splitting the line around the '&', '|', and '^'
+# operators.
+split_penalty_bitwise_operator=300
+
+# The penalty for splitting a list comprehension or generator
+# expression.
+split_penalty_comprehension=2100
+
+# The penalty for characters over the column limit.
+split_penalty_excess_character=4500
+
+# The penalty incurred by adding a line split to the unwrapped line. The
+# more line splits added the higher the penalty.
+split_penalty_for_added_line_split=30
+
+# The penalty of splitting a list of "import as" names. For example:
+#
+# from a_very_long_or_indented_module_name_yada_yad import (long_argument_1,
+# long_argument_2,
+# long_argument_3)
+#
+# would reformat to something like:
+#
+# from a_very_long_or_indented_module_name_yada_yad import (
+# long_argument_1, long_argument_2, long_argument_3)
+split_penalty_import_names=0
+
+# The penalty of splitting the line around the 'and' and 'or'
+# operators.
+split_penalty_logical_operator=300
+
+# Use the Tab character for indentation.
+use_tabs=False
+
diff --git a/src/SConstruct b/src/SConstruct
new file mode 100644
index 0000000..a62dd78
--- /dev/null
+++ b/src/SConstruct
@@ -0,0 +1,31 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+Help("""
+
+ DEBUG=1,0 - enable debug build, default 1
+
+""")
+
+def build():
+ from miscsetup import CustomBuildEnvironment
+ env = CustomBuildEnvironment()
+ env.build()
+
+
+if not GetOption('help'):
+ build()
diff --git a/src/site_scons/.gitignore b/src/site_scons/.gitignore
new file mode 100644
index 0000000..80d4ca5
--- /dev/null
+++ b/src/site_scons/.gitignore
@@ -0,0 +1,3 @@
+
+__pycache__/
+
diff --git a/src/site_scons/localtargets/Executable.py b/src/site_scons/localtargets/Executable.py
new file mode 100644
index 0000000..91969e6
--- /dev/null
+++ b/src/site_scons/localtargets/Executable.py
@@ -0,0 +1,62 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+from .RunableTarget import RunableTarget
+
+
+class Executable(RunableTarget):
+
+ def __init__(
+ self, env, name, sources, localStaticLibs, localSharedLibs,
+ externalLibs, isBin
+ ):
+
+ self.__target = None
+ self.__isBin = isBin
+
+ super(Executable, self).__init__(
+ env, name, sources, localStaticLibs, localSharedLibs, externalLibs
+ )
+
+ self.writeScript()
+
+ self.env.Install(self.installDir, self.target)
+
+ @property
+ def installDir(self):
+ return self.binDir if self.__isBin else \
+ self.etcDir
+
+ @property
+ def scriptFileDir(self):
+ return self.installDir
+
+ @property
+ def target(self):
+
+ if self.__target is None:
+ self.__target = \
+ self.env.Program(target=self.name,
+ source=self.sources,
+ LIBS=self.localSharedLibsNames + self.externalLibsNames,
+ LIBPATH=self.env['LIBPATH'] +
+ self.externalLibsPaths,
+ CPPPATH=self.env['CPPPATH'] +
+ self.externalLibsIncludes,
+ CPPFLAGS=self.cppFlags,
+ LINKFLAGS=self.linkFlags)
+ return self.__target
diff --git a/src/site_scons/localtargets/LocalTarget.py b/src/site_scons/localtargets/LocalTarget.py
new file mode 100644
index 0000000..d50dbdb
--- /dev/null
+++ b/src/site_scons/localtargets/LocalTarget.py
@@ -0,0 +1,163 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+import os
+
+
+class LocalTarget(object):
+
+ def __init__(
+ self, env, name, sources, localStaticLibs, localSharedLibs, externalLibs
+ ):
+
+ self.__env = env
+ self.__name = name
+ self.__sources = sources
+ self.__localStaticLibs = localStaticLibs
+ self.__localSharedLibs = localSharedLibs
+ self.__externalLibs = externalLibs
+
+ self.__localDir = os.getcwd()
+
+ @property
+ def installDir(self):
+ assert False
+
+ @property
+ def target(self):
+ assert False
+
+ @property
+ def env(self):
+ return self.defaultEnv
+
+ @property
+ def defaultEnv(self):
+ return self.__env.defaultEnv
+
+ @property
+ def swigEnv(self):
+ return self.__env.swigEnv
+
+ @property
+ def srcDir(self):
+ return self.__env.srcDir
+
+ @property
+ def buildDir(self):
+ return self.__env.buildDir
+
+ @property
+ def binDir(self):
+ return self.__env.binDir
+
+ @property
+ def libDir(self):
+ return self.__env.libDir
+
+ @property
+ def libPyDir(self):
+ return self.__env.libPyDir
+
+ @property
+ def testDir(self):
+ return self.__env.testDir
+
+ @property
+ def etcDir(self):
+ return self.__env.etcDir
+
+ @property
+ def isWindows(self):
+ return self.__env.isWindows
+
+ @property
+ def isLinux(self):
+ return self.__env.isLinux
+
+ @property
+ def isClean(self):
+ return self.__env.isClean
+
+ @property
+ def name(self):
+ return self.__name
+
+ @property
+ def sources(self):
+ return self.__sources
+
+ @property
+ def cppFlags(self):
+ return self.env['CPPFLAGS']
+
+ @property
+ def linkFlags(self):
+ return self.env['LINKFLAGS']
+
+ @property
+ def cppDefines(self):
+ return self.env['CPPDEFINES'].copy()
+
+ @property
+ def localSharedLibsNames(self):
+ return self.__localSharedLibs
+
+ @property
+ def externalLibs(self):
+ return self.__externalLibs
+
+ @property
+ def localDir(self):
+ return self.__localDir
+
+ @property
+ def externalLibsNames(self):
+ nameList = []
+ for externalLib in self.externalLibs:
+ nameList += externalLib.lib
+ return nameList
+
+ @property
+ def externalLibsPaths(self):
+ return [lib.libPath for lib in self.externalLibs if lib.libPath]
+
+ @property
+ def externalLibsIncludes(self):
+ return [lib.include for lib in self.externalLibs if lib.include]
+
+ def absPath(self, path):
+ return os.path.abspath(path)
+
+ def dirName(self, path):
+ return os.path.dirname(path)
+
+ def join(self, *paths):
+ return os.path.join(*paths)
+
+ def isFile(self, fileNamePath):
+ return os.path.isfile(fileNamePath)
+
+ def clean(self, fileNamePath):
+ if not all([self.isClean, self.isFile(fileNamePath)]):
+ return
+ os.remove(fileNamePath)
+ print('Removed', fileNamePath)
+
+ def summary(self):
+ lstr = self.name + '\n'
+ return lstr
diff --git a/src/site_scons/localtargets/RunableTarget.py b/src/site_scons/localtargets/RunableTarget.py
new file mode 100644
index 0000000..164f762
--- /dev/null
+++ b/src/site_scons/localtargets/RunableTarget.py
@@ -0,0 +1,78 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+from .LocalTarget import LocalTarget
+
+
+class RunableTarget(LocalTarget):
+
+ def __init__(
+ self, env, name, sources, localStaticLibs, localSharedLibs, externalLibs
+ ):
+
+ super(RunableTarget, self).__init__(
+ env, name, sources, localStaticLibs, localSharedLibs, externalLibs
+ )
+
+ @property
+ def scriptFileDir(self):
+ assert False
+
+ def getScriptFilePath(self):
+ import os
+ scriptFileDir = self.scriptFileDir
+ if not os.path.exists(scriptFileDir):
+ os.makedirs(scriptFileDir)
+ if self.isLinux:
+ return os.path.join(scriptFileDir, self.name) + '.sh'
+ elif self.isWindows:
+ return os.path.join(scriptFileDir, self.name) + '.exe.bat'
+
+ def _writeLinuxScript(self):
+ scriptPath = self.getScriptFilePath()
+ self.clean(scriptPath)
+ if all([not self.isClean, not self.isFile(scriptPath)]):
+ print('Writing', scriptPath)
+ with open(scriptPath, 'w') as f:
+ f.write(r'#!/bin/sh' + '\n')
+ f.write(r'SCRIPT=`realpath -s $0`' + '\n')
+ f.write(r'SCRIPTPATH=`dirname $SCRIPT`' + '\n')
+ f.write(
+ r'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:' + self.libDir +
+ '\n'
+ )
+ f.write(r'$SCRIPTPATH/' + self.name + r' "$@"')
+ import os
+ os.system('chmod +x ' + scriptPath)
+
+ def _writeWindowsScript(self):
+ scriptPath = self.getScriptFilePath()
+ self.clean(scriptPath)
+ if all([not self.isClean, not self.isFile(scriptPath)]):
+ print('Writing', scriptPath)
+ with open(scriptPath, 'w') as f:
+ f.write(r'@echo off' + '\n')
+ f.write(r'setlocal' + '\n')
+ f.write(r'set scriptPath=%~dp0' + '\n')
+ f.write(r'PATH=$PATH;' + self.libDir + '\n')
+ f.write(r'%scriptPath%' + self.name + r' %*')
+
+ def writeScript(self):
+ if self.isLinux:
+ return self._writeLinuxScript()
+ elif self.isWindows:
+ return self._writeWindowsScript()
diff --git a/src/site_scons/localtargets/__init__.py b/src/site_scons/localtargets/__init__.py
new file mode 100644
index 0000000..05087cd
--- /dev/null
+++ b/src/site_scons/localtargets/__init__.py
@@ -0,0 +1,18 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+from .Executable import Executable
diff --git a/src/site_scons/miscsetup/Architecture.py b/src/site_scons/miscsetup/Architecture.py
new file mode 100644
index 0000000..7ed587b
--- /dev/null
+++ b/src/site_scons/miscsetup/Architecture.py
@@ -0,0 +1,95 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+import os
+import platform
+import sys
+
+import SCons
+
+
+class Architecture(object):
+
+ def __init__(self):
+
+ self.__osName = platform.system()
+ self.__pythonVersion = platform.python_version()
+ self.__sconsVersion = SCons.__version__
+
+ if self.__osName not in self.supportedSystems:
+ raise RuntimeError('Unsupported OS architecture.')
+
+ self.__sysDirName = 'unknown'
+ if self.isLinux:
+ self.__sysDirName = 'linx64'
+ if not 'LD_LIBRARY_PATH' in os.environ:
+ os.environ['LD_LIBRARY_PATH'] = ''
+ elif self.isWindows:
+ self.__sysDirName = 'winx64'
+
+ @property
+ def supportedSystems(self):
+ return ['Windows', 'Linux']
+
+ @property
+ def osName(self):
+ return self.__osName
+
+ @property
+ def isWindows(self):
+ return self.osName == 'Windows'
+
+ @property
+ def isLinux(self):
+ return self.osName == 'Linux'
+
+ @property
+ def pythonVersion(self):
+ return self.__pythonVersion
+
+ @property
+ def sconsVersion(self):
+ return self.__sconsVersion
+
+ @property
+ def sysDirName(self):
+ return self.__sysDirName
+
+ def _getFormatedPaths(self, pathStr):
+ return str(pathStr.split(os.pathsep)).replace(', ', ',\n').replace(
+ '[', '[\n'
+ ).replace(']', '\n]')
+
+ def summary(self):
+ lstr = '=' * 50 + '\n'
+ lstr += 'Architecture Summary\n'
+ lstr += '=' * 50 + '\n'
+ lstr += 'operating system: ' + self.osName + '\n'
+ lstr += 'python version: ' + self.pythonVersion + '\n'
+ lstr += 'scons version: ' + self.sconsVersion + '\n'
+ lstr += 'path: ' + \
+ self._getFormatedPaths(os.environ['PATH']) + '\n'
+ if self.isLinux:
+ lstr += 'LD_LIBRARY_PATH: ' + \
+ self._getFormatedPaths(os.environ['LD_LIBRARY_PATH']) + '\n'
+ if os.environ.get('PYTHONPATH'):
+ lstr += 'python path: ' + \
+ self._getFormatedPaths(os.environ['PYTHONPATH']) + '\n'
+ lstr += 'session python path: ' + \
+ self._getFormatedPaths(os.pathsep.join(sys.path)) + '\n'
+ lstr += '-' * 50 + '\n'
+ return lstr
diff --git a/src/site_scons/miscsetup/ArgumentsSetup.py b/src/site_scons/miscsetup/ArgumentsSetup.py
new file mode 100644
index 0000000..177b88b
--- /dev/null
+++ b/src/site_scons/miscsetup/ArgumentsSetup.py
@@ -0,0 +1,66 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+
+class ArgumentsSetup(object):
+
+ def __init__(self):
+
+ from SCons.Script import ARGUMENTS, GetOption
+
+ self.__debugArg = ARGUMENTS.get('DEBUG', '1')
+ if self.__debugArg not in ['0', '1']:
+ raise RuntimeError('Check the DEBUG input argument.')
+
+ self.__assertArg = '1' if self.__debugArg == '1' else '0'
+ if self.__assertArg not in ['0', '1']:
+ raise RuntimeError('Check the ASSERT input argument.')
+
+ self.__compilerName = ARGUMENTS.get('COMPILER', '')
+
+ self.__isClean = GetOption('clean')
+
+ @property
+ def isDebug(self):
+ return self.__debugArg == '1'
+
+ @property
+ def isAssert(self):
+ return self.__assertArg == '1'
+
+ @property
+ def compilerName(self):
+ return self.__compilerName
+
+ @property
+ def isClean(self):
+ return self.__isClean
+
+ def summary(self):
+
+ def printDefault(x):
+ return x if x else '-default-'
+
+ lstr = '=' * 50 + '\n'
+ lstr += 'Build Arguments Summary\n'
+ lstr += '=' * 50 + '\n'
+ lstr += 'debug: ' + str(self.isDebug) + '\n'
+ lstr += 'assert: ' + str(self.isAssert) + '\n'
+ lstr += 'compiler name: ' + printDefault(self.compilerName) + '\n'
+ lstr += 'clean build: ' + str(self.isClean) + '\n'
+ lstr += '-' * 50 + '\n'
+ return lstr
diff --git a/src/site_scons/miscsetup/BuildPath.py b/src/site_scons/miscsetup/BuildPath.py
new file mode 100644
index 0000000..517e170
--- /dev/null
+++ b/src/site_scons/miscsetup/BuildPath.py
@@ -0,0 +1,162 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+
+class BuildPath(object):
+
+ def __init__(self, archObj, argObj):
+
+ import os
+
+ from SCons.Script import Dir
+
+ # main
+ self.__srcDir = Dir('#').abspath
+
+ self.__projectDir = os.path.abspath(os.path.join(self.__srcDir, '..'))
+ self.__runtimeDir = os.path.join(self.__projectDir, 'runtime')
+ self.__thirdpartyDir = os.path.join(self.__projectDir, 'thirdparty')
+
+ #assert os.path.exists(self.__runtimeDir)
+ #assert os.path.exists(self.__thirdpartyDir)
+
+ def _exist(path):
+ if not os.path.exists(path):
+ os.makedirs(path)
+ return path
+
+ # build variables
+ self.__buildDir = os.path.join(
+ self.__projectDir, 'build', archObj.sysDirName
+ )
+ self.__installDir = os.path.join(
+ self.__projectDir, 'install', archObj.sysDirName
+ )
+
+ self.__buildDir = _exist(self.__buildDir)
+
+ self.__binDir = _exist(os.path.join(self.__installDir, 'bin'))
+ self.__libDir = _exist(os.path.join(self.__installDir, 'lib'))
+ self.__libPyDir = _exist(os.path.join(self.__libDir, 'py'))
+ self.__testDir = _exist(os.path.join(self.__installDir, 'test'))
+ self.__etcDir = _exist(os.path.join(self.__installDir, 'etc'))
+
+ # lib
+ self.__runtimeArchDir = os.path.join(
+ self.__runtimeDir, archObj.sysDirName
+ )
+ #assert os.path.exists(self.__runtimeArchDir)
+
+ # thirdparty
+ __thirdpartyNoArchDir = os.path.join(self.__thirdpartyDir, 'noarch')
+ __thirdpartyArchDir = os.path.join(
+ self.__thirdpartyDir, archObj.sysDirName
+ )
+
+ self.__thirdpartyNoArchBinDir = os.path.join(
+ __thirdpartyNoArchDir, 'bin'
+ )
+ self.__thirdpartyArchBinDir = os.path.join(__thirdpartyArchDir, 'bin')
+ #assert os.path.exists(self.__thirdpartyNoArchBinDir)
+ #assert os.path.exists(self.__thirdpartyArchBinDir)
+
+ self.__thirdpartyNoArchIncludeDir = os.path.join(
+ __thirdpartyNoArchDir, 'include'
+ )
+ self.__thirdpartyArchIncludeDir = os.path.join(
+ __thirdpartyArchDir, 'include'
+ )
+ #assert os.path.exists(self.__thirdpartyNoArchIncludeDir)
+ #assert os.path.exists(self.__thirdpartyArchIncludeDir)
+
+ self.__thirdpartyNoArchLibDir = os.path.join(
+ __thirdpartyNoArchDir, 'lib'
+ )
+ self.__thirdpartyArchLibDir = os.path.join(__thirdpartyArchDir, 'lib')
+ #assert os.path.exists(self.__thirdpartyNoArchLibDir)
+ #assert os.path.exists(self.__thirdpartyArchLibDir)
+
+ self.__thirdpartyNoArchLibPyDir = os.path.join(
+ self.__thirdpartyNoArchLibDir, 'py'
+ )
+ #assert os.path.exists(self.__thirdpartyNoArchLibPyDir)
+
+ @property
+ def projectDir(self):
+ return self.__projectDir
+
+ @property
+ def srcDir(self):
+ return self.__srcDir
+
+ @property
+ def buildDir(self):
+ return self.__buildDir
+
+ @property
+ def binDir(self):
+ return self.__binDir
+
+ @property
+ def libDir(self):
+ return self.__libDir
+
+ @property
+ def libPyDir(self):
+ return self.__libPyDir
+
+ @property
+ def testDir(self):
+ return self.__testDir
+
+ @property
+ def etcDir(self):
+ return self.__etcDir
+
+ @property
+ def runtimeArchDir(self):
+ return self.__runtimeArchDir
+
+ @property
+ def thirdpartyNoArchIncludeDir(self):
+ return self.__thirdpartyNoArchIncludeDir
+
+ @property
+ def thirdpartyArchIncludeDir(self):
+ return self.__thirdpartyArchIncludeDir
+
+ @property
+ def thirdpartyArchLibDir(self):
+ return self.__thirdpartyArchLibDir
+
+ def summary(self):
+ lstr = '=' * 50 + '\n'
+ lstr += 'Paths Summary\n'
+ lstr += '=' * 50 + '\n'
+ lstr += 'project: ' + self.projectDir + '\n'
+ lstr += 'build: ' + self.buildDir + '\n'
+ lstr += 'install bin: ' + self.binDir + '\n'
+ lstr += 'install lib: ' + self.libDir + '\n'
+ lstr += 'install py: ' + self.libPyDir + '\n'
+ lstr += 'install test: ' + self.testDir + '\n'
+ lstr += 'install etc: ' + self.etcDir + '\n'
+ lstr += 'runtime: ' + self.runtimeArchDir + '\n'
+ lstr += 'thirdparty noarch include: ' + self.thirdpartyNoArchIncludeDir + '\n'
+ lstr += 'thirdparty arch include: ' + self.thirdpartyArchIncludeDir + '\n'
+ lstr += 'thirdparty arch lib: ' + self.thirdpartyArchLibDir + '\n'
+ lstr += '-' * 50 + '\n'
+ return lstr
diff --git a/src/site_scons/miscsetup/CompilerSetup.py b/src/site_scons/miscsetup/CompilerSetup.py
new file mode 100644
index 0000000..36b134c
--- /dev/null
+++ b/src/site_scons/miscsetup/CompilerSetup.py
@@ -0,0 +1,243 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+
+class CompilerSetup(object):
+
+ def __init__(self, archObj, argObj):
+
+ self.__archObj = archObj
+ self.__argObj = argObj
+
+ self.__gccCom = 'gcc'
+ self.__intelCom = 'intel'
+ self.__clangCom = 'clang'
+ self.__msvcCom = 'msvc'
+
+ if archObj.isLinux:
+ self.__defaultCompiler = self.__gccCom
+ self.__compilers = {
+ self.__gccCom: ['gcc', 'g++'],
+ self.__intelCom: ['ic', 'icpc'],
+ self.__clangCom: ['clang', 'clang++']
+ }
+ elif archObj.isWindows:
+ self.__defaultCompiler = self.__msvcCom
+ self.__compilers = {
+ self.__msvcCom: ['cl', 'cl'],
+ self.__intelCom: ['ic', 'icpp'],
+ self.__clangCom: ['clang', 'clang++']
+ }
+
+ self.__compiler = argObj.compilerName if argObj.compilerName else \
+ self.__defaultCompiler
+
+ if self.__compiler not in self.__compilers:
+ raise RuntimeError('Check the COMPILER input argument.')
+
+ #
+ # widnows compilers
+ #
+ def _clang_windows(self):
+ return dict(
+ ccFlags=["-std=c++1z", '-fms-compatibility-version=21'],
+ optCFlags=["-O3"],
+ optLinkFlags=["-Wl,--export-dynamic"],
+ debugCFlags=[
+ "-O0", "-Wall", "-Wuninitialized", "-Wunused", "-Wconversion",
+ "-fpermissive"
+ ],
+ debugLinkFlags=["-g"],
+ profileCFlags=["-g"],
+ profileLinkFlags=["-g"],
+ ompCFlags=["-fopenmp"],
+ ompLinkFlags=["-fopenmp"],
+ defFlagsStr="-D",
+ includeFlagsStr="-I"
+ )
+
+ def _intel_windows(self):
+ return dict(
+ ccFlags=["/MD", "/EHsc", "/Qvc10"],
+ optCFlags=[
+ "/O3", "/Qrestrict", "/Qprec-div-", "/Qvec-report0", "/Qip"
+ ], # last not profile only
+ optLinkFlags=["/MANIFEST"],
+ debugCFlags=[
+ "/Zi", "/Qrestrict", "/Fd${TARGET}.pdb", "/Od", "/W3", "/Wcheck"
+ ],
+ debugLinkFlags=["/debug"],
+ profileCFlags=["/Zi", "/Fd${TARGET}.pdb", "/Qprof-gen-"],
+ profileLinkFlags=["/debug"],
+ ompCFlags=["/Qopenmp"],
+ ompLinkFlags=[""],
+ defFlagsStr="/D",
+ includeFlagsStr="/I"
+ )
+
+ def _msvc_windows(self):
+ return dict(
+ ccFlags=["/MD", "/EHsc", "/wd4251"],
+ optCFlags=["/O2"],
+ optLinkFlags=["/MANIFEST"],
+ debugCFlags=["/Od", "/Zi", "/Fd${TARGET}.pdb", "/W3"],
+ debugLinkFlags=["/debug"],
+ profileCFlags=["/Zi", "/Fd${TARGET}.pdb"],
+ profileLinkFlags=["/debug"],
+ ompCFlags=["/openmp"],
+ ompLinkFlags=[""],
+ defFlagsStr="/D",
+ includeFlagsStr="/I"
+ )
+
+ #
+ # linux compilers
+ #
+ def _clang_linux(self):
+ return dict(
+ ccFlags=["-std=c++1z"],
+ optCFlags=["-O3"],
+ optLinkFlags=["-Wl,--export-dynamic"],
+ debugCFlags=[
+ "-g", "-O0", "-Wall", "-Wuninitialized", "-Wunused",
+ "-Wconversion", "-fpermissive"
+ ],
+ debugLinkFlags=["-g"],
+ profileCFlags=["-g"],
+ profileLinkFlags=["-g"],
+ ompCFlags=["-fopenmp"],
+ ompLinkFlags=["-fopenmp"],
+ defFlagsStr="-D",
+ includeFlagsStr="-I"
+ )
+
+ def _intel_linux(self):
+ return dict(
+ ccFlags=["-Wcheck"],
+ optCFlags=["-O3", "-no-prec-div", "-ip", "-qopt-report"],
+ optLinkFlags=["-O3"],
+ debugCFlags=["-g", "-O0", "-Wall"],
+ debugLinkFlags=["-g", "-O0"],
+ profileCFlags=["-g"],
+ profileLinkFlags=["-g"],
+ ompCFlags=["-openmp"],
+ ompLinkFlags=["-openmp"],
+ defFlagsStr="-D",
+ includeFlagsStr="-I"
+ )
+
+ def _gcc_linux(self):
+ return dict(
+ ccFlags=["-std=c++1z"],
+ optCFlags=["-O3"],
+ optLinkFlags=["-Wl,--export-dynamic"],
+ debugCFlags=[
+ "-g", "-O0", "-Wall", "-Wuninitialized", "-Wunused",
+ "-Wconversion", "-fpermissive", "-Wimplicit-fallthrough"
+ ],
+ debugLinkFlags=["-g"],
+ profileCFlags=["-g"],
+ profileLinkFlags=["-g"],
+ ompCFlags=["-fopenmp"],
+ ompLinkFlags=["-fopenmp"],
+ defFlagsStr="-D",
+ includeFlagsStr="-I"
+ )
+
+ def _arch_compiler_flags(self):
+ if self.__archObj.isLinux:
+ if self.__compiler == self.__gccCom:
+ return self._gcc_linux()
+ elif self.__compiler == self.__intelCom:
+ return self._intel_linux()
+ elif self.__compiler == self.__clangCom:
+ return self._clang_linux()
+ elif self.__archObj.isWindows:
+ retDict = None
+ if self.__compiler == self.__msvcCom:
+ retDict = self._msvc_windows()
+ elif self.__compiler == self.__intelCom:
+ retDict = self._intel_windows()
+ elif self.__compiler == self.__clangCom:
+ retDict = self._clang_windows()
+ return retDict
+
+ @property
+ def compilers(self):
+ return self.__compilers
+
+ @property
+ def defaultCompiler(self):
+ return self.__defaultCompiler
+
+ @property
+ def compiler(self):
+ return self.__compiler
+
+ @property
+ def cCompiler(self):
+ return self.__compilers[self.compiler][0]
+
+ @property
+ def cppCompiler(self):
+ return self.__compilers[self.compiler][1]
+
+ def getFlags(self):
+ __buildFlags = []
+ __linkFlags = []
+
+ __archFlags = self._arch_compiler_flags()
+ __buildFlags += __archFlags['ccFlags']
+
+ if self.__argObj.isDebug:
+ __buildFlags += __archFlags['debugCFlags']
+ __linkFlags += __archFlags['debugLinkFlags']
+ else:
+ __buildFlags += __archFlags['optCFlags']
+ __linkFlags += __archFlags['optLinkFlags']
+
+ __localDefs = {}
+
+ if not self.__argObj.isAssert:
+ __localDefs['NDEBUG'] = None
+
+ if self.__archObj.isWindows:
+ #__localDefs['BOOST_LIB_TOOLSET'] = 'vc141'
+ __localDefs['BOOST_ALL_DYN_LINK'] = None
+ #__localDefs['BOOST_LIB_DIAGNOSTIC'] = None
+
+ return dict(
+ buildFlags=__buildFlags,
+ linkFlags=__linkFlags,
+ localDefs=__localDefs,
+ defFlagsStr=__archFlags['defFlagsStr'],
+ includeFlagsStr=__archFlags['includeFlagsStr']
+ )
+
+ def summary(self):
+ __archFlags = self.getFlags()
+ lstr = '=' * 50 + '\n'
+ lstr += 'Compiler Configuration Summary\n'
+ lstr += '=' * 50 + '\n'
+ lstr += 'system compilers: ' + str(self.compilers) + '\n'
+ lstr += 'default compiler: ' + self.defaultCompiler + '\n'
+ lstr += 'selected compiler: ' + self.compiler + '\n'
+ lstr += 'build flags: ' + str(__archFlags['buildFlags']) + '\n'
+ lstr += 'link flags: ' + str(__archFlags['linkFlags']) + '\n'
+ lstr += 'def flags: ' + str(__archFlags['localDefs']) + '\n'
+ lstr += '-' * 50 + '\n'
+ return lstr
diff --git a/src/site_scons/miscsetup/CustomBuildEnvironment.py b/src/site_scons/miscsetup/CustomBuildEnvironment.py
new file mode 100644
index 0000000..e6c6859
--- /dev/null
+++ b/src/site_scons/miscsetup/CustomBuildEnvironment.py
@@ -0,0 +1,253 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+import os
+
+from SCons.Script import (Environment, Alias, Default, VariantDir, SConscript)
+
+from localtargets import Executable as LocalExecutable
+
+
+class CustomBuildEnvironment(object):
+
+ def __init__(self):
+
+ from .Architecture import Architecture
+ from .ArgumentsSetup import ArgumentsSetup
+ from .CompilerSetup import CompilerSetup
+ from .BuildPath import BuildPath
+ from .NamedObjectTable import NamedObjectTable
+
+ self.__archConfig = Architecture()
+ self.__argumentsConfig = ArgumentsSetup()
+ self.__compilerConfig = CompilerSetup(
+ self.__archConfig, self.__argumentsConfig
+ )
+ self.__pathConfig = BuildPath(self.__archConfig, self.__argumentsConfig)
+
+ additionalEnv = dict(
+ tools=[
+ 'default',
+ ]
+ )
+
+ self.__defaultEnv = Environment(ENV=os.environ, **additionalEnv)
+
+ buildAndLinkFlags = self.__compilerConfig.getFlags()
+
+ self.__defaultEnv.Replace(
+ CC=self.__compilerConfig.cCompiler,
+ CXX=self.__compilerConfig.cppCompiler
+ )
+ self.__defaultEnv['CPPFLAGS'] = buildAndLinkFlags['buildFlags']
+ self.__defaultEnv['LINKFLAGS'] = buildAndLinkFlags['linkFlags']
+ self.__defaultEnv['CPPDEFINES'] = buildAndLinkFlags['localDefs']
+ self.__defaultEnv['CPPDEFPREFIX'] = buildAndLinkFlags['defFlagsStr']
+ self.__defaultEnv['INCPREFIX'] = buildAndLinkFlags['includeFlagsStr']
+ self.__defaultEnv['CPPPATH'] = [
+ self.__pathConfig.srcDir,
+ self.__pathConfig.thirdpartyNoArchIncludeDir,
+ self.__pathConfig.thirdpartyArchIncludeDir,
+ ]
+ self.__defaultEnv['LIBPATH'] = [self.__pathConfig.libDir]
+ '''
+ self.__defaultEnv['_MSVC_OUTPUT_FLAG'] = '-o $TARGET'
+ self.__defaultEnv['CCCOM'] = self.__defaultEnv['CCCOM'].replace('/c', '-c')
+ self.__defaultEnv['CXXCOM'] = self.__defaultEnv['CXXCOM'].replace('/c', '-c')
+ self.__defaultEnv['SHCCCOM'] = self.__defaultEnv['SHCCCOM'].replace('/c', '-c')
+ self.__defaultEnv['SHCXXCOM'] = self.__defaultEnv['SHCXXCOM'].replace('/c', '-c')
+ self.__defaultEnv['CCFLAGS'].remove('/nologo')
+ self.__defaultEnv['CXXFLAGS'].remove('/TP')
+ '''
+
+ Alias('installBin', self.__pathConfig.binDir)
+ Alias('installLib', self.__pathConfig.libDir)
+ Alias('installLibPy', self.__pathConfig.libPyDir)
+ Alias('installTest', self.__pathConfig.testDir)
+ Alias('installEtc', self.__pathConfig.etcDir)
+
+ Alias(
+ 'install', [
+ 'installBin', 'installLib', 'installLibPy',
+ 'installTest', 'installEtc'
+ ]
+ )
+
+ Default('install')
+
+ '''
+ open('defaultEnv.txt', 'w').write(self.__defaultEnv.Dump())
+ '''
+
+ self.__localTargets = {
+ name: NamedObjectTable(tableName=title)
+ for name, title in [
+ ('program', 'Programs'),
+ ]
+ }
+
+ if self.isLinux:
+ pass #self.defaultEnv.Install(self.libDir, self.runtimeArchDir)
+
+ @property
+ def SConscript(self):
+ return 'SConscript'
+
+ @property
+ def defaultEnv(self):
+ return self.__defaultEnv
+
+ @property
+ def swigEnv(self):
+ return self.__swigEnv
+
+ @property
+ def srcDir(self):
+ return self.__pathConfig.srcDir
+
+ @property
+ def startDir(self):
+ return self.__pathConfig.startDir
+
+ @property
+ def cppDir(self):
+ return self.__pathConfig.cppDir
+
+ @property
+ def buildDir(self):
+ return self.__pathConfig.buildDir
+
+ @property
+ def binDir(self):
+ return self.__pathConfig.binDir
+
+ @property
+ def libDir(self):
+ return self.__pathConfig.libDir
+
+ @property
+ def libPyDir(self):
+ return self.__pathConfig.libPyDir
+
+ @property
+ def testDir(self):
+ return self.__pathConfig.testDir
+
+ @property
+ def etcDir(self):
+ return self.__pathConfig.etcDir
+
+ @property
+ def runtimeArchDir(self):
+ return self.__pathConfig.runtimeArchDir
+
+ @property
+ def thirdpartyArchLibDir(self):
+ return self.__pathConfig.thirdpartyArchLibDir
+
+ @property
+ def thirdpartyLibsPyDir(self):
+ return self.__pathConfig.thirdpartyLibsPyDir
+
+ @property
+ def isWindows(self):
+ return self.__archConfig.isWindows
+
+ @property
+ def isLinux(self):
+ return self.__archConfig.isLinux
+
+ @property
+ def isClean(self):
+ return self.__argumentsConfig.isClean
+
+ def _checkSources(self, sources, isShared=False):
+
+ if isinstance(sources, str):
+ sources = [sources]
+
+ assert isinstance(sources, list)
+
+ # sources = list(set(sources))
+ newSources = []
+ for src in sources:
+ if '.proto' in src:
+ protoObj = self.__localTargets['proto'].get(
+ [src.replace('.proto', '')]
+ )[0]
+ for ccSrc in protoObj.getCC():
+ newSources.append(
+ self.defaultEnv.SharedObject(ccSrc)
+ if isShared else self.defaultEnv.Object(ccSrc)
+ )
+ else:
+ newSources.append(src)
+
+ return newSources
+
+ def program(
+ self,
+ targetName,
+ sources,
+ localStaticLibs=[],
+ localSharedLibs=[],
+ externalLibs=[],
+ isBin=False
+ ):
+ sources = self._checkSources(sources)
+ progObj = LocalExecutable(
+ env=self,
+ name=targetName,
+ sources=sources,
+ localStaticLibs=localStaticLibs,
+ localSharedLibs=localSharedLibs,
+ externalLibs=[],#self.__externalLibTable.get(externalLibs),
+ isBin=isBin
+ )
+ self.__localTargets['program'].register(progObj)
+ return progObj
+
+ def _buildSConscript(self):
+
+ def _getRootList():
+ for root, _, files in os.walk(self.srcDir):
+ if self.SConscript in files:
+ yield root.replace(self.srcDir, self.buildDir)
+
+ for root in _getRootList():
+ SConscript(
+ os.path.join(root, self.SConscript), exports={
+ 'env': self
+ }
+ )
+
+ def build(self):
+
+ VariantDir(variant_dir=self.buildDir, src_dir=self.srcDir, duplicate=0)
+
+ self._buildSConscript()
+
+ print(self.summary())
+
+ def summary(self):
+ lstr = self.__archConfig.summary()
+ lstr += self.__argumentsConfig.summary()
+ lstr += self.__compilerConfig.summary()
+ lstr += self.__pathConfig.summary()
+ for name in sorted(list(self.__localTargets.keys())):
+ lstr += self.__localTargets[name].summary()
+ return lstr
diff --git a/src/site_scons/miscsetup/NamedObjectTable.py b/src/site_scons/miscsetup/NamedObjectTable.py
new file mode 100644
index 0000000..77667ab
--- /dev/null
+++ b/src/site_scons/miscsetup/NamedObjectTable.py
@@ -0,0 +1,52 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+
+class NamedObjectTable(object):
+
+ def __init__(self, tableName):
+ self.__name = tableName
+
+ self.__list = {}
+
+ @property
+ def name(self):
+ return self.__name
+
+ def register(self, namedObj):
+ self.__list[namedObj.name] = namedObj
+
+ def get(self, objNames):
+ keys = list(self.__list.keys())
+ namedObjs = []
+ for objName in objNames:
+ if objName in keys:
+ namedObjs.append(self.__list[objName])
+ else:
+ raise RuntimeError('Unknown ' + self.name + ': ' + objName)
+ return namedObjs
+
+ def iterObjects(self):
+ return iter(list(self.__list.values()))
+
+ def summary(self):
+ lstr = '=' * 50 + '\n'
+ lstr += self.name + ' Summary\n'
+ lstr += '=' * 50 + '\n'
+ for namedObj in list(self.__list.values()):
+ lstr += namedObj.summary() + '-' * 50 + '\n'
+ return lstr
diff --git a/src/site_scons/miscsetup/__init__.py b/src/site_scons/miscsetup/__init__.py
new file mode 100644
index 0000000..dab8c9f
--- /dev/null
+++ b/src/site_scons/miscsetup/__init__.py
@@ -0,0 +1,18 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+from .CustomBuildEnvironment import CustomBuildEnvironment
diff --git a/src/site_scons/site_init.py b/src/site_scons/site_init.py
new file mode 100644
index 0000000..c3e9792
--- /dev/null
+++ b/src/site_scons/site_init.py
@@ -0,0 +1,16 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
diff --git a/src/structural/SConscript b/src/structural/SConscript
new file mode 100644
index 0000000..d7271cb
--- /dev/null
+++ b/src/structural/SConscript
@@ -0,0 +1,22 @@
+#
+# This file is part of cpp-patterns.
+#
+# cpp-patterns is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# cpp-patterns is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with cpp-patterns. If not, see .
+#
+
+Import('env')
+
+env.program(targetName='decoratorEx',
+ sources=['decorator/decorator.cpp'],
+ localSharedLibs=[])
diff --git a/src/structural/decorator/Command.hpp b/src/structural/decorator/Command.hpp
new file mode 100644
index 0000000..db2a5e5
--- /dev/null
+++ b/src/structural/decorator/Command.hpp
@@ -0,0 +1,50 @@
+/*
+ * This file is part of cpp-patterns.
+ *
+ * cpp-patterns is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * cpp-patterns is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with cpp-patterns. If not, see .
+ */
+
+#ifndef SRC_STRUCTURAL_DECORATOR_COMMAND_HPP_
+#define SRC_STRUCTURAL_DECORATOR_COMMAND_HPP_
+
+#include
+
+namespace structural {
+
+namespace decorator {
+
+struct Command {
+ virtual ~Command() = default;
+
+ virtual void execute() const = 0;
+
+ template
+ static Command* generate(Command* p = nullptr)
+ {
+ return p ? p : new T();
+ }
+
+ template
+ static std::enable_if_t= 1, Command*> generate(
+ Command* p = nullptr)
+ {
+ return new D(generate(p));
+ }
+};
+
+} // namespace decorator
+
+} // namespace structural
+
+#endif // SRC_STRUCTURAL_DECORATOR_COMMAND_HPP_
diff --git a/src/structural/decorator/Decorator.hpp b/src/structural/decorator/Decorator.hpp
new file mode 100644
index 0000000..588cc8c
--- /dev/null
+++ b/src/structural/decorator/Decorator.hpp
@@ -0,0 +1,54 @@
+/*
+ * This file is part of cpp-patterns.
+ *
+ * cpp-patterns is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * cpp-patterns is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with cpp-patterns. If not, see .
+ */
+
+#ifndef SRC_STRUCTURAL_DECORATOR_DECORATOR_HPP_
+#define SRC_STRUCTURAL_DECORATOR_DECORATOR_HPP_
+
+#include "Command.hpp"
+
+#include
+
+namespace structural {
+
+namespace decorator {
+
+class Decorator : public Command {
+public:
+ Decorator(const Command* const p) : m_p(p) {}
+
+ virtual ~Decorator() = default;
+
+ virtual void execute() const override final
+ {
+ this->decorateBefore();
+ m_p->execute();
+ this->decorateAfter();
+ }
+
+protected:
+ virtual void decorateBefore() const = 0;
+ virtual void decorateAfter() const = 0;
+
+private:
+ const std::unique_ptr m_p;
+};
+
+} // namespace decorator
+
+} // namespace structural
+
+#endif // SRC_STRUCTURAL_DECORATOR_DECORATOR_HPP_
diff --git a/src/structural/decorator/Decorators.hpp b/src/structural/decorator/Decorators.hpp
new file mode 100644
index 0000000..137a06c
--- /dev/null
+++ b/src/structural/decorator/Decorators.hpp
@@ -0,0 +1,51 @@
+/*
+ * This file is part of cpp-patterns.
+ *
+ * cpp-patterns is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * cpp-patterns is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with cpp-patterns. If not, see .
+ */
+
+#ifndef SRC_STRUCTURAL_DECORATOR_DECORATORS_HPP_
+#define SRC_STRUCTURAL_DECORATOR_DECORATORS_HPP_
+
+#include "Decorator.hpp"
+
+namespace structural {
+
+namespace decorator {
+
+class BeforeDecorator : public Decorator {
+public:
+ BeforeDecorator(const Command* const p) : Decorator(p) {}
+
+ virtual ~BeforeDecorator() = default;
+
+protected:
+ virtual void decorateAfter() const override final {}
+};
+
+class AfterDecorator : public Decorator {
+public:
+ AfterDecorator(const Command* const p) : Decorator(p) {}
+
+ virtual ~AfterDecorator() = default;
+
+protected:
+ virtual void decorateBefore() const override final {}
+};
+
+} // namespace decorator
+
+} // namespace structural
+
+#endif // SRC_STRUCTURAL_DECORATOR_DECORATORS_HPP_
diff --git a/src/structural/decorator/decorator.cpp b/src/structural/decorator/decorator.cpp
new file mode 100644
index 0000000..b3c9c68
--- /dev/null
+++ b/src/structural/decorator/decorator.cpp
@@ -0,0 +1,120 @@
+/*
+ * This file is part of cpp-patterns.
+ *
+ * cpp-patterns is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * cpp-patterns is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with cpp-patterns. If not, see .
+ */
+
+#include "Decorators.hpp"
+
+#include
+#include
+
+class DecoratorA : public structural::decorator::BeforeDecorator {
+public:
+ DecoratorA(const structural::decorator::Command* const p)
+ : structural::decorator::BeforeDecorator(p)
+ {
+ }
+
+ virtual ~DecoratorA() { std::cout << "destroying DecoratorA\n"; }
+
+protected:
+ virtual void decorateBefore() const override
+ {
+ std::cout << "DecoratorA::decorateBefore()\n";
+ }
+};
+
+class DecoratorB : public structural::decorator::AfterDecorator {
+public:
+ DecoratorB(const structural::decorator::Command* const p)
+ : structural::decorator::AfterDecorator(p)
+ {
+ }
+
+ virtual ~DecoratorB() { std::cout << "destroying DecoratorB\n"; }
+
+protected:
+ virtual void decorateAfter() const override
+ {
+ std::cout << "DecoratorB::decorateAfter()\n";
+ }
+};
+
+class DecoratorC : public structural::decorator::AfterDecorator {
+public:
+ DecoratorC(const structural::decorator::Command* const p)
+ : structural::decorator::AfterDecorator(p)
+ {
+ }
+
+ virtual ~DecoratorC() { std::cout << "destroying DecoratorC\n"; }
+
+protected:
+ virtual void decorateAfter() const override
+ {
+ std::cout << "DecoratorC::decorateAfter()\n";
+ }
+};
+
+class DecoratorD : public structural::decorator::BeforeDecorator {
+public:
+ DecoratorD(const structural::decorator::Command* const p)
+ : structural::decorator::BeforeDecorator(p)
+ {
+ }
+
+ virtual ~DecoratorD() { std::cout << "destroying DecoratorD\n"; }
+
+protected:
+ virtual void decorateBefore() const override
+ {
+ std::cout << "DecoratorD::decorateBefore()\n";
+ }
+};
+
+struct CommandA : public structural::decorator::Command {
+ CommandA() = default;
+
+ virtual ~CommandA() = default;
+
+ virtual void execute() const override
+ {
+ std::cout << "CommandA::execute()\n";
+ }
+};
+
+int
+main(int argc, char** argv)
+{
+ // auto a = structural::decorator::Command::generate();
+ auto af = structural::decorator::Command::
+ generate();
+ // auto ag = structural::decorator::Command::generate(af); auto ak =
+ // structural::decorator::Command::generate();
+
+ std::cout << "----------------------\n";
+ // a->execute();
+ af->execute();
+ // ag->execute();
+ // ak->execute();
+
+ std::cout << "----------------------\n";
+ // delete a;
+ delete af;
+ // delete ak;
+}