1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use std::collections::HashMap;
use std::borrow::Cow;
use crate::common::*;
use crate::types::*;
use crate::error::*;
use crate::element::*;
use crate::store::*;
use crate::document::*;
use crate::specification::*;
///Holds and owns all elements and the index to them. The store serves as an abstraction used by Documents
pub struct ElementStore {
pub(crate) items: Vec<Option<Box<ElementData>>>, //heap-allocated
pub(crate) index: HashMap<String,ElementKey>,
///An extra field to hold the document root as DataType. It's practically
///always DataType::Element(0) and exists primarily
///so a borrow can be taken in a similar way as one can can borrow from the data vector
///inside elements. Used by the select iterator.
pub(crate) root: DataType,
///An ``ElementStore`` holds a copy of the FoLiA specification. Duplicating this for each
///element store causes some duplication when holding multiple documents (or stores) in memory, but the specification itself contains mostly
///references to static strings and arrays contained within the library, and therefore only loaded once.
pub specification: Specification,
}
impl Default for ElementStore {
fn default() -> Self {
ElementStore {
items: vec![],
index: HashMap::new(),
root: DataType::Element(0),
specification: Specification::default()
}
}
}