Skip to main content

CatalogFacade

Trait CatalogFacade 

Source
pub trait CatalogFacade: Send + Sync {
Show 101 methods // Required methods fn set_metadata( &self, key: &str, value: &str, ) -> Result<(), StorageBackendError>; fn get_metadata( &self, key: &str, ) -> Result<Option<String>, StorageBackendError>; fn migrate_relation_namespace(&self) -> Result<(), StorageBackendError>; fn save_schema_row( &self, schema: &SchemaRow, ) -> Result<(), StorageBackendError>; fn drop_schema(&self, name: &str) -> Result<(), StorageBackendError>; fn load_schema_rows(&self) -> Result<Vec<SchemaRow>, StorageBackendError>; fn save_table( &self, schema: &TableSchema, ) -> Result<(), StorageBackendError>; fn load_tables(&self) -> Result<Vec<TableSchema>, StorageBackendError>; fn drop_table(&self, name: &str) -> Result<(), StorageBackendError>; fn drop_table_and_data(&self, name: &str) -> Result<(), StorageBackendError>; fn purge_table_data(&self, name: &str) -> Result<(), StorageBackendError>; fn rename_table_data( &self, from: &str, to: &str, ) -> Result<(), StorageBackendError>; fn drop_column_data( &self, table_name: &str, column_name: &str, ) -> Result<(), StorageBackendError>; fn rename_column_data( &self, table_name: &str, from: &str, to: &str, ) -> Result<(), StorageBackendError>; fn save_model( &self, name: &str, json: &str, ) -> Result<(), StorageBackendError>; fn load_models(&self) -> Result<Vec<(String, String)>, StorageBackendError>; fn load_model( &self, name: &str, ) -> Result<Option<String>, StorageBackendError>; fn drop_model(&self, name: &str) -> Result<(), StorageBackendError>; fn save_scoring_params( &self, name: &str, params_json: &str, ) -> Result<(), StorageBackendError>; fn load_scoring_params( &self, name: &str, ) -> Result<Option<String>, StorageBackendError>; fn load_all_scoring_params( &self, ) -> Result<Vec<(String, String)>, StorageBackendError>; fn drop_scoring_params(&self, name: &str) -> Result<(), StorageBackendError>; fn create_sequence_row( &self, sequence: &SequenceRow, ) -> Result<bool, StorageBackendError>; fn replace_sequence_row( &self, sequence: &SequenceRow, ) -> Result<bool, StorageBackendError>; fn rename_sequence_row( &self, from: &str, to: &str, ) -> Result<bool, StorageBackendError>; fn drop_sequence_row(&self, name: &str) -> Result<bool, StorageBackendError>; fn load_sequence_rows( &self, ) -> Result<Vec<SequenceRow>, StorageBackendError>; fn reserve_sequence_values( &self, name: &str, object_id: [u8; 16], definition_generation: [u8; 16], ) -> Result<SequenceReservationResult, StorageBackendError>; fn set_sequence_value( &self, name: &str, object_id: [u8; 16], value: i64, called: bool, log_count: i64, ) -> Result<Option<i64>, StorageBackendError>; fn save_view(&self, view: &ViewRow) -> Result<(), StorageBackendError>; fn rename_view( &self, from: &RelationIdentity, to: &RelationIdentity, ) -> Result<bool, StorageBackendError>; fn drop_view( &self, relation: &RelationIdentity, ) -> Result<bool, StorageBackendError>; fn load_views(&self) -> Result<Vec<ViewRow>, StorageBackendError>; fn save_named_graph(&self, name: &str) -> Result<(), StorageBackendError>; fn drop_named_graph(&self, name: &str) -> Result<(), StorageBackendError>; fn load_named_graphs(&self) -> Result<Vec<String>, StorageBackendError>; fn named_graph_exists( &self, name: &str, ) -> Result<bool, StorageBackendError>; fn graph_vertex( &self, id: u64, ) -> Result<Option<GraphVertexRow>, StorageBackendError>; fn graph_edge( &self, id: u64, ) -> Result<Option<EdgeRow>, StorageBackendError>; fn graph_entity_ids( &self, filter: GraphEntityFilter<'_>, after: Option<u64>, limit: usize, ) -> Result<Vec<u64>, StorageBackendError>; fn graph_entity_count( &self, filter: GraphEntityFilter<'_>, ) -> Result<u64, StorageBackendError>; fn graph_entity_max_id( &self, kind: GraphEntityKind, ) -> Result<Option<u64>, StorageBackendError>; fn graph_entity_memberships( &self, kind: GraphEntityKind, id: u64, ) -> Result<Vec<String>, StorageBackendError>; fn graph_has_membership( &self, kind: GraphEntityKind, id: u64, graph: &str, ) -> Result<bool, StorageBackendError>; fn save_vertex( &self, vertex_id: u64, label: &str, properties_json: &str, ) -> Result<(), StorageBackendError>; fn delete_vertex(&self, vertex_id: u64) -> Result<(), StorageBackendError>; fn load_vertices( &self, ) -> Result<Vec<(u64, String, String)>, StorageBackendError>; fn save_edge( &self, edge_id: u64, source_id: u64, target_id: u64, label: &str, properties_json: &str, ) -> Result<(), StorageBackendError>; fn delete_edge(&self, edge_id: u64) -> Result<(), StorageBackendError>; fn load_edges(&self) -> Result<Vec<EdgeRow>, StorageBackendError>; fn save_graph_membership( &self, entity_type: &str, entity_id: u64, graph_name: &str, ) -> Result<(), StorageBackendError>; fn delete_graph_membership( &self, entity_type: &str, entity_id: u64, graph_name: &str, ) -> Result<(), StorageBackendError>; fn delete_graph_membership_for_graph( &self, graph_name: &str, ) -> Result<(), StorageBackendError>; fn load_graph_memberships( &self, ) -> Result<Vec<(String, u64, String)>, StorageBackendError>; fn purge_orphan_graph_entities(&self) -> Result<(), StorageBackendError>; fn replace_named_graph( &self, graph_name: &str, snapshot: &GraphSnapshot, ) -> Result<(), StorageBackendError>; fn drop_named_graph_data( &self, graph_name: &str, ) -> Result<(), StorageBackendError>; fn save_analyzer( &self, name: &str, config_json: &str, ) -> Result<(), StorageBackendError>; fn drop_analyzer(&self, name: &str) -> Result<(), StorageBackendError>; fn load_analyzers( &self, ) -> Result<Vec<(String, String)>, StorageBackendError>; fn save_table_field_analyzer( &self, table_name: &str, field: &str, phase: &str, analyzer_name: &str, ) -> Result<(), StorageBackendError>; fn replace_table_field_analyzer( &self, table_name: &str, field: &str, phase: &str, analyzer_name: &str, ) -> Result<(), StorageBackendError>; fn drop_table_field_analyzer_field( &self, table_name: &str, field: &str, ) -> Result<(), StorageBackendError>; fn drop_table_field_analyzers( &self, table_name: &str, ) -> Result<(), StorageBackendError>; fn load_table_field_analyzers( &self, ) -> Result<Vec<(String, String, String, String)>, StorageBackendError>; fn save_foreign_server( &self, name: &str, fdw_type: &str, options_json: &str, ) -> Result<(), StorageBackendError>; fn drop_foreign_server(&self, name: &str) -> Result<(), StorageBackendError>; fn load_foreign_servers( &self, ) -> Result<Vec<(String, String, String)>, StorageBackendError>; fn save_foreign_table( &self, row: &ForeignTableRow, ) -> Result<(), StorageBackendError>; fn rename_foreign_table( &self, from: &RelationIdentity, to: &RelationIdentity, ) -> Result<bool, StorageBackendError>; fn update_foreign_table_security( &self, relation: &RelationIdentity, role_owner: &str, acl: Option<&[TableAclEntry]>, column_acls: &BTreeMap<String, Vec<TableAclEntry>>, ) -> Result<bool, StorageBackendError>; fn drop_foreign_table( &self, relation: &RelationIdentity, ) -> Result<(), StorageBackendError>; fn load_foreign_tables( &self, ) -> Result<Vec<ForeignTableRow>, StorageBackendError>; fn save_catalog_index_row( &self, index: &CatalogIndexRow, ) -> Result<(), StorageBackendError>; fn drop_catalog_index( &self, relation: &RelationIdentity, ) -> Result<(), StorageBackendError>; fn drop_catalog_indexes_for_table( &self, table_name: &str, ) -> Result<(), StorageBackendError>; fn load_catalog_indexes( &self, ) -> Result<Vec<CatalogIndexRow>, StorageBackendError>; fn save_path_index( &self, graph_name: &str, label_sequences_json: &str, ) -> Result<(), StorageBackendError>; fn drop_path_index( &self, graph_name: &str, ) -> Result<(), StorageBackendError>; fn load_path_indexes( &self, ) -> Result<Vec<(String, String)>, StorageBackendError>; fn clear_path_index_data( &self, index: &str, ) -> Result<(), StorageBackendError>; fn save_path_index_pairs( &self, index: &str, sequence: &str, pairs: &[(u64, u64)], ) -> Result<(), StorageBackendError>; fn finish_path_index_data( &self, index: &str, graph: &str, definition: &str, ) -> Result<(), StorageBackendError>; fn path_index_data_is_current( &self, index: &str, definition: &str, ) -> Result<bool, StorageBackendError>; fn path_index_pairs( &self, index: &str, sequence: &str, after: Option<(u64, u64)>, limit: usize, ) -> Result<Vec<(u64, u64)>, StorageBackendError>; fn save_column_stats( &self, stats: ColumnStatsInput<'_>, ) -> Result<(), StorageBackendError>; fn replace_column_stats( &self, table_name: &str, stats: &[ColumnStatsInput<'_>], ) -> Result<(), StorageBackendError>; fn load_column_stats( &self, table_name: &str, ) -> Result<Vec<ColumnStatsRow>, StorageBackendError>; fn delete_column_stats( &self, table_name: &str, ) -> Result<(), StorageBackendError>; // Provided methods fn initialize_storage(&self) -> Result<(), StorageBackendError> { ... } fn cache_revisions( &self, ) -> Result<Option<CatalogCacheRevisions>, StorageBackendError> { ... } fn fts_storage_was_reset(&self) -> bool { ... } fn save_schema(&self, name: &str) -> Result<(), StorageBackendError> { ... } fn load_schemas(&self) -> Result<Vec<String>, StorageBackendError> { ... } fn next_sequence_value( &self, name: &str, object_id: [u8; 16], ) -> Result<Option<i64>, StorageBackendError> { ... } fn load_named_graph_snapshot( &self, name: &str, ) -> Result<Option<GraphSnapshot>, StorageBackendError> { ... } fn save_analyzer_revision( &self, _name: &str, _config_json: &str, _descriptor_json: &str, ) -> Result<(), StorageBackendError> { ... } fn load_analyzer_descriptors( &self, ) -> Result<Vec<(String, String)>, StorageBackendError> { ... } fn replace_table_field_analyzer_binding( &self, _table: &str, _field: &str, _phase: &str, _name: &str, _binding_json: &str, ) -> Result<(), StorageBackendError> { ... } fn load_table_field_analyzer_bindings( &self, ) -> Result<Vec<(String, String, String)>, StorageBackendError> { ... } fn save_catalog_index( &self, relation: &RelationIdentity, index_type: &str, table_name: &str, columns_json: &str, parameters_json: &str, ) -> Result<(), StorageBackendError> { ... }
}
Expand description

