Bug 568167: [RJ-Data] Add junit test for R data store implementations
Change-Id: I908566d067246f84f58f59f217d00688ce72b424
diff --git a/core/org.eclipse.statet.rj.data-tests/.classpath b/core/org.eclipse.statet.rj.data-tests/.classpath
new file mode 100644
index 0000000..322c4fc
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.classpath
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
+ <attributes>
+ <attribute name="module" value="true"/>
+ <attribute name="annotationpath" value="/org.eclipse.statet/eea/"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
+ <attributes>
+ <attribute name="annotationpath" value="/org.eclipse.statet/eea/"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="src" path="src">
+ <attributes>
+ <attribute name="test" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/core/org.eclipse.statet.rj.data-tests/.gitignore b/core/org.eclipse.statet.rj.data-tests/.gitignore
new file mode 100644
index 0000000..b83d222
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/core/org.eclipse.statet.rj.data-tests/.project b/core/org.eclipse.statet.rj.data-tests/.project
new file mode 100644
index 0000000..b3d9cf4
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>org.eclipse.statet.rj.data-tests</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.ManifestBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ <buildCommand>
+ <name>org.eclipse.pde.SchemaBuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.pde.PluginNature</nature>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.resources.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.runtime.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 0000000..5a0ad22
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+line.separator=\n
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..db488b8
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,513 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
+org.eclipse.jdt.core.compiler.annotation.inheritNullAnnotations=disabled
+org.eclipse.jdt.core.compiler.annotation.missingNonNullByDefaultAnnotation=ignore
+org.eclipse.jdt.core.compiler.annotation.nonnull=org.eclipse.statet.jcommons.lang.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnull.secondary=org.eclipse.jdt.annotation.NonNull
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault=org.eclipse.statet.jcommons.lang.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nonnullbydefault.secondary=org.eclipse.jdt.annotation.NonNullByDefault
+org.eclipse.jdt.core.compiler.annotation.nullable=org.eclipse.statet.jcommons.lang.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullable.secondary=org.eclipse.jdt.annotation.Nullable
+org.eclipse.jdt.core.compiler.annotation.nullanalysis=enabled
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=11
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=11
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.APILeak=warning
+org.eclipse.jdt.core.compiler.problem.annotatedTypeArgumentToUnannotated=info
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=info
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=disabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
+org.eclipse.jdt.core.compiler.problem.includeNullInfoFromAsserts=disabled
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
+org.eclipse.jdt.core.compiler.problem.missingDefaultCase=ignore
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingEnumCaseDespiteDefault=disabled
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotationForInterfaceMethodImplementation=enabled
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonnullParameterAnnotationDropped=warning
+org.eclipse.jdt.core.compiler.problem.nonnullTypeVariableFromLegacyInvocation=warning
+org.eclipse.jdt.core.compiler.problem.nullAnnotationInferenceConflict=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.problem.nullSpecViolation=warning
+org.eclipse.jdt.core.compiler.problem.nullUncheckedConversion=warning
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.pessimisticNullAnalysisForFreeTypeVariables=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
+org.eclipse.jdt.core.compiler.problem.potentiallyUnclosedCloseable=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+org.eclipse.jdt.core.compiler.problem.suppressOptionalErrors=disabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarningsNotFullyAnalysed=info
+org.eclipse.jdt.core.compiler.problem.syntacticNullAnalysisForFields=disabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.terminalDeprecation=warning
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
+org.eclipse.jdt.core.compiler.problem.unavoidableGenericTypeProblems=enabled
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unclosedCloseable=warning
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentType=warning
+org.eclipse.jdt.core.compiler.problem.unlikelyCollectionMethodArgumentTypeStrict=disabled
+org.eclipse.jdt.core.compiler.problem.unlikelyEqualsArgumentType=info
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=info
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.unstableAutoModuleName=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedExceptionParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedImport=warning
+org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
+org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
+org.eclipse.jdt.core.compiler.problem.unusedObjectAllocation=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=info
+org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=11
+org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
+org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
+org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false
+org.eclipse.jdt.core.formatter.align_with_spaces=false
+org.eclipse.jdt.core.formatter.alignment_for_additive_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_enum_constant=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_field=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_local_variable=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_method=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_package=49
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_parameter=0
+org.eclipse.jdt.core.formatter.alignment_for_annotations_on_type=49
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=80
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_assertion_message=16
+org.eclipse.jdt.core.formatter.alignment_for_assignment=16
+org.eclipse.jdt.core.formatter.alignment_for_bitwise_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
+org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=32
+org.eclipse.jdt.core.formatter.alignment_for_conditional_expression_chain=0
+org.eclipse.jdt.core.formatter.alignment_for_enum_constants=49
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=80
+org.eclipse.jdt.core.formatter.alignment_for_logical_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
+org.eclipse.jdt.core.formatter.alignment_for_module_statements=80
+org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_multiplicative_operator=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_record_components=16
+org.eclipse.jdt.core.formatter.alignment_for_relational_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=85
+org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
+org.eclipse.jdt.core.formatter.alignment_for_shift_operator=0
+org.eclipse.jdt.core.formatter.alignment_for_string_concatenation=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_record_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_annotations=0
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=80
+org.eclipse.jdt.core.formatter.blank_lines_after_imports=2
+org.eclipse.jdt.core.formatter.blank_lines_after_last_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_after_package=-2
+org.eclipse.jdt.core.formatter.blank_lines_before_abstract_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_field=0
+org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=1
+org.eclipse.jdt.core.formatter.blank_lines_before_imports=-2
+org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
+org.eclipse.jdt.core.formatter.blank_lines_before_method=1
+org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=2
+org.eclipse.jdt.core.formatter.blank_lines_before_package=-2
+org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=-2
+org.eclipse.jdt.core.formatter.blank_lines_between_statement_group_in_switch=0
+org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=2
+org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_constructor=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_record_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
+org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false
+org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
+org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
+org.eclipse.jdt.core.formatter.comment.format_block_comments=true
+org.eclipse.jdt.core.formatter.comment.format_header=false
+org.eclipse.jdt.core.formatter.comment.format_html=true
+org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
+org.eclipse.jdt.core.formatter.comment.format_line_comments=false
+org.eclipse.jdt.core.formatter.comment.format_source_code=true
+org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
+org.eclipse.jdt.core.formatter.comment.indent_root_tags=false
+org.eclipse.jdt.core.formatter.comment.indent_tag_description=true
+org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_between_different_tags=do not insert
+org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
+org.eclipse.jdt.core.formatter.comment.line_length=100
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=false
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
+org.eclipse.jdt.core.formatter.compact_else_if=true
+org.eclipse.jdt.core.formatter.continuation_indentation=2
+org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
+org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=false
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_record_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
+org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=insert
+org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_record_components=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_switch_case_expressions=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
+org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
+org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_after_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_not_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
+org.eclipse.jdt.core.formatter.insert_space_after_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_after_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_additive_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_case=insert
+org.eclipse.jdt.core.formatter.insert_space_before_arrow_in_switch_default=insert
+org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_bitwise_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_record_components=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_switch_case_expressions=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
+org.eclipse.jdt.core.formatter.insert_space_before_logical_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_multiplicative_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_constructor=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_record_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_record_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
+org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
+org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
+org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_relational_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_shift_operator=insert
+org.eclipse.jdt.core.formatter.insert_space_before_string_concatenation=insert
+org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
+org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
+org.eclipse.jdt.core.formatter.keep_annotation_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_anonymous_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_code_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_enum_constant_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_enum_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_if_then_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_lambda_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_loop_body_block_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_method_body_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_constructor_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_record_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_simple_getter_setter_on_one_line=false
+org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
+org.eclipse.jdt.core.formatter.keep_type_declaration_on_one_line=one_line_never
+org.eclipse.jdt.core.formatter.lineSplit=100
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.number_of_blank_lines_after_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_code_block=0
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=-1
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_code_block=-1
+org.eclipse.jdt.core.formatter.number_of_blank_lines_at_end_of_method_body=-1
+org.eclipse.jdt.core.formatter.number_of_blank_lines_before_code_block=0
+org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=2
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_record_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
+org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
+org.eclipse.jdt.core.formatter.tabulation.char=tab
+org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.text_block_indentation=0
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
+org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_additive_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assertion_message_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_bitwise_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_logical_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_multiplicative_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_before_relational_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_shift_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_string_concatenation=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.ui.prefs b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..08d6901
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,189 @@
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_remove_all=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=true
+cleanup.always_use_this_for_non_static_field_access=true
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.arrays_fill=true
+cleanup.bitwise_conditional_expression=false
+cleanup.boolean_literal=true
+cleanup.collection_cloning=false
+cleanup.convert_functional_interfaces=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+cleanup.convert_to_switch_expressions=false
+cleanup.correct_indentation=false
+cleanup.embedded_if=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.if_condition=true
+cleanup.insert_inferred_type_arguments=false
+cleanup.instanceof=true
+cleanup.lazy_logical_operator=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=true
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=true
+cleanup.map_cloning=false
+cleanup.merge_conditional_blocks=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=false
+cleanup.no_string_creation=false
+cleanup.no_super=false
+cleanup.number_suffix=true
+cleanup.objects_equals=false
+cleanup.organize_imports=true
+cleanup.precompile_regex=true
+cleanup.push_down_negation=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.redundant_falling_through_block_end=false
+cleanup.remove_private_constructors=true
+cleanup.remove_redundant_modifiers=false
+cleanup.remove_redundant_semicolons=true
+cleanup.remove_redundant_type_arguments=true
+cleanup.remove_trailing_whitespaces=false
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_array_creation=true
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.simplify_lambda_expression_and_method_ref=false
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_anonymous_class_creation=false
+cleanup.use_autoboxing=false
+cleanup.use_blocks=true
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_directly_map_method=false
+cleanup.use_lambda=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=true
+cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+cleanup.use_this_for_non_static_method_access=true
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup.use_unboxing=false
+cleanup.use_var=false
+cleanup.useless_continue=false
+cleanup.useless_return=false
+cleanup_profile=_StatET
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+formatter_profile=_StatET
+formatter_settings_version=20
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=\#java;\#;\#org.eclipse.statet.jcommons;\#org.eclipse.statet.ecommons;\#org.eclipse.statet;java;javax;com.ibm.icu;org.osgi;org.eclipse;;org.eclipse.statet.jcommons;org.eclipse.statet.ecommons;org.eclipse.statet;
+org.eclipse.jdt.ui.javadoc=true
+org.eclipse.jdt.ui.keywordthis=true
+org.eclipse.jdt.ui.ondemandthreshold=99
+org.eclipse.jdt.ui.overrideannotation=true
+org.eclipse.jdt.ui.staticondemandthreshold=99
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/*\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\#\n \# Copyright (c) ${year} ${user} and others.\n \# \n \# This program and the accompanying materials are made available under the\n \# terms of the Eclipse Public License 2.0 which is available at\n \# https\://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0\n \# which is available at https\://www.apache.org/licenses/LICENSE-2.0.\n \# \n \# SPDX-License-Identifier\: EPL-2.0 OR Apache-2.0\n \# \n \# Contributors\:\n \# ${user} - initial API and implementation\n \#\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=\=*/</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * \n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="modulecomment_context" deleted\="false" description\="Comment for modules" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.modulecomment" name\="modulecomment">/**\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="recordbody_context" deleted\="false" description\="Code in new record type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.recordbody" name\="recordbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated method stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_remove_all=false
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=true
+sp_cleanup.always_use_this_for_non_static_field_access=true
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.arrays_fill=false
+sp_cleanup.bitwise_conditional_expression=false
+sp_cleanup.boolean_literal=false
+sp_cleanup.collection_cloning=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.convert_to_enhanced_for_loop_if_loop_var_used=false
+sp_cleanup.convert_to_switch_expressions=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.embedded_if=false
+sp_cleanup.format_source_code=false
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.if_condition=false
+sp_cleanup.insert_inferred_type_arguments=false
+sp_cleanup.instanceof=false
+sp_cleanup.lazy_logical_operator=false
+sp_cleanup.make_local_variable_final=true
+sp_cleanup.make_parameters_final=true
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=false
+sp_cleanup.map_cloning=false
+sp_cleanup.merge_conditional_blocks=false
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=false
+sp_cleanup.no_string_creation=false
+sp_cleanup.no_super=false
+sp_cleanup.number_suffix=true
+sp_cleanup.objects_equals=false
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.precompile_regex=false
+sp_cleanup.push_down_negation=false
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=true
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.redundant_falling_through_block_end=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_redundant_modifiers=false
+sp_cleanup.remove_redundant_semicolons=true
+sp_cleanup.remove_redundant_type_arguments=true
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=false
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=true
+sp_cleanup.remove_unnecessary_array_creation=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=false
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=false
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.simplify_lambda_expression_and_method_ref=false
+sp_cleanup.sort_members=false
+sp_cleanup.sort_members_all=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_autoboxing=false
+sp_cleanup.use_blocks=true
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_directly_map_method=false
+sp_cleanup.use_lambda=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=true
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=false
+sp_cleanup.use_this_for_non_static_method_access=true
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+sp_cleanup.use_unboxing=false
+sp_cleanup.use_var=false
+sp_cleanup.useless_continue=false
+sp_cleanup.useless_return=false
diff --git a/core/org.eclipse.statet.rj.data-tests/META-INF/MANIFEST.MF b/core/org.eclipse.statet.rj.data-tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..85e5423
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/META-INF/MANIFEST.MF
@@ -0,0 +1,13 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-SymbolicName: org.eclipse.statet.rj.data.tests
+Automatic-Module-Name: org.eclipse.statet.rj.data.tests
+Bundle-Version: 4.3.0.qualifier
+Bundle-Vendor: Eclipse StatET
+Bundle-Name: StatET RJ - Data - Tests (Incubation)
+Fragment-Host: org.eclipse.statet.rj.services.core
+Bundle-RequiredExecutionEnvironment: JavaSE-11
+Import-Package: org.junit.jupiter.api;version="5.6.0",
+ org.junit.jupiter.api.function;version="5.6.0",
+ org.junit.jupiter.params;version="5.6.0",
+ org.junit.jupiter.params.provider;version="5.6.0"
diff --git a/core/org.eclipse.statet.rj.data-tests/about.html b/core/org.eclipse.statet.rj.data-tests/about.html
new file mode 100644
index 0000000..f094738
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/about.html
@@ -0,0 +1,31 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
+<title>About</title>
+</head>
+<body lang="EN-US">
+<h2>About This Content</h2>
+
+<p>January 1, 2019</p>
+<h3>License</h3>
+
+<p>The Eclipse Foundation makes available all content in this plug-in ("Content"). Unless
+ otherwise indicated below, the Content is provided to you under the terms and conditions of the
+ Eclipse Public License Version 2.0 ("EPL"), or the Apache License, Version 2.0 (AL).
+ A copy of the EPL is available at <a href="https://www.eclipse.org/legal/epl-2.0"
+ >https://www.eclipse.org/legal/epl-2.0</a>. For purposes of the EPL, "Program" will
+ mean the Content. A copy of the AL is available at <a href="https://www.apache.org/licenses/LICENSE-2.0"
+ >https://www.apache.org/licenses/LICENSE-2.0</a>.</p>
+
+<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being
+ redistributed by another party ("Redistributor") and different terms and conditions
+ may apply to your use of any object code in the Content. Check the Redistributor's license that
+ was provided with the Content. If no such license exists, contact the Redistributor. Unless
+ otherwise indicated below, the terms and conditions of the EPL or AL still apply to any source
+ code in the Content and such source code may be obtained at <a href="https://www.eclipse.org/"
+ >https://www.eclipse.org</a>.</p>
+
+</body>
+</html>
diff --git a/core/org.eclipse.statet.rj.data-tests/build.properties b/core/org.eclipse.statet.rj.data-tests/build.properties
new file mode 100644
index 0000000..239dd55
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/build.properties
@@ -0,0 +1,8 @@
+source..= src/
+output..= target/classes/
+javacDefaultEncoding..= UTF-8
+
+bin.includes= META-INF/,\
+ .,\
+ about.html
+src.includes= .settings/org.eclipse.core.resources.prefs
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/AbstractRStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/AbstractRStoreTest.java
new file mode 100644
index 0000000..80a7d09
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/AbstractRStoreTest.java
@@ -0,0 +1,226 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.function.IntConsumer;
+import java.util.function.LongConsumer;
+import java.util.function.Supplier;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RJIO;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class AbstractRStoreTest {
+
+
+ static boolean isBigDataEnabled(final int factor) {
+ return AbstractRawStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH <= (1 << 16);
+ }
+
+
+ private static class IndexMessageSupplier implements Supplier<String> {
+
+ private final String part1;
+ private long index;
+
+ public IndexMessageSupplier(final String part1) {
+ this.part1= part1;
+ }
+
+ @Override
+ public String get() {
+ return this.part1 + " at data index [" + this.index + "]";
+ }
+
+ }
+
+ private static final IndexMessageSupplier ARRAY_DIFFERS_MESSAGE= new IndexMessageSupplier("array differs");
+ private static final IndexMessageSupplier STORE_DIFFERS_MESSAGE= new IndexMessageSupplier("store differs");
+
+ static final Supplier<String> arrayDiffersAt(final int index) {
+ final IndexMessageSupplier supplier= ARRAY_DIFFERS_MESSAGE;
+ supplier.index= index;
+ return supplier;
+ }
+
+ static final Supplier<String> storeDiffersAt(final int index) {
+ final IndexMessageSupplier supplier= STORE_DIFFERS_MESSAGE;
+ supplier.index= index;
+ return supplier;
+ }
+
+
+ static class CaseData {
+
+
+ final String label;
+
+ final int length;
+
+ final boolean[] nas;
+
+
+ public CaseData(final String label, final boolean[] nas) {
+ this.label= label;
+ this.length= nas.length;
+ this.nas= nas;
+ }
+
+ public CaseData(final String label, final int length) {
+ this.label= label;
+ this.length= length;
+ this.nas= new boolean[length];
+ }
+
+
+ @Override
+ public String toString() {
+ return this.label;
+ }
+
+ }
+
+ static int getSegmentCount(final CaseData data, final int segmentLength) {
+ if (data.length == 0) {
+ return 0;
+ }
+ return 1 + (data.length - 1) / segmentLength;
+ }
+
+
+ @FunctionalInterface
+ protected static interface StoreConstructor<TStore extends ExternalizableRStore> {
+
+ TStore create(final RJIO in, final int length) throws IOException;
+
+ }
+
+ protected <TStore extends RStore<?> & ExternalizableRStore> byte[] writeExternal(
+ final TStore store) throws IOException {
+ final ByteArrayOutputStream byteOut= new ByteArrayOutputStream();
+ final ObjectOutputStream objOut= new ObjectOutputStream(byteOut);
+ final RJIO out= RJIO.get(objOut);
+ try {
+ out.flags= 0;
+ out.writeLong(store.getLength());
+ store.writeExternal(out);
+ }
+ finally {
+ out.disconnect(objOut);
+ }
+ objOut.close();
+ return byteOut.toByteArray();
+ }
+
+ protected <TStore extends RStore<?> & ExternalizableRStore> TStore readExternal(
+ final StoreConstructor<TStore> constructor, final byte[] serBytes) throws IOException {
+ final ByteArrayInputStream byteIn= new ByteArrayInputStream(serBytes);
+ final ObjectInputStream objIn= new ObjectInputStream(byteIn);
+ final RJIO in= RJIO.get(objIn);
+ try {
+ in.flags= 0;
+ final long length= in.readLong();
+ if (length > Integer.MAX_VALUE) {
+ fail("actual: " + length);
+ }
+ return constructor.create(in, (int)length);
+ }
+ finally {
+ in.disconnect(objIn);
+ }
+ }
+
+ protected <TStore extends RStore<?> & ExternalizableRStore> TStore createSerStore(
+ final TStore store, final StoreConstructor<TStore> constructor) {
+ try {
+ final byte[] serBytes= writeExternal(store);
+ return readExternal(constructor, serBytes);
+ }
+ catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+
+ static void checkLength(final CaseData data, final RStore<?> store) {
+ assertEquals(data.length, store.getLength());
+ }
+
+ static void checkIsNA(final CaseData data, final RStore<?> store) {
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertTrue(store.isNA(i0), storeDiffersAt(i0));
+ assertTrue(store.isNA((long)i0), storeDiffersAt(i0));
+ }
+ else {
+ assertFalse(store.isNA(i0), storeDiffersAt(i0));
+ assertFalse(store.isNA((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::isNA, store::isNA);
+ }
+
+ static void checkIsMissingNonNum(final CaseData data, final RStore<?> store) {
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertTrue(store.isMissing(i0), storeDiffersAt(i0));
+ assertTrue(store.isMissing((long)i0), storeDiffersAt(i0));
+ }
+ else {
+ assertFalse(store.isMissing(i0), storeDiffersAt(i0));
+ assertFalse(store.isMissing((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+ }
+
+
+ static void assertUnsupported(final CaseData data, final IntConsumer intMethod, final LongConsumer longMethod) {
+ if (data.length > 0) {
+ assertThrows(UnsupportedOperationException.class, () -> intMethod.accept(0));
+ assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(0));
+ }
+ assertThrows(UnsupportedOperationException.class, () -> intMethod.accept(-1));
+ assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(-1));
+ assertThrows(UnsupportedOperationException.class, () -> intMethod.accept(data.length));
+ assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(data.length));
+ assertThrows(UnsupportedOperationException.class, () -> longMethod.accept(Long.MAX_VALUE));
+ }
+
+ static void assertIndexOutOfBounds(final CaseData data, final IntConsumer intMethod, final LongConsumer longMethod) {
+ assertThrows(IndexOutOfBoundsException.class, () -> intMethod.accept(-1));
+ assertThrows(IndexOutOfBoundsException.class, () -> longMethod.accept(-1));
+ assertThrows(IndexOutOfBoundsException.class, () -> intMethod.accept(data.length));
+ assertThrows(IndexOutOfBoundsException.class, () -> longMethod.accept(data.length));
+ assertThrows(IndexOutOfBoundsException.class, () -> longMethod.accept(Long.MAX_VALUE));
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreSerTest.java
new file mode 100644
index 0000000..cdd2cf4
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+
+
+@NonNullByDefault
+public class RCharacter32StoreSerTest extends RCharacter32StoreTest {
+
+
+ public RCharacter32StoreSerTest() {
+ }
+
+
+ @Override
+ protected RCharacterStore createStore(final CharCaseData data) {
+ return createSerStore((RCharacter32Store)super.createStore(data),
+ RCharacter32Store::new );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreTest.java
new file mode 100644
index 0000000..5cfeccc
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacter32StoreTest.java
@@ -0,0 +1,44 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+
+
+@NonNullByDefault
+public class RCharacter32StoreTest extends RCharacterStoreTest {
+
+
+ public RCharacter32StoreTest() {
+ }
+
+
+ @Override
+ protected RCharacterStore createStore(final CharCaseData data) {
+ final @Nullable String[] encoded= Arrays.copyOf(data.values, data.length);
+ for (int j= 0; j < data.length; j++) {
+ if (data.nas[j]) {
+ encoded[j]= null;
+ }
+ }
+ return new RCharacter32Store(encoded);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterFix64StoreTest.java
new file mode 100644
index 0000000..321ae35
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterFix64StoreTest.java
@@ -0,0 +1,54 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RCharacterFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+
+
+@NonNullByDefault
+public class RCharacterFix64StoreTest extends RCharacterStoreTest {
+
+
+ public RCharacterFix64StoreTest() {
+ }
+
+
+ @Override
+ protected RCharacterStore createStore(final CharCaseData data) {
+ final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+ final var values= new @Nullable String [nSegments] @NonNull[];
+ for (int i= 0, start= 0; i < values.length; i++) {
+ final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+ final String[] encoded= Arrays.copyOfRange(data.values, start, end);
+ for (int j= 0; j < encoded.length; j++) {
+ if (data.nas[start + j]) {
+ encoded[j]= null;
+ }
+ }
+ values[i]= encoded;
+ start= end;
+ }
+ return new RCharacterFix64Store(values);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterStoreTest.java
new file mode 100644
index 0000000..e42fe7c
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RCharacterStoreTest.java
@@ -0,0 +1,290 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RCharacterStore;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RCharacterStoreTest extends AbstractRStoreTest {
+
+
+ static class CharCaseData extends CaseData {
+
+ final String[] values;
+
+
+ public CharCaseData(final String label, final String[] values, final boolean[] nas) {
+ super(label, nas);
+ assert (values.length == this.length);
+ assert (nas.length == this.length);
+ this.values= values;
+ }
+
+ public CharCaseData(final String label, final String[] values) {
+ super(label, values.length);
+ assert (values.length == this.length);
+ this.values= values;
+ }
+
+ }
+
+
+ private static final Map<String, Boolean> LOGI_STRINGS;
+ static {
+ final var map= new LinkedHashMap<String, Boolean>();
+ for (final String s : List.<String>of("T", "TRUE", "True", "true")) {
+ map.put(s, Boolean.TRUE);
+ }
+ for (final String s : List.<String>of("F", "FALSE", "False", "false")) {
+ map.put(s, Boolean.FALSE);
+ }
+ LOGI_STRINGS= map;
+ }
+
+
+ protected static final List<CharCaseData> DEFAULT_DATA_SOURCES;
+ static {
+ final var datas= new ArrayList<CharCaseData>();
+
+ datas.add(new CharCaseData("empty", new @Nullable String[0]));
+
+ datas.add(new CharCaseData("single-empty", new String[] { "" }));
+ datas.add(new CharCaseData("single-1", new String[] { "1" }));
+ datas.add(new CharCaseData("single", new String[] { "abcdefghijkl" }));
+ datas.add(new CharCaseData("single-NA", new String[] { null }, new boolean[] { true }));
+
+ { final String[] values= new String[LOGI_STRINGS.size() + 3];
+ final boolean[] nas= new boolean[values.length];
+ int i= 0;
+ for (final String string : LOGI_STRINGS.keySet()) {
+ values[i++]= string;
+ }
+ values[i++]= "TRue";
+ values[i++]= "falsE";
+ nas[i++]= true;
+ datas.add(new CharCaseData("logi", values, nas));
+ }
+
+ { final Random rand= new Random(16857);
+ final String[] values= new String[100000];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= Integer.toString(rand.nextInt());
+ }
+ datas.add(new CharCaseData("rand100000", values));
+ }
+ if (isBigDataEnabled(64)) {
+ final Random rand= new Random(46);
+ final String[] values= new String[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= Integer.toHexString(rand.nextInt());
+ }
+ datas.add(new CharCaseData("randMultiSeg", values));
+ }
+
+ DEFAULT_DATA_SOURCES= datas;
+ }
+
+
+ public RCharacterStoreTest() {
+ }
+
+
+ public static List<CharCaseData> provideCaseDatas() {
+ return new ArrayList<>(DEFAULT_DATA_SOURCES);
+ }
+
+ protected abstract RCharacterStore createStore(final CharCaseData data);
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getStoreType(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ assertEquals(RStore.CHARACTER, store.getStoreType());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getBaseVectorRClassName(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ assertEquals(RObject.CLASSNAME_CHARACTER, store.getBaseVectorRClassName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void length(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ checkLength(data, store);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isNA(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ checkIsNA(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isMissing(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ checkIsMissingNonNum(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ @SuppressWarnings("boxing")
+ public void getLogi(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ try {
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final Boolean logi= LOGI_STRINGS.get(data.values[i0]);
+ if (logi != null) {
+ final boolean expected= logi.booleanValue();
+ assertEquals(expected, store.getLogi(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getLogi((long)i0), storeDiffersAt(i0));
+ }
+ else {
+ assertThrows(NumberFormatException.class, () -> store.getLogi(i0), storeDiffersAt(i0));
+ assertThrows(NumberFormatException.class, () -> store.getLogi((long)i0), storeDiffersAt(i0));
+ }
+ }
+ }
+ catch (final NumberFormatException e) {
+ fail(storeDiffersAt(i0).get(), e);
+ }
+ }
+ assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getInt(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ assertUnsupported(data, store::getInt, store::getInt);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getNum(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ assertUnsupported(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getChar(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final String expected= data.values[i0];
+ assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getChar, store::getChar);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getRaw(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ assertUnsupported(data, store::getRaw, store::getRaw);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void get(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i), storeDiffersAt(i0));
+ }
+ else {
+ final String expected= data.values[i0];
+ assertEquals(expected, store.get(i0));
+ assertEquals(expected, store.get((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::get, store::get);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void toArray(final CharCaseData data) {
+ final RCharacterStore store= createStore(data);
+
+ final @Nullable String[] array= store.toArray();
+
+ assertEquals(data.values.length, array.length);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i), arrayDiffersAt(i0));
+ }
+ else {
+ final String expected= data.values[i0];
+ assertEquals(expected, array[i], arrayDiffersAt(i0));
+ }
+ }
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreSerTest.java
new file mode 100644
index 0000000..30dc3a7
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+
+
+@NonNullByDefault
+public class RComplexB32StoreSerTest extends RComplexB32StoreTest {
+
+
+ public RComplexB32StoreSerTest() {
+ }
+
+
+ @Override
+ protected RComplexStore createStore(final CplxCaseData data) {
+ return createSerStore((RComplexB32Store)super.createStore(data),
+ RComplexB32Store::new );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreTest.java
new file mode 100644
index 0000000..f2a9bae
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexB32StoreTest.java
@@ -0,0 +1,40 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+
+
+@NonNullByDefault
+public class RComplexB32StoreTest extends RComplexStoreTest {
+
+
+ public RComplexB32StoreTest() {
+ }
+
+
+ @Override
+ protected RComplexStore createStore(final CplxCaseData data) {
+ return new RComplexB32Store(
+ Arrays.copyOf(data.realValues, data.length),
+ Arrays.copyOf(data.imaginaryValues, data.length),
+ Arrays.copyOf(data.nas, data.length) );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexBFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexBFix64StoreTest.java
new file mode 100644
index 0000000..d86e946
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexBFix64StoreTest.java
@@ -0,0 +1,51 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RComplexBFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+
+
+@NonNullByDefault
+public class RComplexBFix64StoreTest extends RComplexStoreTest {
+
+
+ public RComplexBFix64StoreTest() {
+ }
+
+
+ @Override
+ protected RComplexStore createStore(final CplxCaseData data) {
+ final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+ final var reValues= new double [nSegments] @NonNull[];
+ final var imValues= new double [nSegments] @NonNull[];
+ final var nas= new boolean [nSegments] @NonNull[];
+ for (int i= 0, start= 0; i < reValues.length; i++) {
+ final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+ reValues[i]= Arrays.copyOfRange(data.realValues, start, end);
+ imValues[i]= Arrays.copyOfRange(data.imaginaryValues, start, end);
+ nas[i]= Arrays.copyOfRange(data.nas, start, end);
+ start= end;
+ }
+ return new RComplexBFix64Store(reValues, imValues, nas);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexStoreTest.java
new file mode 100644
index 0000000..2959445
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RComplexStoreTest.java
@@ -0,0 +1,313 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RComplexStore;
+import org.eclipse.statet.rj.data.RComplexStore.Complex;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RComplexStoreTest extends AbstractRStoreTest {
+
+
+ static class CplxCaseData extends CaseData {
+
+ final double[] realValues;
+ final double[] imaginaryValues;
+
+
+ public CplxCaseData(final String label, final double[] realValues, final double[] imaginaryValues,
+ final boolean[] nas) {
+ super(label, nas);
+ assert (realValues.length == this.length);
+ assert (imaginaryValues.length == this.length);
+ this.realValues= realValues;
+ this.imaginaryValues= imaginaryValues;
+ }
+
+ public CplxCaseData(final String label, final double[] realValues, final double[] imaginaryValues) {
+ super(label, realValues.length);
+ assert (realValues.length == this.length);
+ assert (imaginaryValues.length == this.length);
+ this.realValues= realValues;
+ this.imaginaryValues= imaginaryValues;
+ }
+
+ }
+
+ protected static final List<CplxCaseData> DEFAULT_DATA_SOURCES;
+ static {
+ final var datas= new ArrayList<CplxCaseData>();
+
+ datas.add(new CplxCaseData("empty", new double[0], new double[0]));
+
+ datas.add(new CplxCaseData("single-0", new double[] { 0 }, new double[] { 0 }));
+ datas.add(new CplxCaseData("single-1", new double[] { 1 }, new double[] { 0 }));
+ datas.add(new CplxCaseData("single-i1", new double[] { 0 }, new double[] { 1 }));
+ datas.add(new CplxCaseData("single-NA", new double[] { 0 }, new double[] { 0 }, new boolean[] { true }));
+
+ { final double[] realValues= new double[0xFF];
+ final double[] imaginaryValues= new double[realValues.length];
+ final boolean[] nas= new boolean[realValues.length];
+ int i= 0;
+ realValues[i++]= 0;
+ realValues[i++]= -0;
+ realValues[i++]= +1;
+ realValues[i++]= -1;
+ realValues[i++]= Double.MIN_NORMAL;
+ realValues[i++]= Double.MIN_VALUE;
+ realValues[i++]= Double.MAX_VALUE;
+ realValues[i++]= Double.POSITIVE_INFINITY;
+ realValues[i++]= -Double.NEGATIVE_INFINITY;
+ realValues[i++]= Double.NaN;
+ imaginaryValues[i++]= -0;
+ imaginaryValues[i++]= -1;
+ imaginaryValues[i++]= +1;
+ imaginaryValues[i++]= Double.MIN_NORMAL;
+ imaginaryValues[i++]= Double.MIN_VALUE;
+ imaginaryValues[i++]= -Double.MAX_VALUE;
+ imaginaryValues[i++]= Double.POSITIVE_INFINITY;
+ imaginaryValues[i++]= -Double.NEGATIVE_INFINITY;
+ nas[i++]= true;
+
+ datas.add(new CplxCaseData("special", realValues, imaginaryValues, nas));
+ }
+
+ { final Random rand= new Random(16857);
+ final double[] realValues= new double[100000];
+ final double[] imaginaryValues= new double[realValues.length];
+ for (int i= 0; i < realValues.length; i++) {
+ realValues[i]= rand.nextDouble();
+ imaginaryValues[i]= rand.nextDouble();
+ }
+ datas.add(new CplxCaseData("rand100000", realValues, imaginaryValues));
+ }
+ if (isBigDataEnabled(24)) {
+ final Random rand= new Random(46);
+ final double[] realValues= new double[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ final double[] imaginaryValues= new double[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ for (int i= 0; i < realValues.length; i++) {
+ realValues[i]= rand.nextDouble();
+ }
+ datas.add(new CplxCaseData("randMultiSeg", realValues, imaginaryValues));
+ }
+
+ DEFAULT_DATA_SOURCES= datas;
+ }
+
+
+ public RComplexStoreTest() {
+ }
+
+
+ public static List<CplxCaseData> provideCaseDatas() {
+ return new ArrayList<>(DEFAULT_DATA_SOURCES);
+ }
+
+ protected abstract RComplexStore createStore(final CplxCaseData data);
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getStoreType(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ assertEquals(RStore.COMPLEX, store.getStoreType());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getBaseVectorRClassName(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ assertEquals(RObject.CLASSNAME_COMPLEX, store.getBaseVectorRClassName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void length(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ checkLength(data, store);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isNA(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ checkIsNA(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isMissing(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]
+ || Double.isNaN(data.realValues[i0]) || Double.isNaN(data.imaginaryValues[i0])) {
+ assertTrue(store.isMissing(i0), storeDiffersAt(i0));
+ assertTrue(store.isMissing((long)i0), storeDiffersAt(i0));
+ }
+ else {
+ assertFalse(store.isMissing(i0), storeDiffersAt(i0));
+ assertFalse(store.isMissing((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getLogi(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ assertUnsupported(data, store::getLogi, store::getLogi);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getInt(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ assertUnsupported(data, store::getInt, store::getInt);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getNum(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ assertUnsupported(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getCplx(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final double expectedRe= data.realValues[i0];
+ final double expectedIm= data.imaginaryValues[i0];
+ assertEquals(expectedRe, store.getCplxRe(i0), storeDiffersAt(i0));
+ assertEquals(expectedRe, store.getCplxRe((long)i0), storeDiffersAt(i0));
+ assertEquals(expectedIm, store.getCplxIm(i0), storeDiffersAt(i0));
+ assertEquals(expectedIm, store.getCplxIm((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getCplxRe, store::getCplxRe);
+ assertIndexOutOfBounds(data, store::getCplxIm, store::getCplxIm);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getChar(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final String reStr= Double.toString(data.realValues[i0]).replace("Infinity", "Inf");
+ final String imStr= Double.toString(data.imaginaryValues[i0]).replace("Infinity", "Inf");
+ final String expected= (imStr.charAt(0) != '-') ?
+ (reStr + '+' + imStr + 'i') :
+ (reStr + imStr + 'i');
+ assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getChar, store::getChar);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getRaw(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ assertUnsupported(data, store::getRaw, store::getRaw);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void get(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i0), storeDiffersAt(i0));
+ }
+ else {
+ final Complex expected= new Complex(data.realValues[i0], data.imaginaryValues[i0]);
+ assertEquals(expected, store.get(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.get((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::get, store::get);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void toArray(final CplxCaseData data) {
+ final RComplexStore store= createStore(data);
+
+ final @Nullable Complex[] array= store.toArray();
+
+ assertEquals(data.realValues.length, array.length);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(array[i0], arrayDiffersAt(i0));
+ }
+ else {
+ final Complex expected= new Complex(data.realValues[i0], data.imaginaryValues[i0]);
+ assertEquals(expected, array[i0], arrayDiffersAt(i0));
+ }
+ }
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreSerTest.java
new file mode 100644
index 0000000..7726d52
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+
+
+@NonNullByDefault
+public class RInteger32StoreSerTest extends RInteger32StoreTest {
+
+
+ public RInteger32StoreSerTest() {
+ }
+
+
+ @Override
+ protected RIntegerStore createStore(final IntCaseData data) {
+ return createSerStore((RInteger32Store)super.createStore(data),
+ RInteger32Store::new );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreTest.java
new file mode 100644
index 0000000..9dfc012
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RInteger32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+
+
+@NonNullByDefault
+public class RInteger32StoreTest extends RIntegerStoreTest {
+
+
+ public RInteger32StoreTest() {
+ }
+
+
+ @Override
+ protected RIntegerStore createStore(final IntCaseData data) {
+ return new RInteger32Store(
+ Arrays.copyOf(data.values, data.length),
+ Arrays.copyOf(data.nas, data.length) );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerFix64StoreTest.java
new file mode 100644
index 0000000..c6f3429
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerFix64StoreTest.java
@@ -0,0 +1,49 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RIntegerFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+
+
+@NonNullByDefault
+public class RIntegerFix64StoreTest extends RIntegerStoreTest {
+
+
+ public RIntegerFix64StoreTest() {
+ }
+
+
+ @Override
+ protected RIntegerStore createStore(final IntCaseData data) {
+ final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+ final var values= new int [nSegments] @NonNull[];
+ final var nas= new boolean [nSegments] @NonNull[];
+ for (int i= 0, start= 0; i < values.length; i++) {
+ final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+ values[i]= Arrays.copyOfRange(data.values, start, end);
+ nas[i]= Arrays.copyOfRange(data.nas, start, end);
+ start= end;
+ }
+ return new RIntegerFix64Store(values, nas);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerStoreTest.java
new file mode 100644
index 0000000..c5fc5bc
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RIntegerStoreTest.java
@@ -0,0 +1,302 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RIntegerStoreTest extends AbstractRStoreTest {
+
+
+ static class IntCaseData extends CaseData {
+
+ final int[] values;
+
+
+ public IntCaseData(final String label, final int[] values, final boolean[] nas) {
+ super(label, nas);
+ assert (values.length == this.length);
+ assert (nas.length == this.length);
+ this.values= values;
+ }
+
+ public IntCaseData(final String label, final int[] values) {
+ super(label, values.length);
+ assert (values.length == this.length);
+ this.values= values;
+ }
+
+ }
+
+ protected static final List<IntCaseData> DEFAULT_DATA_SOURCES;
+ static {
+ final var datas= new ArrayList<IntCaseData>();
+
+ datas.add(new IntCaseData("empty", new int[0]));
+
+ datas.add(new IntCaseData("single-0", new int[] { 0 }));
+ datas.add(new IntCaseData("single-1", new int[] { 1 }));
+ datas.add(new IntCaseData("single-MAX", new int[] { RIntegerStore.MIN_INT }));
+ datas.add(new IntCaseData("single-MIN", new int[] { RIntegerStore.MAX_INT }));
+ datas.add(new IntCaseData("single-NA", new int[] { 0 }, new boolean[] { true }));
+
+ { final int[] values= new int[0x1FF];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= i - 0xFF;
+ }
+ datas.add(new IntCaseData("seq", values));
+ }
+ { final int[] values= new int[0x0FF];
+ final boolean[] nas= new boolean[values.length];
+ int i= 0;
+ values[i++]= 0;
+ values[i++]= RIntegerStore.MIN_INT;
+ values[i++]= RIntegerStore.MAX_INT;
+ nas[i++]= true;
+ datas.add(new IntCaseData("special", values, nas));
+ }
+
+ { final Random rand= new Random(16857);
+ final int[] values= new int[100000];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= rand.nextInt();
+ if (values[i] == Integer.MIN_VALUE) {
+ values[i]= 0;
+ }
+ }
+ datas.add(new IntCaseData("rand100000", values));
+ }
+ if (isBigDataEnabled(4)) {
+ final Random rand= new Random(46);
+ final int[] values= new int[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= rand.nextInt();
+ if (values[i] == Integer.MIN_VALUE) {
+ values[i]= 0;
+ }
+ }
+ datas.add(new IntCaseData("randMultiSeg", values));
+ }
+
+ DEFAULT_DATA_SOURCES= datas;
+ }
+
+
+ public RIntegerStoreTest() {
+ }
+
+
+ public static List<IntCaseData> provideCaseDatas() {
+ return new ArrayList<>(DEFAULT_DATA_SOURCES);
+ }
+
+ protected abstract RIntegerStore createStore(final IntCaseData data);
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getStoreType(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ assertEquals(RStore.INTEGER, store.getStoreType());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getBaseVectorRClassName(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ assertEquals(RObject.CLASSNAME_INTEGER, store.getBaseVectorRClassName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void length(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ checkLength(data, store);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isNA(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ checkIsNA(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isMissing(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ checkIsMissingNonNum(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ @SuppressWarnings("boxing")
+ public void getLogi(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final Boolean expected= Boolean.valueOf(data.values[i0] != 0);
+ assertEquals(expected, store.getLogi(i0));
+ assertEquals(expected, store.getLogi((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getInt(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final int expected= data.values[i0];
+ assertEquals(expected, store.getInt(i0));
+ assertEquals(expected, store.getInt((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getInt, store::getInt);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getNum(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final double expected= data.values[i0];
+ assertEquals(expected, store.getNum(i0));
+ assertEquals(expected, store.getNum((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getChar(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final String expected= Integer.toString(data.values[i0]);
+ assertEquals(expected, store.getChar(i0));
+ assertEquals(expected, store.getChar((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getChar, store::getChar);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getRaw(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else if (data.values[i0] >= 0 && data.values[i0] < 0xFF) {
+ final byte expected= (byte)(data.values[i0] & 0xFF);
+ assertEquals(expected, store.getRaw(i0));
+ assertEquals(expected, store.getRaw((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getRaw, store::getRaw);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void get(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i0), storeDiffersAt(i0));
+ }
+ else {
+ final Integer expected= Integer.valueOf(data.values[i0]);
+ assertEquals(expected, store.get(i0));
+ assertEquals(expected, store.get((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::get, store::get);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void toArray(final IntCaseData data) {
+ final RIntegerStore store= createStore(data);
+
+ final @Nullable Integer[] array= store.toArray();
+ assertEquals(data.values.length, array.length);
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i0), storeDiffersAt(i0));
+ }
+ else {
+ final Integer expected= Integer.valueOf(data.values[i]);
+ assertEquals(expected, array[i], arrayDiffersAt(i));
+ }
+ }
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreSerTest.java
new file mode 100644
index 0000000..af87a0b
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalByte32StoreSerTest extends RLogicalByte32StoreTest {
+
+
+ public RLogicalByte32StoreSerTest() {
+ }
+
+
+ @Override
+ protected RLogicalStore createStore(final LogiCaseData data) {
+ return createSerStore((RLogicalByte32Store)super.createStore(data),
+ RLogicalByte32Store::new );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreTest.java
new file mode 100644
index 0000000..ea25310
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByte32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalByte32StoreTest extends RLogicalStoreTest {
+
+
+ public RLogicalByte32StoreTest() {
+ }
+
+
+ @Override
+ protected RLogicalStore createStore(final LogiCaseData data) {
+ return new RLogicalByte32Store(
+ Arrays.copyOf(data.values, data.length),
+ Arrays.copyOf(data.nas, data.length) );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64StoreTest.java
new file mode 100644
index 0000000..9482e6f
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64StoreTest.java
@@ -0,0 +1,49 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RLogicalByteFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalByteFix64StoreTest extends RLogicalStoreTest {
+
+
+ public RLogicalByteFix64StoreTest() {
+ }
+
+
+ @Override
+ protected RLogicalStore createStore(final LogiCaseData data) {
+ final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+ final var values= new boolean [nSegments] @NonNull[];
+ final var nas= new boolean [nSegments] @NonNull[];
+ for (int i= 0, start= 0; i < values.length; i++) {
+ final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+ values[i]= Arrays.copyOfRange(data.values, start, end);
+ nas[i]= Arrays.copyOfRange(data.nas, start, end);
+ start= end;
+ }
+ return new RLogicalByteFix64Store(values, nas);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalInt32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalInt32StoreTest.java
new file mode 100644
index 0000000..e9a9d6e
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalInt32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+
+
+@NonNullByDefault
+public class RLogicalInt32StoreTest extends RLogicalStoreTest {
+
+
+ public RLogicalInt32StoreTest() {
+ }
+
+
+ @Override
+ protected RLogicalStore createStore(final LogiCaseData data) {
+ return new RLogicalInt32Store(
+ Arrays.copyOf(data.values, data.length),
+ Arrays.copyOf(data.nas, data.length) );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalStoreTest.java
new file mode 100644
index 0000000..7234725
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RLogicalStoreTest.java
@@ -0,0 +1,292 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNull;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RLogicalStore;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RLogicalStoreTest extends AbstractRStoreTest {
+
+
+ static class LogiCaseData extends CaseData {
+
+ final boolean[] values;
+
+
+ public LogiCaseData(final String label, final boolean[] values, final boolean[] nas) {
+ super(label, nas);
+ assert (values.length == this.length);
+ assert (nas.length == this.length);
+ this.values= values;
+ }
+
+ public LogiCaseData(final String label, final boolean[] values) {
+ super(label, values.length);
+ assert (values.length == this.length);
+ this.values= values;
+ }
+
+ }
+
+ protected static final List<LogiCaseData> DEFAULT_DATA_SOURCES;
+ static {
+ final var datas= new ArrayList<LogiCaseData>();
+
+ datas.add(new LogiCaseData("empty", new boolean[0]));
+
+ datas.add(new LogiCaseData("single-TRUE", new boolean[] { true }));
+ datas.add(new LogiCaseData("single-FALSE", new boolean[] { false }));
+ datas.add(new LogiCaseData("single-NA", new boolean[] { false }, new boolean[] { true }));
+
+ { final boolean[] values= new boolean[0xFF];
+ final boolean[] nas= new boolean[values.length];
+ int i= 0;
+ values[i++]= false;
+ values[i++]= true;
+ nas[i++]= true;
+ for (; i < values.length; i++) {
+ values[i]= (i % 2 == 0);
+ }
+ datas.add(new LogiCaseData("special", values, nas));
+ }
+
+ { final Random rand= new Random(16857);
+ final boolean[] values= new boolean[100000];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= rand.nextBoolean();
+ }
+ datas.add(new LogiCaseData("rand100000", values));
+ }
+ if (isBigDataEnabled(1)) {
+ final Random rand= new Random(46);
+ final boolean[] values= new boolean[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= rand.nextBoolean();
+ }
+ datas.add(new LogiCaseData("randMultiSeg", values));
+ }
+
+ DEFAULT_DATA_SOURCES= datas;
+ }
+
+
+ public RLogicalStoreTest() {
+ }
+
+
+ public static List<LogiCaseData> provideCaseDatas() {
+ return new ArrayList<>(DEFAULT_DATA_SOURCES);
+ }
+
+ protected abstract RLogicalStore createStore(final LogiCaseData data);
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getStoreType(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ assertEquals(RStore.LOGICAL, store.getStoreType());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getBaseVectorRClassName(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ assertEquals(RObject.CLASSNAME_LOGICAL, store.getBaseVectorRClassName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void length(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ checkLength(data, store);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isNA(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ checkIsNA(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isMissing(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ checkIsMissingNonNum(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ @SuppressWarnings("boxing")
+ public void getLogi(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final Boolean expected= Boolean.valueOf(data.values[i0]);
+ assertEquals(expected, store.getLogi(i0));
+ assertEquals(expected, store.getLogi((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getInt(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final int expected= (data.values[i0]) ? 1 : 0;
+ assertEquals(expected, store.getInt(i0));
+ assertEquals(expected, store.getInt((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getInt, store::getInt);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getNum(final LogiCaseData data) {
+// final RLogicalStore store= createStore(data);
+//
+// for (int i= 0; i < data.length; i++) {
+// final int i0= i;
+// if (data.nas[i0]) {
+// // undefined
+// }
+// else {
+// final double expected= (data.values[i0]) ? 1.0 : 0.0;
+// assertEquals(expected, store.getNum(i0));
+// assertEquals(expected, store.getNum((long)i0));
+// }
+// }
+// assertIndexOutOfBounds(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getChar(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final String expected= (data.values[i0]) ? "TRUE" : "FALSE";
+ assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getChar, store::getChar);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getRaw(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final byte expected= (data.values[i0]) ? (byte)1 : (byte)0;
+ assertEquals(expected, store.getRaw(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getRaw((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getRaw, store::getRaw);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void get(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i0), storeDiffersAt(i0));
+ }
+ else {
+ final Boolean expected= Boolean.valueOf(data.values[i0]);
+ assertEquals(expected, store.get(i0));
+ assertEquals(expected, store.get((long)i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::get, store::get);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void toArray(final LogiCaseData data) {
+ final RLogicalStore store= createStore(data);
+
+ final @Nullable Boolean[] array= store.toArray();
+
+ assertEquals(data.values.length, array.length);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(array[i0], arrayDiffersAt(i0));
+ }
+ else {
+ final Boolean expected= Boolean.valueOf(data.values[i0]);
+ assertEquals(expected, array[i0], arrayDiffersAt(i0));
+ }
+ }
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreSerTest.java
new file mode 100644
index 0000000..7e42312
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RNumericStore;
+
+
+@NonNullByDefault
+public class RNumericB32StoreSerTest extends RNumericB32StoreTest {
+
+
+ public RNumericB32StoreSerTest() {
+ }
+
+
+ @Override
+ protected RNumericStore createStore(final NumCaseData data) {
+ return createSerStore((RNumericB32Store)super.createStore(data),
+ RNumericB32Store::new );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreTest.java
new file mode 100644
index 0000000..de3bfda
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericB32StoreTest.java
@@ -0,0 +1,39 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RNumericStore;
+
+
+@NonNullByDefault
+public class RNumericB32StoreTest extends RNumericStoreTest {
+
+
+ public RNumericB32StoreTest() {
+ }
+
+
+ @Override
+ protected RNumericStore createStore(final NumCaseData data) {
+ return new RNumericB32Store(
+ Arrays.copyOf(data.values, data.length),
+ Arrays.copyOf(data.nas, data.length) );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericBFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericBFix64StoreTest.java
new file mode 100644
index 0000000..6bb64b7
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericBFix64StoreTest.java
@@ -0,0 +1,49 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RNumericBFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RNumericStore;
+
+
+@NonNullByDefault
+public class RNumericBFix64StoreTest extends RNumericStoreTest {
+
+
+ public RNumericBFix64StoreTest() {
+ }
+
+
+ @Override
+ protected RNumericStore createStore(final NumCaseData data) {
+ final int nSegments= getSegmentCount(data, SEGMENT_LENGTH);
+ final var values= new double [nSegments] @NonNull[];
+ final var nas= new boolean [nSegments] @NonNull[];
+ for (int i= 0, start= 0; i < values.length; i++) {
+ final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+ values[i]= Arrays.copyOfRange(data.values, start, end);
+ nas[i]= Arrays.copyOfRange(data.nas, start, end);
+ start= end;
+ }
+ return new RNumericBFix64Store(values, nas);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericStoreTest.java
new file mode 100644
index 0000000..f07ed2e
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RNumericStoreTest.java
@@ -0,0 +1,344 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
+import org.eclipse.statet.rj.data.RIntegerStore;
+import org.eclipse.statet.rj.data.RNumericStore;
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RNumericStoreTest extends AbstractRStoreTest {
+
+
+ static class NumCaseData extends CaseData {
+
+ final double[] values;
+
+
+ public NumCaseData(final String label, final double[] values, final boolean[] nas) {
+ super(label, nas);
+ assert (values.length == this.length);
+ assert (nas.length == this.length);
+ this.values= values;
+ }
+
+ public NumCaseData(final String label, final double[] values) {
+ super(label, values.length);
+ assert (values.length == this.length);
+ this.values= values;
+ }
+
+ }
+
+ protected static final List<NumCaseData> DEFAULT_DATA_SOURCES;
+ static {
+ final var datas= new ArrayList<NumCaseData>();
+
+ datas.add(new NumCaseData("empty", new double[0]));
+
+ datas.add(new NumCaseData("single-0", new double[] { 0 }));
+ datas.add(new NumCaseData("single-1", new double[] { 1 }));
+ datas.add(new NumCaseData("single-Min", new double[] { Double.MIN_VALUE }));
+ datas.add(new NumCaseData("single-Max", new double[] { Double.MAX_VALUE }));
+ datas.add(new NumCaseData("single-NA", new double[] { 0 }, new boolean[] { true }));
+
+ { final double[] values= new double[0x1FF];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= i - 0xFF;
+ }
+ datas.add(new NumCaseData("seq", values));
+ }
+ { final double[] values= new double[0xFF];
+ final boolean[] nas= new boolean[values.length];
+ int i= 0;
+ values[i++]= 0;
+ values[i++]= -0;
+ values[i++]= +1;
+ values[i++]= -1;
+ values[i++]= Double.MIN_NORMAL;
+ values[i++]= Double.MIN_VALUE;
+ values[i++]= Double.MAX_VALUE;
+ values[i++]= Double.POSITIVE_INFINITY;
+ values[i++]= -Double.NEGATIVE_INFINITY;
+ values[i++]= Double.NaN;
+ nas[i++]= true;
+ datas.add(new NumCaseData("special", values, nas));
+ }
+
+ { final Random rand= new Random(16857);
+ final double[] values= new double[100000];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= rand.nextDouble();
+ }
+ datas.add(new NumCaseData("rand100000", values));
+ }
+ if (isBigDataEnabled(8)) {
+ final Random rand= new Random(46);
+ final double[] values= new double[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= rand.nextDouble();
+ }
+ datas.add(new NumCaseData("randMultiSeg", values));
+ }
+
+ DEFAULT_DATA_SOURCES= datas;
+ }
+
+
+ public RNumericStoreTest() {
+ }
+
+
+ public static List<NumCaseData> provideCaseDatas() {
+ return new ArrayList<>(DEFAULT_DATA_SOURCES);
+ }
+
+ protected abstract RNumericStore createStore(final NumCaseData data);
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getStoreType(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ assertEquals(RStore.NUMERIC, store.getStoreType());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getBaseVectorRClassName(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ assertEquals(RObject.CLASSNAME_NUMERIC, store.getBaseVectorRClassName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void length(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ checkLength(data, store);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isNA(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ checkIsNA(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isMissing(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]
+ || Double.isNaN(data.values[i0])) {
+ assertTrue(store.isMissing(i0), storeDiffersAt(i0));
+ assertTrue(store.isMissing((long)i0), storeDiffersAt(i0));
+ }
+ else {
+ assertFalse(store.isMissing(i0), storeDiffersAt(i0));
+ assertFalse(store.isMissing((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ @SuppressWarnings("boxing")
+ public void getLogi(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ try {
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final Boolean expected= Boolean.valueOf(data.values[i0] != 0);
+ assertEquals(expected, store.getLogi(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getLogi((long)i0), storeDiffersAt(i0));
+ }
+ }
+ catch (final NumberFormatException e) {
+ fail(storeDiffersAt(i0).get(), e);
+ }
+ }
+ assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getInt(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ try {
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else if (data.values[i0] >= RIntegerStore.MIN_INT && data.values[i0] <= RIntegerStore.MAX_INT) {
+ final int expected= (int)data.values[i0];
+ assertEquals(expected, store.getInt(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getInt((long)i0), storeDiffersAt(i0));
+ }
+ else {
+ // ?
+ }
+ }
+ catch (final NumberFormatException e) {
+ fail(storeDiffersAt(i0).get(), e);
+ }
+ }
+ assertIndexOutOfBounds(data, store::getInt, store::getInt);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getNum(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final double expected= data.values[i0];
+ assertEquals(expected, store.getNum(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getNum((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getCplx(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final double expectedRe= data.values[i0];
+ assertEquals(expectedRe, store.getCplxRe(i0), storeDiffersAt(i0));
+ assertEquals(expectedRe, store.getCplxRe((long)i0), storeDiffersAt(i0));
+ assertEquals(0, store.getCplxIm(i0), storeDiffersAt(i0));
+ assertEquals(0, store.getCplxIm((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getChar(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ // undefined
+ }
+ else {
+ final String expected= Double.toString(data.values[i0]).replace("Infinity", "Inf");
+ assertEquals(expected, store.getChar(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.getChar((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::getChar, store::getChar);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getRaw(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ assertUnsupported(data, store::getRaw, store::getRaw);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void get(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(store.get(i0), storeDiffersAt(i0));
+ }
+ else {
+ final Double expected= Double.valueOf(data.values[i0]);
+ assertEquals(expected, store.get(i0), storeDiffersAt(i0));
+ assertEquals(expected, store.get((long)i0), storeDiffersAt(i0));
+ }
+ }
+ assertIndexOutOfBounds(data, store::get, store::get);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void toArray(final NumCaseData data) {
+ final RNumericStore store= createStore(data);
+
+ final @Nullable Double[] array= store.toArray();
+
+ assertEquals(data.values.length, array.length);
+
+ for (int i= 0; i < data.length; i++) {
+ final int i0= i;
+ if (data.nas[i0]) {
+ assertNull(array[i0], arrayDiffersAt(i0));
+ }
+ else {
+ final Double expected= Double.valueOf(data.values[i0]);
+ assertEquals(expected, array[i0], arrayDiffersAt(i0));
+ }
+ }
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreSerTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreSerTest.java
new file mode 100644
index 0000000..67c0de6
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreSerTest.java
@@ -0,0 +1,36 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RRawStore;
+
+
+@NonNullByDefault
+public class RRaw32StoreSerTest extends RRaw32StoreTest {
+
+
+ public RRaw32StoreSerTest() {
+ }
+
+
+ @Override
+ protected RRawStore createStore(final RawCaseData data) {
+ return createSerStore((RRaw32Store)super.createStore(data),
+ RRaw32Store::new );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreTest.java
new file mode 100644
index 0000000..012d3fd
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRaw32StoreTest.java
@@ -0,0 +1,38 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RRawStore;
+
+
+@NonNullByDefault
+public class RRaw32StoreTest extends RRawStoreTest {
+
+
+ public RRaw32StoreTest() {
+ }
+
+
+ @Override
+ protected RRawStore createStore(final RawCaseData data) {
+ return new RRaw32Store(
+ Arrays.copyOf(data.values, data.length) );
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawFix64StoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawFix64StoreTest.java
new file mode 100644
index 0000000..8c9090f
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawFix64StoreTest.java
@@ -0,0 +1,47 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.eclipse.statet.rj.data.impl.RRawFix64Store.SEGMENT_LENGTH;
+
+import java.util.Arrays;
+
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RRawStore;
+
+
+@NonNullByDefault
+public class RRawFix64StoreTest extends RRawStoreTest {
+
+
+ public RRawFix64StoreTest() {
+ }
+
+
+ @Override
+ protected RRawStore createStore(final RawCaseData data) {
+ final int segments= getSegmentCount(data, SEGMENT_LENGTH);
+ final var values= new byte [segments] @NonNull[];
+ for (int i= 0, start= 0; i < values.length; i++) {
+ final int end= Math.min(start + SEGMENT_LENGTH, data.length);
+ values[i]= Arrays.copyOfRange(data.values, start, end);
+ start= end;
+ }
+ return new RRawFix64Store(values);
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawStoreTest.java b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawStoreTest.java
new file mode 100644
index 0000000..b4ce383
--- /dev/null
+++ b/core/org.eclipse.statet.rj.data-tests/src/org/eclipse/statet/rj/data/impl/RRawStoreTest.java
@@ -0,0 +1,241 @@
+/*=============================================================================#
+ # Copyright (c) 2020 Stephan Wahlbrink and others.
+ #
+ # This program and the accompanying materials are made available under the
+ # terms of the Eclipse Public License 2.0 which is available at
+ # https://www.eclipse.org/legal/epl-2.0, or the Apache License, Version 2.0
+ # which is available at https://www.apache.org/licenses/LICENSE-2.0.
+ #
+ # SPDX-License-Identifier: EPL-2.0 OR Apache-2.0
+ #
+ # Contributors:
+ # Stephan Wahlbrink <sw@wahlbrink.eu> - initial API and implementation
+ #=============================================================================*/
+
+package org.eclipse.statet.rj.data.impl;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import static org.eclipse.statet.rj.data.impl.AbstractRStore.DEFAULT_LONG_DATA_SEGMENT_LENGTH;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
+import org.eclipse.statet.rj.data.RObject;
+import org.eclipse.statet.rj.data.RRawStore;
+import org.eclipse.statet.rj.data.RStore;
+
+
+@NonNullByDefault
+public abstract class RRawStoreTest extends AbstractRStoreTest {
+
+
+ static class RawCaseData extends CaseData {
+
+ final byte[] values;
+
+
+ public RawCaseData(final String label, final byte[] values) {
+ super(label, values.length);
+ assert (values.length == this.length);
+ this.values= values;
+ }
+
+ }
+
+ protected static final List<RawCaseData> DEFAULT_DATA_SOURCES;
+ static {
+ final var datas= new ArrayList<RawCaseData>();
+
+ datas.add(new RawCaseData("empty", new byte[0]));
+
+ datas.add(new RawCaseData("single", new byte[] { 33 }));
+ datas.add(new RawCaseData("single-Min", new byte[] { RRawStore.MIN_BYTE }));
+ datas.add(new RawCaseData("single-Max", new byte[] { RRawStore.MAX_BYTE }));
+
+ { final byte[] values= new byte[0x100];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= (byte)(i & 0xFF);
+ }
+ datas.add(new RawCaseData("seq", values));
+ }
+
+ { final Random rand= new Random(16857);
+ final byte[] values= new byte[100000];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= (byte)(rand.nextInt(0xFF + 1) & 0xFF);
+ }
+ datas.add(new RawCaseData("rand100000", values));
+ }
+ if (isBigDataEnabled(1)) {
+ final Random rand= new Random(46);
+ final byte[] values= new byte[DEFAULT_LONG_DATA_SEGMENT_LENGTH * 2 + 13];
+ for (int i= 0; i < values.length; i++) {
+ values[i]= (byte)(rand.nextInt(0xFF + 1) & 0xFF);
+ }
+ datas.add(new RawCaseData("randMultiSeg", values));
+ }
+
+ DEFAULT_DATA_SOURCES= datas;
+ }
+
+
+ public RRawStoreTest() {
+ }
+
+
+ public static List<RawCaseData> provideCaseDatas() {
+ return new ArrayList<>(DEFAULT_DATA_SOURCES);
+ }
+
+ protected abstract RRawStore createStore(final RawCaseData data);
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getStoreType(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ assertEquals(RStore.RAW, store.getStoreType());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getBaseVectorRClassName(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ assertEquals(RObject.CLASSNAME_RAW, store.getBaseVectorRClassName());
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void length(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ checkLength(data, store);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isNA(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ checkIsNA(data, store);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void isMissing(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ assertFalse(store.isMissing(i));
+ }
+ assertIndexOutOfBounds(data, store::isMissing, store::isMissing);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getLogi(final RawCaseData data) {
+// final RRawStore store= createStore(data);
+//
+// for (int i= 0; i < data.length; i++) {
+// final boolean expected= (data.values[i] != 0);
+// assertEquals(expected, store.getLogi(i));
+// assertEquals(expected, store.getLogi((long)i));
+// }
+// assertIndexOutOfBounds(data, store::getLogi, store::getLogi);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getInt(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final int expected= Byte.toUnsignedInt(data.values[i]);
+ assertEquals(expected, store.getInt(i));
+ assertEquals(expected, store.getInt((long)i));
+ }
+ assertIndexOutOfBounds(data, store::getInt, store::getInt);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getNum(final RawCaseData data) {
+// final RRawStore store= createStore(data);
+//
+// for (int i= 0; i < data.length; i++) {
+// final double expected= Byte.toUnsignedInt(data.values[i]);
+// assertEquals(expected, store.getNum(i));
+// assertEquals(expected, store.getNum((long)i));
+// }
+// assertIndexOutOfBounds(data, store::getNum, store::getNum);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getChar(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ String expected= Integer.toHexString(Byte.toUnsignedInt(data.values[i]));
+ if (expected.length() == 1) {
+ expected= "0" + expected;
+ }
+ assertEquals(expected, store.getChar(i));
+ assertEquals(expected, store.getChar((long)i));
+ }
+ assertIndexOutOfBounds(data, store::getChar, store::getChar);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void getRaw(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final byte expected= data.values[i];
+ assertEquals(expected, store.getRaw(i));
+ assertEquals(expected, store.getRaw((long)i));
+ }
+ assertIndexOutOfBounds(data, store::getRaw, store::getRaw);
+ }
+
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void get(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ for (int i= 0; i < data.length; i++) {
+ final byte expected= data.values[i];
+ assertEquals(expected, store.get(i));
+ assertEquals(expected, store.get((long)i));
+ }
+ assertIndexOutOfBounds(data, store::get, store::get);
+ }
+
+ @ParameterizedTest
+ @MethodSource("provideCaseDatas")
+ public void toArray(final RawCaseData data) {
+ final RRawStore store= createStore(data);
+
+ final Byte[] array= store.toArray();
+
+ assertEquals(data.values.length, array.length);
+
+ for (int i= 0; i < data.length; i++) {
+ assertEquals(data.values[i], array[i], arrayDiffersAt(i));
+ }
+ }
+
+}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java
index 453e532..4546f6e 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractComplexStore.java
@@ -29,14 +29,33 @@
protected static final String toChar(final double real, final double imaginary) {
final StringBuilder sb= new StringBuilder();
- sb.append(AbstractNumericStore.toChar(real));
- { final String imStr= AbstractNumericStore.toChar(imaginary);
- if (imStr.charAt(0) != '-') {
- sb.append('+');
- }
- sb.append(imStr);
+ if (real == Double.POSITIVE_INFINITY) {
+ sb.append("Inf");
}
- sb.append('i');
+ else if (real == Double.NEGATIVE_INFINITY) {
+ sb.append("-Inf");
+ }
+ else {
+ sb.append(real);
+ }
+ if (imaginary == Double.POSITIVE_INFINITY) {
+ sb.append("+Infi");
+ }
+ else if (imaginary == Double.NEGATIVE_INFINITY) {
+ sb.append("-Infi");
+ }
+ else if (Double.isNaN(imaginary)) {
+ sb.append("+NaNi");
+ }
+ else if (imaginary >= 0) {
+ sb.append('+');
+ sb.append(imaginary);
+ sb.append('i');
+ }
+ else {
+ sb.append(imaginary);
+ sb.append('i');
+ }
return sb.toString();
}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java
index e6c056e..f8c65dd 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/AbstractRStore.java
@@ -16,10 +16,14 @@
import java.util.Arrays;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
import org.eclipse.statet.rj.data.RDataUtils;
import org.eclipse.statet.rj.data.RStore;
+@NonNullByDefault
public abstract class AbstractRStore<P> implements RStore<P> {
@@ -42,13 +46,13 @@
protected static final int WITH_NAMES= 0x1;
protected static final byte[] EMPTY_BYTE_ARRAY= new byte[0];
- protected static final byte[][] EMPTY_BYTE_2dARRAY= new byte[0][];
+ protected static final byte [] @NonNull[] EMPTY_BYTE_2dARRAY= new byte[0][];
protected static final int[] EMPTY_INT_ARRAY= new int[0];
- protected static final int[][] EMPTY_INT_2dARRAY= new int[0][];
+ protected static final int [] @NonNull[] EMPTY_INT_2dARRAY= new int[0][];
protected static final double[] EMPTY_DOUBLE_ARRAY= new double[0];
- protected static final double[][] EMPTY_DOUBLE_2dARRAY= new double[0][];
+ protected static final double [] @NonNull[] EMPTY_DOUBLE_2dARRAY= new double[0][];
protected static final String[] EMPTY_STRING_ARRAY= new String[0];
- protected static final String[][] EMPTY_STRING_2dARRAY= new String[0][];
+ protected static final String [] @NonNull[] EMPTY_STRING_2dARRAY= new String[0][];
protected static final int DEFAULT_LONG_DATA_SEGMENT_LENGTH= 1 << 28;
@@ -81,7 +85,25 @@
}
- protected static final long check2dArrayLength(final int[][] array, final int segmentLength) {
+ protected static final long check2dArrayLength(final boolean [] @NonNull[] array, final int segmentLength) {
+ long length= 0;
+ if (array.length > 0) {
+ final int last= array.length - 1;
+ for (int i= 0; i < last; i++) {
+ if (array[i].length != segmentLength) {
+ throw new IllegalArgumentException("Unexpected data segment length (" + array[i].length + ", but " + segmentLength + " expected)");
+ }
+ }
+ length= last * (long)segmentLength;
+ if (array[last].length > segmentLength) {
+ throw new IllegalArgumentException("Unexpected data segment length (" + array[last].length + ", but max " + segmentLength + " expected)");
+ }
+ length+= array[last].length;
+ }
+ return length;
+ }
+
+ protected static final long check2dArrayLength(final int [] @NonNull[] array, final int segmentLength) {
long length= 0;
if (array.length > 0) {
final int last= array.length - 1;
@@ -99,7 +121,7 @@
return length;
}
- protected static final long check2dArrayLength(final double[][] array, final int segmentLength) {
+ protected static final long check2dArrayLength(final double[] @NonNull[] array, final int segmentLength) {
long length= 0;
if (array.length > 0) {
final int last= array.length - 1;
@@ -117,7 +139,7 @@
return length;
}
- protected static final long check2dArrayLength(final byte[][] array, final int segmentLength) {
+ protected static final long check2dArrayLength(final byte [] @NonNull[] array, final int segmentLength) {
long length= 0;
if (array.length > 0) {
final int last= array.length - 1;
@@ -135,7 +157,7 @@
return length;
}
- protected static final long check2dArrayLength(final Object[][] array, final int segmentLength) {
+ protected static final long check2dArrayLength(final Object [] @NonNull[] array, final int segmentLength) {
long length= 0;
if (array.length > 0) {
final int last= array.length - 1;
@@ -153,11 +175,11 @@
return length;
}
- protected static final int[][] new2dIntArray(final long length, final int segmentLength) {
+ protected static final int [] @NonNull[] new2dIntArray(final long length, final int segmentLength) {
if (length == 0) {
return EMPTY_INT_2dARRAY;
}
- final int[][] array= new int[1 + (int) ((length - 1) / segmentLength)][];
+ final var array= new int[1 + (int) ((length - 1) / segmentLength)] @NonNull[];
final int last= array.length - 1;
for (int i= 0; i < last; i++) {
array[i]= new int[segmentLength];
@@ -168,11 +190,11 @@
return array;
}
- protected static final double[][] new2dDoubleArray(final long length, final int segmentLength) {
+ protected static final double [] @NonNull[] new2dDoubleArray(final long length, final int segmentLength) {
if (length == 0) {
return EMPTY_DOUBLE_2dARRAY;
}
- final double[][] array= new double[1 + (int) ((length - 1) / segmentLength)][];
+ final var array= new double [1 + (int) ((length - 1) / segmentLength)] @NonNull[];
final int last= array.length - 1;
for (int i= 0; i < last; i++) {
array[i]= new double[segmentLength];
@@ -183,11 +205,11 @@
return array;
}
- protected static final String[][] new2dStringArray(final long length, final int segmentLength) {
+ protected static final String [] @NonNull[] new2dStringArray(final long length, final int segmentLength) {
if (length == 0) {
return EMPTY_STRING_2dARRAY;
}
- final String[][] array= new String[1 + (int) ((length - 1) / segmentLength)][];
+ final var array= new String [1 + (int) ((length - 1) / segmentLength)] @NonNull[];
final int last= array.length - 1;
for (int i= 0; i < last; i++) {
array[i]= new String[segmentLength];
@@ -198,11 +220,11 @@
return array;
}
- protected static final byte[][] new2dByteArray(final long length, final int segmentLength) {
+ protected static final byte [] @NonNull[] new2dByteArray(final long length, final int segmentLength) {
if (length == 0) {
return EMPTY_BYTE_2dARRAY;
}
- final byte[][] array= new byte[1 + (int) ((length - 1) / segmentLength)][];
+ final var array= new byte [1 + (int) ((length - 1) / segmentLength)] @NonNull[];
final int last= array.length - 1;
for (int i= 0; i < last; i++) {
array[i]= new byte[segmentLength];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java
index 71f7411..85a0596 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/DefaultRObjectFactory.java
@@ -463,7 +463,7 @@
@Override
public RComplexStore createCplxData(final double [] reValues, final double [] imValues) {
- return new RComplexB32Store(reValues, imValues, null);
+ return new RComplexB32Store(reValues, imValues, (int[])null);
}
public RComplexStore createCplxData(final long length) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java
index e1fdcc4..f899dba 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacter32Store.java
@@ -20,19 +20,23 @@
import java.io.ObjectOutput;
import java.util.Arrays;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
/**
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RCharacter32Store extends AbstractCharacterStore
implements RDataResizeExtension<String>, ExternalizableRStore, Externalizable {
private int length;
- protected String[] charValues;
+ protected @Nullable String [] charValues;
public RCharacter32Store() {
@@ -42,23 +46,23 @@
public RCharacter32Store(final int length) {
this.length= length;
- this.charValues= new String[length];
+ this.charValues= new @Nullable String [length];
Arrays.fill(this.charValues, "");
}
- public RCharacter32Store(final String[] values) {
+ public RCharacter32Store(final @Nullable String [] values) {
this.length= values.length;
this.charValues= values;
}
- public RCharacter32Store(final String[] values, final int length) {
+ public RCharacter32Store(final @Nullable String [] values, final int length) {
this.length= length;
this.charValues= values;
}
RCharacter32Store(final RCharacter32Store source, final boolean reuse) {
- String[] values;
+ @Nullable String [] values;
if (reuse) {
values= source.charValues;
}
@@ -73,7 +77,7 @@
public RCharacter32Store(final RJIO io, final int length) throws IOException {
this.length= length;
- this.charValues= new String[length];
+ this.charValues= new @Nullable String [length];
io.readStringData(this.charValues, length);
}
@@ -85,7 +89,7 @@
@Override
public void readExternal(final ObjectInput in) throws IOException {
this.length= in.readInt();
- this.charValues= new String[this.length];
+ this.charValues= new @Nullable String [this.length];
for (int i= 0; i < this.length; i++) {
final int l= in.readInt();
if (l >= 0) {
@@ -131,6 +135,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
return (this.charValues[idx] == null);
@@ -138,7 +143,7 @@
@Override
public boolean isNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.charValues[(int) idx] == null);
@@ -154,7 +159,7 @@
@Override
public void setNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
// if (this.charValues[(int) idx] == null) {
@@ -170,20 +175,23 @@
@Override
public boolean isMissing(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.charValues[(int) idx] == null);
}
+
@Override
+ @SuppressWarnings("null")
public String getChar(final int idx) {
return this.charValues[idx];
}
@Override
+ @SuppressWarnings("null")
public String getChar(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.charValues[(int) idx];
@@ -197,7 +205,7 @@
@Override
public void setChar(final long idx, final String value) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
// assert (value != null);
@@ -247,24 +255,24 @@
@Override
- public String get(final int idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable String get(final int idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.charValues[idx];
}
@Override
- public String get(final long idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable String get(final long idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.charValues[(int) idx];
}
@Override
- public String[] toArray() {
- final String[] array= new String[length()];
+ public @Nullable String [] toArray() {
+ final var array= new @Nullable String [this.length];
System.arraycopy(this.charValues, 0, array, 0, array.length);
return array;
}
@@ -278,7 +286,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final String[] chars= this.charValues;
for (int i= (int) fromIdx; i < l; i++) {
if (chars[i] == null) {
@@ -292,7 +300,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final String[] chars= this.charValues;
for (int i= fromIdx; i < l; i++) {
if (chars[i] == null) {
@@ -311,7 +319,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final String[] chars= this.charValues;
for (int i= (int) fromIdx; i < l; i++) {
if (chars[i] != null && chars[i].equals(character)) {
@@ -328,7 +336,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final String[] chars= this.charValues;
while (fromIdx < l) {
if (chars[fromIdx] != null && chars[fromIdx].equals(character)) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java
index 42074c8..3c8e9e8 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RCharacterFix64Store.java
@@ -17,9 +17,14 @@
import java.io.IOException;
import java.util.Arrays;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
+@NonNullByDefault
public class RCharacterFix64Store extends AbstractCharacterStore
implements ExternalizableRStore {
@@ -29,7 +34,7 @@
private final long length;
- protected final String[][] charValues;
+ protected final @Nullable String [] @NonNull[] charValues;
public RCharacterFix64Store(final long length) {
@@ -40,7 +45,7 @@
}
}
- public RCharacterFix64Store(final String[][] values) {
+ public RCharacterFix64Store(final @Nullable String [] @NonNull[] values) {
this.length= check2dArrayLength(values, SEGMENT_LENGTH);
this.charValues= values;
}
@@ -127,7 +132,7 @@
@Override
- public String get(final int idx) {
+ public @Nullable String get(final int idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -135,7 +140,7 @@
}
@Override
- public String get(final long idx) {
+ public @Nullable String get(final long idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -143,9 +148,9 @@
}
@Override
- public String[] toArray() {
+ public @Nullable String [] toArray() {
final int l= checkToArrayLength();
- final String[] array= new String[l];
+ final var array= new @Nullable String[l];
int k= 0;
for (int i= 0; i < this.charValues.length; i++) {
final String[] chars= this.charValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java
index 51b073a..e837016 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexB32Store.java
@@ -19,6 +19,9 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RComplexStore;
import org.eclipse.statet.rj.data.RJIO;
import org.eclipse.statet.rj.data.RStore;
@@ -27,14 +30,15 @@
/**
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RComplexB32Store extends AbstractComplexStore
implements RDataResizeExtension<RComplexStore.Complex>, ExternalizableRStore, Externalizable {
private int length;
- protected double[] realValues;
- protected double[] imaginaryValues;
+ protected double [] realValues;
+ protected double [] imaginaryValues;
public RComplexB32Store() {
@@ -49,13 +53,14 @@
this.imaginaryValues= new double[length];
}
- protected RComplexB32Store(final double[] realValues, final double[] imaginaryValues) {
+ protected RComplexB32Store(final double [] realValues, final double [] imaginaryValues) {
this.length= realValues.length;
this.realValues= realValues;
this.imaginaryValues= imaginaryValues;
}
- public RComplexB32Store(final double[] realValues, final double[] imaginaryValues, final int[] naIdxs) {
+ public RComplexB32Store(final double [] realValues, final double [] imaginaryValues,
+ final int @Nullable[] naIdxs) {
if (realValues.length != imaginaryValues.length) {
throw new IllegalArgumentException();
}
@@ -70,6 +75,27 @@
}
}
+ public RComplexB32Store(final double [] realValues, final double [] imaginaryValues,
+ final boolean @Nullable[] isNAs) {
+ if (imaginaryValues.length != realValues.length) {
+ throw new IllegalArgumentException();
+ }
+ this.length= realValues.length;
+ this.realValues= realValues;
+ this.imaginaryValues= imaginaryValues;
+ if (isNAs != null) {
+ if (isNAs.length != realValues.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ if (isNAs[i]) {
+ this.realValues[i]= NA_numeric_DOUBLE;
+ this.imaginaryValues[i]= NA_numeric_DOUBLE;
+ }
+ }
+ }
+ }
+
public RComplexB32Store(final RJIO io, final int length) throws IOException {
this.length= length;
@@ -119,6 +145,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
final double v= this.realValues[idx];
@@ -128,7 +155,7 @@
@Override
public boolean isNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final double v= this.realValues[(int) idx];
@@ -144,7 +171,7 @@
@Override
public void setNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.realValues[(int) idx]= NA_numeric_DOUBLE;
@@ -160,7 +187,7 @@
@Override
public boolean isNaN(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final double value= this.realValues[(int) idx];
@@ -175,12 +202,13 @@
@Override
public boolean isMissing(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (Double.isNaN(this.realValues[(int) idx]));
}
+
@Override
public double getCplxRe(final int idx) {
return this.realValues[idx];
@@ -188,7 +216,7 @@
@Override
public double getCplxRe(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.realValues[(int) idx];
@@ -201,7 +229,7 @@
@Override
public double getCplxIm(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.imaginaryValues[(int) idx];
@@ -221,7 +249,7 @@
@Override
public void setCplx(final long idx, final double real, final double imaginary) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
if (Double.isNaN(real) || Double.isNaN(imaginary)) {
@@ -248,7 +276,7 @@
@Override
public void setNum(final long idx, final double real) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
if (Double.isNaN(real)) {
@@ -315,8 +343,8 @@
@Override
- public Complex get(final int idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Complex get(final int idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final double v= this.realValues[idx];
@@ -327,8 +355,8 @@
}
@Override
- public Complex get(final long idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Complex get(final long idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final double v= this.realValues[(int) idx];
@@ -339,10 +367,10 @@
}
@Override
- public Complex[] toArray() {
+ public @Nullable Complex [] toArray() {
+ final var array= new @Nullable Complex[this.length];
final double[] reals= this.realValues;
final double[] imgs= this.imaginaryValues;
- final Complex[] array= new Complex[length()];
for (int i= 0; i < array.length; i++) {
final double v= reals[i];
if (!Double.isNaN(v)
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java
index b0de200..9d26707 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RComplexBFix64Store.java
@@ -16,10 +16,15 @@
import java.io.IOException;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
import org.eclipse.statet.rj.data.RStore;
+@NonNullByDefault
public class RComplexBFix64Store extends AbstractComplexStore
implements ExternalizableRStore {
@@ -29,8 +34,8 @@
private final long length;
- protected final double[][] realValues;
- protected final double[][] imaginaryValues;
+ protected final double [] @NonNull[] realValues;
+ protected final double [] @NonNull[] imaginaryValues;
public RComplexBFix64Store(final long length) {
@@ -39,7 +44,7 @@
this.imaginaryValues= new2dDoubleArray(length, SEGMENT_LENGTH);
}
- public RComplexBFix64Store(final double[][] realValues, final double[][] imaginaryValues) {
+ public RComplexBFix64Store(final double [] @NonNull[] realValues, final double [] @NonNull[] imaginaryValues) {
this.length= check2dArrayLength(realValues, SEGMENT_LENGTH);
if (this.length != check2dArrayLength(imaginaryValues, SEGMENT_LENGTH)) {
throw new IllegalArgumentException();
@@ -48,6 +53,31 @@
this.imaginaryValues= imaginaryValues;
}
+ public RComplexBFix64Store(final double [] @NonNull[] realValues, final double [] @NonNull[] imaginaryValues,
+ final boolean @Nullable[] @NonNull[] isNAs) {
+ this.length= check2dArrayLength(realValues, SEGMENT_LENGTH);
+ if (this.length != check2dArrayLength(imaginaryValues, SEGMENT_LENGTH)) {
+ throw new IllegalArgumentException();
+ }
+ this.realValues= realValues;
+ this.imaginaryValues= imaginaryValues;
+ if (isNAs != null) {
+ if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ final boolean[] isNAi= isNAs[i];
+ for (int j= 0; j < isNAi.length; j++) {
+ if (isNAi[j]) {
+ this.realValues[i][j]= NA_numeric_DOUBLE;
+ this.imaginaryValues[i][j]= NA_numeric_DOUBLE;
+ }
+ }
+ }
+
+ }
+ }
+
public RComplexBFix64Store(final RJIO io, final long length) throws IOException {
this.length= length;
@@ -221,7 +251,7 @@
@Override
- public Complex get(final int idx) {
+ public @Nullable Complex get(final int idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -233,7 +263,7 @@
}
@Override
- public Complex get(final long idx) {
+ public @Nullable Complex get(final long idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -245,9 +275,9 @@
}
@Override
- public Complex[] toArray() {
+ public @Nullable Complex [] toArray() {
final int l= checkToArrayLength();
- final Complex[] array= new Complex[l];
+ final var array= new @Nullable Complex [l];
int k= 0;
for (int i= 0; i < this.realValues.length; i++, k++) {
final double[] reals= this.realValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java
index 195c891..0e0b5ac 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RFactorFix64Store.java
@@ -17,11 +17,16 @@
import java.io.IOException;
import java.util.Arrays;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RCharacterStore;
import org.eclipse.statet.rj.data.RJIO;
import org.eclipse.statet.rj.data.RStore;
+@NonNullByDefault
public class RFactorFix64Store extends AbstractFactorStore
implements ExternalizableRStore {
@@ -31,7 +36,7 @@
private final long length;
- protected final int[][] codes;
+ protected final int [] @NonNull[] codes;
protected final RCharacter32Store codeLabels;
@@ -44,7 +49,7 @@
this.codeLabels= new RUniqueCharacter32Store(levelLabels);
}
- public RFactorFix64Store(final int[][] codes, final boolean isOrdered, final String[] levelLabels) {
+ public RFactorFix64Store(final int [] @NonNull[] codes, final boolean isOrdered, final String[] levelLabels) {
this.length= check2dArrayLength(codes, SEGMENT_LENGTH);
this.isOrdered= isOrdered;
this.codes= codes;
@@ -188,7 +193,7 @@
@Override
public RCharacterStore toCharacterData() {
- final String[][] data= new2dStringArray(this.length, SEGMENT_LENGTH);
+ final @Nullable String [] @NonNull[] data= new2dStringArray(this.length, SEGMENT_LENGTH);
for (int i= 0; i < data.length; i++) {
final String[] chars= data[i];
final int[] ints= this.codes[i];
@@ -204,7 +209,7 @@
@Override
- public Integer get(final int idx) {
+ public @Nullable Integer get(final int idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -215,7 +220,7 @@
}
@Override
- public Integer get(final long idx) {
+ public @Nullable Integer get(final long idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -226,9 +231,9 @@
}
@Override
- public Integer[] toArray() {
+ public @Nullable Integer[] toArray() {
final int l= checkToArrayLength();
- final Integer[] array= new Integer[l];
+ final var array= new @Nullable Integer [l];
int k= 0;
for (int i= 0; i < this.codes.length; i++, k++) {
final int[] ints= this.codes[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java
index c36ada1..8fbeb32 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RInteger32Store.java
@@ -19,19 +19,23 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
/**
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RInteger32Store extends AbstractIntegerStore
implements RDataResizeExtension<Integer>, ExternalizableRStore, Externalizable {
private int length;
- protected int[] intValues;
+ protected int [] intValues;
public RInteger32Store() {
@@ -44,17 +48,17 @@
this.length= length;
}
- public RInteger32Store(final int[] values) {
+ public RInteger32Store(final int [] values) {
this.length= values.length;
this.intValues= values;
}
- public RInteger32Store(final int[] values, final int length) {
+ public RInteger32Store(final int [] values, final int length) {
this.length= length;
this.intValues= values;
}
- public RInteger32Store(final int[] values, final int[] naIdxs) {
+ public RInteger32Store(final int [] values, final int @Nullable[] naIdxs) {
this.length= values.length;
this.intValues= values;
if (naIdxs != null) {
@@ -64,6 +68,21 @@
}
}
+ public RInteger32Store(final int [] values, final boolean @Nullable[] isNAs) {
+ this.length= values.length;
+ this.intValues= values;
+ if (isNAs != null) {
+ if (isNAs.length != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ if (isNAs[i]) {
+ this.intValues[i]= NA_integer_INT;
+ }
+ }
+ }
+ }
+
public RInteger32Store(final RJIO io, final int length) throws IOException {
this.length= length;
@@ -115,7 +134,7 @@
@Override
public boolean isNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.intValues[(int) idx] == NA_integer_INT);
@@ -128,7 +147,7 @@
@Override
public void setNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.intValues[(int) idx]= NA_integer_INT;
@@ -141,7 +160,7 @@
@Override
public boolean isMissing(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.intValues[(int) idx] == NA_integer_INT);
@@ -154,7 +173,7 @@
@Override
public int getInt(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.intValues[(int) idx];
@@ -169,7 +188,7 @@
@Override
public void setInt(final long idx, final int value) {
// assert (value != NA_integer_INT);
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.intValues[(int) idx]= value;
@@ -218,8 +237,8 @@
@Override
- public Integer get(final int idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Integer get(final int idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final int v= this.intValues[idx];
@@ -228,8 +247,8 @@
}
@Override
- public Integer get(final long idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Integer get(final long idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final int v= this.intValues[(int) idx];
@@ -238,8 +257,8 @@
}
@Override
- public Integer[] toArray() {
- final Integer[] array= new Integer[length()];
+ public @Nullable Integer [] toArray() {
+ final var array= new @Nullable Integer [this.length];
final int[] ints= this.intValues;
for (int i= 0; i < array.length; i++) {
final int v= ints[i];
@@ -259,7 +278,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final int[] ints= this.intValues;
for (int i= (int) fromIdx; i < l; i++) {
if (ints[i] == NA_integer_INT) {
@@ -278,7 +297,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final int[] ints= this.intValues;
for (int i= (int) fromIdx; i < l; i++) {
if (ints[i] == integer) {
@@ -291,14 +310,14 @@
public void appendTo(final StringBuilder sb) {
sb.append('[');
- final int l= length();
+ final int l= this.length;
if (l > 0) {
final int[] ints= this.intValues;
for (int i= 0; i < l; i++) {
sb.append(ints[i]);
sb.append(", ");
}
- sb.delete(sb.length()-2, sb.length());
+ sb.delete(sb.length() - 2, sb.length());
}
sb.append(']');
}
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java
index 3ed3a7e..dec2b02 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RIntegerFix64Store.java
@@ -16,9 +16,14 @@
import java.io.IOException;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
+@NonNullByDefault
public class RIntegerFix64Store extends AbstractIntegerStore
implements ExternalizableRStore {
@@ -28,7 +33,7 @@
private final long length;
- protected final int[][] intValues;
+ protected final int [] @NonNull[] intValues;
public RIntegerFix64Store(final long length) {
@@ -36,11 +41,30 @@
this.intValues= new2dIntArray(length, SEGMENT_LENGTH);
}
- public RIntegerFix64Store(final int[][] values) {
+ public RIntegerFix64Store(final int [] @NonNull[] values) {
this.length= check2dArrayLength(values, SEGMENT_LENGTH);
this.intValues= values;
}
+ public RIntegerFix64Store(final int [] @NonNull[] values,
+ final boolean @Nullable[] @NonNull[] isNAs) {
+ this.length= check2dArrayLength(values, SEGMENT_LENGTH);
+ this.intValues= values;
+ if (isNAs != null) {
+ if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ final boolean[] isNAi= isNAs[i];
+ for (int j= 0; j < isNAi.length; j++) {
+ if (isNAi[j]) {
+ this.intValues[i][j]= NA_integer_INT;
+ }
+ }
+ }
+ }
+ }
+
public RIntegerFix64Store(final RJIO io, final long length) throws IOException {
this.length= length;
@@ -69,6 +93,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
return (this.intValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH] == NA_integer_INT);
@@ -101,6 +126,7 @@
return (this.intValues[(int) (idx / SEGMENT_LENGTH)][(int) (idx % SEGMENT_LENGTH)] == NA_integer_INT);
}
+
@Override
public int getInt(final int idx) {
return this.intValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
@@ -127,7 +153,7 @@
@Override
- public Integer get(final int idx) {
+ public @Nullable Integer get(final int idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -138,7 +164,7 @@
}
@Override
- public Integer get(final long idx) {
+ public @Nullable Integer get(final long idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -149,9 +175,9 @@
}
@Override
- public Integer[] toArray() {
+ public @Nullable Integer [] toArray() {
final int l= checkToArrayLength();
- final Integer[] array= new Integer[l];
+ final var array= new @Nullable Integer [l];
int k= 0;
for (int i= 0; i < this.intValues.length; i++, k++) {
final int[] ints= this.intValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java
index 665e0f3..3ee1564 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByte32Store.java
@@ -19,6 +19,9 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
@@ -27,6 +30,7 @@
*
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RLogicalByte32Store extends AbstractLogicalStore
implements RDataResizeExtension<Boolean>, ExternalizableRStore, Externalizable {
@@ -37,7 +41,7 @@
private int length;
- private byte[] boolValues;
+ private byte [] boolValues;
public RLogicalByte32Store() {
@@ -50,18 +54,18 @@
this.boolValues= new byte[length];
}
- public RLogicalByte32Store(final boolean[] values) {
+ public RLogicalByte32Store(final boolean [] values) {
this.length= values.length;
this.boolValues= new byte[values.length];
- for (int i= values.length-1; i >= 0; i--) {
+ for (int i= values.length - 1; i >= 0; i--) {
this.boolValues[i]= (values[i]) ? TRUE_BYTE : FALSE_BYTE;
}
}
- public RLogicalByte32Store(final boolean[] values, final int[] naIdxs) {
+ public RLogicalByte32Store(final boolean [] values, final int @Nullable[] naIdxs) {
this.length= values.length;
this.boolValues= new byte[values.length];
- for (int i= values.length-1; i >= 0; i--) {
+ for (int i= values.length - 1; i >= 0; i--) {
this.boolValues[i]= (values[i]) ? TRUE_BYTE : FALSE_BYTE;
}
if (naIdxs != null) {
@@ -71,7 +75,25 @@
}
}
- public RLogicalByte32Store(final byte[] values) {
+ public RLogicalByte32Store(final boolean [] values, final boolean @Nullable[] isNAs) {
+ this.length= values.length;
+ this.boolValues= new byte[values.length];
+ for (int i= values.length - 1; i >= 0; i--) {
+ this.boolValues[i]= (values[i]) ? TRUE_BYTE : FALSE_BYTE;
+ }
+ if (isNAs != null) {
+ if (isNAs.length != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ if (isNAs[i]) {
+ this.boolValues[i]= NA_logical_BYTE;
+ }
+ }
+ }
+ }
+
+ public RLogicalByte32Store(final byte [] values) {
this.length= values.length;
this.boolValues= values;
}
@@ -142,7 +164,7 @@
@Override
public boolean isNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] == NA_logical_BYTE);
@@ -155,7 +177,7 @@
@Override
public boolean isMissing(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] == NA_logical_BYTE);
@@ -168,7 +190,7 @@
@Override
public void setNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.boolValues[(int) idx]= NA_logical_BYTE;
@@ -181,7 +203,7 @@
@Override
public boolean getLogi(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] == TRUE_BYTE);
@@ -194,7 +216,7 @@
@Override
public void setLogi(final long idx, final boolean value) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.boolValues[(int) idx]= (value) ? TRUE_BYTE : FALSE_BYTE;
@@ -208,7 +230,7 @@
public void insertLogi(final int idx, final boolean value) {
prepareInsert(new int[] { idx });
- this.boolValues[idx]= value ? TRUE_BYTE : FALSE_BYTE;
+ this.boolValues[idx]= (value) ? TRUE_BYTE : FALSE_BYTE;
}
@Override
@@ -242,8 +264,8 @@
@Override
- public Boolean get(final int idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Boolean get(final int idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
switch(this.boolValues[idx]) {
@@ -257,8 +279,8 @@
}
@Override
- public Boolean get(final long idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Boolean get(final long idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
switch(this.boolValues[(int) idx]) {
@@ -272,8 +294,8 @@
}
@Override
- public Boolean[] toArray() {
- final Boolean[] array= new Boolean[length()];
+ public @Nullable Boolean [] toArray() {
+ final var array= new @Nullable Boolean [this.length];
final byte[] bools= this.boolValues;
for (int i= 0; i < array.length; i++) {
switch(bools[i]) {
@@ -318,7 +340,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final byte[] bools= this.boolValues;
if (integer != 0) {
for (int i= (int) fromIdx; i < l; i++) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java
index 1287642..8eb95c5 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalByteFix64Store.java
@@ -16,6 +16,10 @@
import java.io.IOException;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
@@ -24,6 +28,7 @@
*
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RLogicalByteFix64Store extends AbstractLogicalStore
implements ExternalizableRStore {
@@ -36,7 +41,7 @@
private final long length;
- private final byte[][] boolValues;
+ private final byte [] @NonNull[] boolValues;
public RLogicalByteFix64Store(final long length) {
@@ -44,11 +49,37 @@
this.boolValues= new2dByteArray(length, SEGMENT_LENGTH);
}
- public RLogicalByteFix64Store(final byte[][] values) {
+ public RLogicalByteFix64Store(final byte [] @NonNull[] values) {
this.length= check2dArrayLength(values, SEGMENT_LENGTH);
this.boolValues= values;
}
+ public RLogicalByteFix64Store(final boolean [] @NonNull[] values,
+ final boolean @Nullable[] @NonNull[] isNAs) {
+ this.length= check2dArrayLength(values, SEGMENT_LENGTH);
+ this.boolValues= new2dByteArray(this.length, SEGMENT_LENGTH);
+ for (int i= 0; i < values.length; i++) {
+ final boolean[] sourceValues= values[i];
+ final byte[] destValues= this.boolValues[i];
+ for (int j= 0; j < sourceValues.length; j++) {
+ destValues[j]= (sourceValues[j]) ? TRUE_BYTE : FALSE_BYTE;
+ }
+ }
+ if (isNAs != null) {
+ if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ final boolean[] isNAi= isNAs[i];
+ for (int j= 0; j < isNAi.length; j++) {
+ if (isNAi[j]) {
+ this.boolValues[i][j]= NA_logical_BYTE;
+ }
+ }
+ }
+ }
+ }
+
public RLogicalByteFix64Store(final RJIO io, final long length) throws IOException {
this.length= length;
@@ -77,6 +108,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
return (this.boolValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH] == NA_logical_BYTE);
@@ -109,6 +141,7 @@
NA_logical_BYTE;
}
+
@Override
public boolean getLogi(final int idx) {
return (this.boolValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH] == TRUE_BYTE);
@@ -133,7 +166,7 @@
@Override
- public Boolean get(final int idx) {
+ public @Nullable Boolean get(final int idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -148,7 +181,7 @@
}
@Override
- public Boolean get(final long idx) {
+ public @Nullable Boolean get(final long idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -163,9 +196,9 @@
}
@Override
- public Boolean[] toArray() {
+ public @Nullable Boolean [] toArray() {
final int l= checkToArrayLength();
- final Boolean[] array= new Boolean[l];
+ final var array= new @Nullable Boolean [l];
int k= 0;
for (int i= 0; i < this.boolValues.length; i++, k++) {
final byte[] bools= this.boolValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java
index e80f917..d566ee4 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RLogicalInt32Store.java
@@ -16,6 +16,9 @@
import java.io.IOException;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
@@ -24,26 +27,27 @@
*
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RLogicalInt32Store extends AbstractLogicalStore
implements RDataResizeExtension<Boolean>, ExternalizableRStore {
private int length;
- protected int[] boolValues;
+ protected int [] boolValues;
public RLogicalInt32Store() {
- this.boolValues= EMPTY_INT_ARRAY;
this.length= 0;
+ this.boolValues= EMPTY_INT_ARRAY;
}
- public RLogicalInt32Store(final boolean[] values, final int[] naIdxs) {
- this.boolValues= new int[values.length];
- for (int i= values.length-1; i >= 0; i--) {
- this.boolValues[i]= values[i] ? TRUE_INT : FALSE_INT;
+ public RLogicalInt32Store(final boolean [] values, final int @Nullable[] naIdxs) {
+ this.length= values.length;
+ this.boolValues= new int[this.length];
+ for (int i= values.length - 1; i >= 0; i--) {
+ this.boolValues[i]= (values[i]) ? TRUE_INT : FALSE_INT;
}
- this.length= this.boolValues.length;
if (naIdxs != null) {
for (int i= 0; i < naIdxs.length; i++) {
this.boolValues[naIdxs[i]]= NA_logical_INT;
@@ -51,6 +55,24 @@
}
}
+ public RLogicalInt32Store(final boolean [] values, final boolean @Nullable[] isNAs) {
+ this.length= values.length;
+ this.boolValues= new int[this.length];
+ for (int i= values.length - 1; i >= 0; i--) {
+ this.boolValues[i]= (values[i]) ? TRUE_INT : FALSE_INT;
+ }
+ if (isNAs != null) {
+ if (isNAs.length != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ if (isNAs[i]) {
+ this.boolValues[i]= NA_logical_INT;
+ }
+ }
+ }
+ }
+
/**
* Create new logical data based on the given Java int array
* encoded as follows:
@@ -115,6 +137,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
return (this.boolValues[idx] == NA_logical_INT);
@@ -122,7 +145,7 @@
@Override
public boolean isNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] == NA_logical_INT);
@@ -135,7 +158,7 @@
@Override
public boolean isMissing(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] == NA_logical_INT);
@@ -148,12 +171,13 @@
@Override
public void setNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.boolValues[(int) idx]= NA_logical_INT;
}
+
@Override
public boolean getLogi(final int idx) {
return (this.boolValues[idx] != FALSE_INT);
@@ -161,7 +185,7 @@
@Override
public boolean getLogi(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] != FALSE_INT);
@@ -169,15 +193,15 @@
@Override
public void setLogi(final int idx, final boolean value) {
- this.boolValues[idx]= value ? TRUE_INT : FALSE_INT;
+ this.boolValues[idx]= (value) ? TRUE_INT : FALSE_INT;
}
@Override
public void setLogi(final long idx, final boolean value) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
- this.boolValues[(int) idx]= value ? TRUE_INT : FALSE_INT;
+ this.boolValues[(int) idx]= (value) ? TRUE_INT : FALSE_INT;
}
@@ -188,7 +212,7 @@
public void insertLogi(final int idx, final boolean value) {
prepareInsert(new int[] { idx });
- this.boolValues[idx]= value ? TRUE_INT : FALSE_INT;
+ this.boolValues[idx]= (value) ? TRUE_INT : FALSE_INT;
}
@Override
@@ -222,8 +246,8 @@
@Override
- public Boolean get(final int idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Boolean get(final int idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[idx] != NA_logical_INT) ?
@@ -231,8 +255,8 @@
}
@Override
- public Boolean get(final long idx) {
- if (idx < 0 || idx >= length()) {
+ public @Nullable Boolean get(final long idx) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (this.boolValues[(int) idx] != NA_logical_INT) ?
@@ -240,8 +264,8 @@
}
@Override
- public Boolean[] toArray() {
- final Boolean[] array= new Boolean[length()];
+ public @Nullable Boolean [] toArray() {
+ final var array= new @Nullable Boolean [this.length];
for (int i= 0; i < array.length; i++) {
if (this.boolValues[i] != NA_logical_INT) {
array[i]= (this.boolValues[i] == TRUE_INT) ? Boolean.TRUE : Boolean.FALSE;
@@ -278,7 +302,7 @@
if (fromIdx < 0) {
fromIdx= 0;
}
- final int l= length();
+ final int l= this.length;
final int[] ints= this.boolValues;
if (integer != 0) {
for (int i= (int) fromIdx; i < l; i++) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java
index 7e4c53c..180ac95 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericB32Store.java
@@ -19,19 +19,23 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
/**
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RNumericB32Store extends AbstractNumericStore
implements RDataResizeExtension<Double>, ExternalizableRStore, Externalizable {
private int length;
- protected double[] realValues;
+ protected double [] realValues;
public RNumericB32Store() {
@@ -44,12 +48,12 @@
this.realValues= new double[length];
}
- public RNumericB32Store(final double[] values) {
+ public RNumericB32Store(final double [] values) {
this.length= values.length;
this.realValues= values;
}
- public RNumericB32Store(final double[] values, final int[] naIdxs) {
+ public RNumericB32Store(final double [] values, final int @Nullable[] naIdxs) {
this.length= values.length;
this.realValues= values;
if (naIdxs != null) {
@@ -59,6 +63,21 @@
}
}
+ public RNumericB32Store(final double [] values, final boolean @Nullable[] isNAs) {
+ this.length= values.length;
+ this.realValues= values;
+ if (isNAs != null) {
+ if (isNAs.length != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ if (isNAs[i]) {
+ this.realValues[i]= NA_numeric_DOUBLE;
+ }
+ }
+ }
+ }
+
public RNumericB32Store(final RJIO io, final int length) throws IOException {
this.length= length;
@@ -103,6 +122,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
final double v= this.realValues[idx];
@@ -112,7 +132,7 @@
@Override
public boolean isNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final double v= this.realValues[(int) idx];
@@ -127,7 +147,7 @@
@Override
public void setNA(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.realValues[(int) idx]= NA_numeric_DOUBLE;
@@ -142,7 +162,7 @@
@Override
public boolean isNaN(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
final double v= this.realValues[(int) idx];
@@ -157,12 +177,13 @@
@Override
public boolean isMissing(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return (Double.isNaN(this.realValues[(int) idx]));
}
+
@Override
public double getNum(final int idx) {
return this.realValues[idx];
@@ -170,7 +191,7 @@
@Override
public double getNum(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.realValues[(int) idx];
@@ -183,7 +204,7 @@
@Override
public void setNum(final long idx, final double value) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.realValues[(int) idx]= (Double.isNaN(value)) ? NaN_numeric_DOUBLE : value;
@@ -254,8 +275,8 @@
@Override
- public Double[] toArray() {
- final Double[] array= new Double[length()];
+ public @Nullable Double [] toArray() {
+ final var array= new @Nullable Double [this.length];
final double[] reals= this.realValues;
for (int i= 0; i < array.length; i++) {
final double v= reals[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java
index 5bf89b7..b02410c 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RNumericBFix64Store.java
@@ -16,9 +16,14 @@
import java.io.IOException;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+import org.eclipse.statet.jcommons.lang.Nullable;
+
import org.eclipse.statet.rj.data.RJIO;
+@NonNullByDefault
public class RNumericBFix64Store extends AbstractNumericStore
implements ExternalizableRStore {
@@ -28,7 +33,7 @@
private final long length;
- protected final double[][] realValues;
+ protected final double [] @NonNull[] realValues;
public RNumericBFix64Store(final long length) {
@@ -36,11 +41,30 @@
this.realValues= new2dDoubleArray(length, SEGMENT_LENGTH);
}
- public RNumericBFix64Store(final double[][] values) {
+ public RNumericBFix64Store(final double [] @NonNull[] values) {
this.length= check2dArrayLength(values, SEGMENT_LENGTH);
this.realValues= values;
}
+ public RNumericBFix64Store(final double [] @NonNull[] values,
+ final boolean @Nullable[] @NonNull[] isNAs) {
+ this.length= check2dArrayLength(values, SEGMENT_LENGTH);
+ this.realValues= values;
+ if (isNAs != null) {
+ if (check2dArrayLength(isNAs, SEGMENT_LENGTH) != this.length) {
+ throw new IllegalArgumentException();
+ }
+ for (int i= 0; i < isNAs.length; i++) {
+ final boolean[] isNAi= isNAs[i];
+ for (int j= 0; j < isNAi.length; j++) {
+ if (isNAi[j]) {
+ this.realValues[i][j]= NA_numeric_DOUBLE;
+ }
+ }
+ }
+ }
+ }
+
public RNumericBFix64Store(final RJIO io, final long length) throws IOException {
this.length= length;
@@ -69,6 +93,7 @@
return this.length;
}
+
@Override
public boolean isNA(final int idx) {
final double v= this.realValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
@@ -121,6 +146,7 @@
this.realValues[(int) (idx / SEGMENT_LENGTH)][(int) (idx % SEGMENT_LENGTH)] ));
}
+
@Override
public double getNum(final int idx) {
return this.realValues[idx / SEGMENT_LENGTH][idx % SEGMENT_LENGTH];
@@ -145,7 +171,7 @@
@Override
- public Double get(final int idx) {
+ public @Nullable Double get(final int idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -157,7 +183,7 @@
}
@Override
- public Double get(final long idx) {
+ public @Nullable Double get(final long idx) {
if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
@@ -170,9 +196,9 @@
@Override
- public Double[] toArray() {
+ public @Nullable Double [] toArray() {
final int l= checkToArrayLength();
- final Double[] array= new Double[l];
+ final var array= new @Nullable Double [l];
int k= 0;
for (int i= 0; i < this.realValues.length; i++, k++) {
final double[] reals= this.realValues[i];
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java
index 295859d..46aa9cc 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRaw32Store.java
@@ -19,6 +19,9 @@
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
import org.eclipse.statet.rj.data.RJIO;
import org.eclipse.statet.rj.data.RStore;
@@ -26,13 +29,14 @@
/**
* This implementation is limited to length of 2<sup>31</sup>-1.
*/
+@NonNullByDefault
public class RRaw32Store extends AbstractRawStore
implements RDataResizeExtension<Byte>, ExternalizableRStore, Externalizable {
private int length;
- protected byte[] byteValues;
+ protected byte [] byteValues;
public RRaw32Store() {
@@ -45,7 +49,7 @@
this.length= length;
}
- public RRaw32Store(final byte[] values) {
+ public RRaw32Store(final byte [] values) {
this.byteValues= values;
this.length= this.byteValues.length;
}
@@ -90,6 +94,7 @@
return this.length;
}
+
@Override
public byte getRaw(final int idx) {
return this.byteValues[idx];
@@ -97,7 +102,7 @@
@Override
public byte getRaw(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return this.byteValues[(int) idx];
@@ -110,7 +115,7 @@
@Override
public void setRaw(final long idx, final byte value) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
this.byteValues[(int) idx]= value;
@@ -159,7 +164,7 @@
@Override
public Byte get(final int idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return Byte.valueOf(this.byteValues[idx]);
@@ -167,15 +172,15 @@
@Override
public Byte get(final long idx) {
- if (idx < 0 || idx >= length()) {
+ if (idx < 0 || idx >= this.length) {
throw new IndexOutOfBoundsException(Long.toString(idx));
}
return Byte.valueOf(this.byteValues[(int) idx]);
}
@Override
- public Byte[] toArray() {
- final Byte[] array= new Byte[length()];
+ public @NonNull Byte [] toArray() {
+ final var array= new @NonNull Byte [this.length];
final byte[] raws= this.byteValues;
for (int i= 0; i < array.length; i++) {
array[i]= Byte.valueOf(raws[i]);
@@ -194,7 +199,7 @@
fromIdx= 0;
}
final byte raw= (byte) (integer & 0xff);
- final int l= length();
+ final int l= this.length;
final byte[] raws= this.byteValues;
for (int i= (int) fromIdx; i < l; i++) {
if (raws[i] == raw) {
diff --git a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java
index 462d8cc..d27e597 100644
--- a/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java
+++ b/core/org.eclipse.statet.rj.data/src/org/eclipse/statet/rj/data/impl/RRawFix64Store.java
@@ -16,10 +16,14 @@
import java.io.IOException;
+import org.eclipse.statet.jcommons.lang.NonNull;
+import org.eclipse.statet.jcommons.lang.NonNullByDefault;
+
import org.eclipse.statet.rj.data.RJIO;
import org.eclipse.statet.rj.data.RStore;
+@NonNullByDefault
public class RRawFix64Store extends AbstractRawStore
implements ExternalizableRStore {
@@ -29,7 +33,7 @@
private final long length;
- protected final byte[][] byteValues;
+ protected final byte [] @NonNull[] byteValues;
public RRawFix64Store(final long length) {
@@ -37,7 +41,7 @@
this.byteValues= new2dByteArray(length, SEGMENT_LENGTH);
}
- public RRawFix64Store(final byte[][] values) {
+ public RRawFix64Store(final byte [] @NonNull[] values) {
this.length= check2dArrayLength(values, SEGMENT_LENGTH);
this.byteValues= values;
}
@@ -110,9 +114,9 @@
}
@Override
- public Byte[] toArray() {
+ public @NonNull Byte [] toArray() {
final int l= checkToArrayLength();
- final Byte[] array= new Byte[l];
+ final var array= new @NonNull Byte [l];
int k= 0;
for (int i= 0; i < this.byteValues.length; i++, k++) {
final byte[] raws= this.byteValues[i];
diff --git a/core/pom.xml b/core/pom.xml
index 71591e6..a70c4bd 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -32,6 +32,7 @@
<modules>
<module>org.eclipse.statet.rj.data</module>
+ <module>org.eclipse.statet.rj.data-tests</module>
<module>org.eclipse.statet.rj.server</module>
<module>org.eclipse.statet.rj.server.remotetools</module>
<module>org.eclipse.statet.rj.server.rpkg</module>