Engine-facing catalog facade for persistent metadata.

Required Methods§

Source

fn set_metadata( &self, key: &str, value: &str, ) -> Result<(), StorageBackendError>

Source

fn get_metadata(&self, key: &str) -> Result<Option<String>, StorageBackendError>

Source

fn migrate_relation_namespace(&self) -> Result<(), StorageBackendError>

Atomically migrate the former flat relation namespace into typed, schema-owned catalog objects. Implementations must reject normalized or cross-kind collisions instead of merging either object.

Source

fn save_schema_row(&self, schema: &SchemaRow) -> Result<(), StorageBackendError>

Source

fn drop_schema(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn load_schema_rows(&self) -> Result<Vec<SchemaRow>, StorageBackendError>

Source

fn save_table(&self, schema: &TableSchema) -> Result<(), StorageBackendError>

Source

fn load_tables(&self) -> Result<Vec<TableSchema>, StorageBackendError>

Source

fn drop_table(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn drop_table_and_data(&self, name: &str) -> Result<(), StorageBackendError>

Remove a table definition and every catalog/data row owned by it as one atomic catalog operation.

Source

fn purge_table_data(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn rename_table_data( &self, from: &str, to: &str, ) -> Result<(), StorageBackendError>

Source

fn drop_column_data( &self, table_name: &str, column_name: &str, ) -> Result<(), StorageBackendError>

Source

fn rename_column_data( &self, table_name: &str, from: &str, to: &str, ) -> Result<(), StorageBackendError>

Source

fn save_model(&self, name: &str, json: &str) -> Result<(), StorageBackendError>

Source

fn load_models(&self) -> Result<Vec<(String, String)>, StorageBackendError>

Source

fn load_model(&self, name: &str) -> Result<Option<String>, StorageBackendError>

Source

fn drop_model(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn save_scoring_params( &self, name: &str, params_json: &str, ) -> Result<(), StorageBackendError>

Source

fn load_scoring_params( &self, name: &str, ) -> Result<Option<String>, StorageBackendError>

Source

fn load_all_scoring_params( &self, ) -> Result<Vec<(String, String)>, StorageBackendError>

Source

fn drop_scoring_params(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn create_sequence_row( &self, sequence: &SequenceRow, ) -> Result<bool, StorageBackendError>

Source

fn replace_sequence_row( &self, sequence: &SequenceRow, ) -> Result<bool, StorageBackendError>

Source

fn rename_sequence_row( &self, from: &str, to: &str, ) -> Result<bool, StorageBackendError>

Atomically move one sequence catalog row and its shared relation claim while preserving object identity and physical value state.

Source

fn drop_sequence_row(&self, name: &str) -> Result<bool, StorageBackendError>

Source

fn load_sequence_rows(&self) -> Result<Vec<SequenceRow>, StorageBackendError>

Source

fn reserve_sequence_values( &self, name: &str, object_id: [u8; 16], definition_generation: [u8; 16], ) -> Result<SequenceReservationResult, StorageBackendError>

Source

fn set_sequence_value( &self, name: &str, object_id: [u8; 16], value: i64, called: bool, log_count: i64, ) -> Result<Option<i64>, StorageBackendError>

Source

fn save_view(&self, view: &ViewRow) -> Result<(), StorageBackendError>

Source

fn rename_view( &self, from: &RelationIdentity, to: &RelationIdentity, ) -> Result<bool, StorageBackendError>

Atomically move one view catalog row and its shared relation claim.

Source

fn drop_view( &self, relation: &RelationIdentity, ) -> Result<bool, StorageBackendError>

Source

fn load_views(&self) -> Result<Vec<ViewRow>, StorageBackendError>

Source

fn save_named_graph(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn drop_named_graph(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn load_named_graphs(&self) -> Result<Vec<String>, StorageBackendError>

Source

fn named_graph_exists(&self, name: &str) -> Result<bool, StorageBackendError>

Source

fn graph_vertex( &self, id: u64, ) -> Result<Option<GraphVertexRow>, StorageBackendError>

Read one entity without loading any other graph payload.

Source

fn graph_edge(&self, id: u64) -> Result<Option<EdgeRow>, StorageBackendError>

Source

fn graph_entity_ids( &self, filter: GraphEntityFilter<'_>, after: Option<u64>, limit: usize, ) -> Result<Vec<u64>, StorageBackendError>

Read a bounded, strictly ascending identity page from the pinned storage snapshot. Filters must be applied before the page limit.

Source

fn graph_entity_count( &self, filter: GraphEntityFilter<'_>, ) -> Result<u64, StorageBackendError>

Source

fn graph_entity_max_id( &self, kind: GraphEntityKind, ) -> Result<Option<u64>, StorageBackendError>

Source

fn graph_entity_memberships( &self, kind: GraphEntityKind, id: u64, ) -> Result<Vec<String>, StorageBackendError>

Source

fn graph_has_membership( &self, kind: GraphEntityKind, id: u64, graph: &str, ) -> Result<bool, StorageBackendError>

Source

fn save_vertex( &self, vertex_id: u64, label: &str, properties_json: &str, ) -> Result<(), StorageBackendError>

Source

fn delete_vertex(&self, vertex_id: u64) -> Result<(), StorageBackendError>

Source

fn load_vertices( &self, ) -> Result<Vec<(u64, String, String)>, StorageBackendError>

Source

fn save_edge( &self, edge_id: u64, source_id: u64, target_id: u64, label: &str, properties_json: &str, ) -> Result<(), StorageBackendError>

Source

fn delete_edge(&self, edge_id: u64) -> Result<(), StorageBackendError>

Source

fn load_edges(&self) -> Result<Vec<EdgeRow>, StorageBackendError>

Source

fn save_graph_membership( &self, entity_type: &str, entity_id: u64, graph_name: &str, ) -> Result<(), StorageBackendError>

Source

fn delete_graph_membership( &self, entity_type: &str, entity_id: u64, graph_name: &str, ) -> Result<(), StorageBackendError>

Source

fn delete_graph_membership_for_graph( &self, graph_name: &str, ) -> Result<(), StorageBackendError>

Source

fn load_graph_memberships( &self, ) -> Result<Vec<(String, u64, String)>, StorageBackendError>

Source

fn purge_orphan_graph_entities(&self) -> Result<(), StorageBackendError>

Source

fn replace_named_graph( &self, graph_name: &str, snapshot: &GraphSnapshot, ) -> Result<(), StorageBackendError>

Source

fn drop_named_graph_data( &self, graph_name: &str, ) -> Result<(), StorageBackendError>

Source

fn save_analyzer( &self, name: &str, config_json: &str, ) -> Result<(), StorageBackendError>

Source

fn drop_analyzer(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn load_analyzers(&self) -> Result<Vec<(String, String)>, StorageBackendError>

Source

fn save_table_field_analyzer( &self, table_name: &str, field: &str, phase: &str, analyzer_name: &str, ) -> Result<(), StorageBackendError>

Source

fn replace_table_field_analyzer( &self, table_name: &str, field: &str, phase: &str, analyzer_name: &str, ) -> Result<(), StorageBackendError>

Source

fn drop_table_field_analyzer_field( &self, table_name: &str, field: &str, ) -> Result<(), StorageBackendError>

Source

fn drop_table_field_analyzers( &self, table_name: &str, ) -> Result<(), StorageBackendError>

Source

fn load_table_field_analyzers( &self, ) -> Result<Vec<(String, String, String, String)>, StorageBackendError>

Source

fn save_foreign_server( &self, name: &str, fdw_type: &str, options_json: &str, ) -> Result<(), StorageBackendError>

Source

fn drop_foreign_server(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn load_foreign_servers( &self, ) -> Result<Vec<(String, String, String)>, StorageBackendError>

Source

fn save_foreign_table( &self, row: &ForeignTableRow, ) -> Result<(), StorageBackendError>

Source

fn rename_foreign_table( &self, from: &RelationIdentity, to: &RelationIdentity, ) -> Result<bool, StorageBackendError>

Atomically move one foreign-table catalog row and its shared relation claim.

Source

fn update_foreign_table_security( &self, relation: &RelationIdentity, role_owner: &str, acl: Option<&[TableAclEntry]>, column_acls: &BTreeMap<String, Vec<TableAclEntry>>, ) -> Result<bool, StorageBackendError>

Source

fn drop_foreign_table( &self, relation: &RelationIdentity, ) -> Result<(), StorageBackendError>

Source

fn load_foreign_tables( &self, ) -> Result<Vec<ForeignTableRow>, StorageBackendError>

Source

fn save_catalog_index_row( &self, index: &CatalogIndexRow, ) -> Result<(), StorageBackendError>

Source

fn drop_catalog_index( &self, relation: &RelationIdentity, ) -> Result<(), StorageBackendError>

Source

fn drop_catalog_indexes_for_table( &self, table_name: &str, ) -> Result<(), StorageBackendError>

Source

fn load_catalog_indexes( &self, ) -> Result<Vec<CatalogIndexRow>, StorageBackendError>

Source

fn save_path_index( &self, graph_name: &str, label_sequences_json: &str, ) -> Result<(), StorageBackendError>

Source

fn drop_path_index(&self, graph_name: &str) -> Result<(), StorageBackendError>

Source

fn load_path_indexes( &self, ) -> Result<Vec<(String, String)>, StorageBackendError>

Source

fn clear_path_index_data(&self, index: &str) -> Result<(), StorageBackendError>

Durable reachability records, paged lexicographically by (source, target). Building calls clear, bounded saves, then finish inside one transaction. Graph mutations invalidate the materialization atomically; definitions remain.

Source

fn save_path_index_pairs( &self, index: &str, sequence: &str, pairs: &[(u64, u64)], ) -> Result<(), StorageBackendError>

Source

fn finish_path_index_data( &self, index: &str, graph: &str, definition: &str, ) -> Result<(), StorageBackendError>

Source

fn path_index_data_is_current( &self, index: &str, definition: &str, ) -> Result<bool, StorageBackendError>

Source

fn path_index_pairs( &self, index: &str, sequence: &str, after: Option<(u64, u64)>, limit: usize, ) -> Result<Vec<(u64, u64)>, StorageBackendError>

Source

fn save_column_stats( &self, stats: ColumnStatsInput<'_>, ) -> Result<(), StorageBackendError>

Source

fn replace_column_stats( &self, table_name: &str, stats: &[ColumnStatsInput<'_>], ) -> Result<(), StorageBackendError>

Atomically replace the complete statistics snapshot for one table. Implementations must leave the prior snapshot intact if any row fails.

Source

fn load_column_stats( &self, table_name: &str, ) -> Result<Vec<ColumnStatsRow>, StorageBackendError>

Source

fn delete_column_stats( &self, table_name: &str, ) -> Result<(), StorageBackendError>

Provided Methods§

Source

fn initialize_storage(&self) -> Result<(), StorageBackendError>

Prepare durable catalog storage inside the backend’s owning initial-restore transaction. Already initialized catalogs may keep the default.

Source

fn cache_revisions( &self, ) -> Result<Option<CatalogCacheRevisions>, StorageBackendError>

Read transactional cache generations without loading schemas or column statistics. Providers without change tracking use conservative reloads.

Source

fn fts_storage_was_reset(&self) -> bool

Source

fn save_schema(&self, name: &str) -> Result<(), StorageBackendError>

Source

fn load_schemas(&self) -> Result<Vec<String>, StorageBackendError>

Source

fn next_sequence_value( &self, name: &str, object_id: [u8; 16], ) -> Result<Option<i64>, StorageBackendError>

Compatibility allocation API for callers that do not retain a session cache. A cached reservation’s unused values are intentionally abandoned, just as when a PostgreSQL session disconnects.

Source

fn load_named_graph_snapshot( &self, name: &str, ) -> Result<Option<GraphSnapshot>, StorageBackendError>

Explicit bulk snapshot/export of one named graph. The caller pins the storage transaction. Engine startup, sessions, and query handles use direct access methods instead of retaining this owned copy.

Source

fn save_analyzer_revision( &self, _name: &str, _config_json: &str, _descriptor_json: &str, ) -> Result<(), StorageBackendError>

Save a named definition’s resolved descriptor with its diagnostic configuration in the same transaction.

Source

fn load_analyzer_descriptors( &self, ) -> Result<Vec<(String, String)>, StorageBackendError>

Resolved named descriptors; legacy definitions appear only in load_analyzers until migrated.

Source

fn replace_table_field_analyzer_binding( &self, _table: &str, _field: &str, _phase: &str, _name: &str, _binding_json: &str, ) -> Result<(), StorageBackendError>

Atomically replace a field’s complete independent binding and its compatibility label. An empty label denotes the physical field’s unnamed default.

Source

fn load_table_field_analyzer_bindings( &self, ) -> Result<Vec<(String, String, String)>, StorageBackendError>

(table, field, binding JSON) rows. Each field has one complete binding envelope.

Source

fn save_catalog_index( &self, relation: &RelationIdentity, index_type: &str, table_name: &str, columns_json: &str, parameters_json: &str, ) -> Result<(), StorageBackendError>

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementors§