use std::cell::Cell;
use std::vec::Vec;
use super::ElemKey;
use crate::ListTrait;
pub struct ListKey {
list_key: Vec<ElemKey>,
list_index: Cell<usize>,
}
impl ListTrait for ListKey {
fn clear(&mut self) {
self.list_key.clear();
self.list_index.set(usize::MAX);
}
fn count(&self) -> usize {
self.list_key.len()
}
fn index(&self) -> usize {
self.list_index.get()
}
fn get_element(&self, index_param: usize) -> bool {
if index_param >= self.list_key.len() {
return false;
}
self.set_index(index_param);
true
}
fn set_index(&self, index_param: usize) -> bool {
if index_param >= self.list_key.len() {
return false;
}
self.list_index.set(index_param);
true
}
}
impl Default for ListKey {
fn default() -> Self {
ListKey::new()
}
}
impl ListKey {
pub fn new() -> ListKey {
ListKey {
list_key: Vec::new(),
list_index: Cell::new(usize::MAX),
}
}
pub fn add_key(&mut self, key: &str, value: usize, value_ext: usize) -> bool {
let mut new_elem_key: ElemKey = ElemKey::new();
new_elem_key.set_key(key);
new_elem_key.set_value(value);
new_elem_key.set_value_ext(value_ext);
self.list_key.push(new_elem_key);
match self.list_key.iter().position(|e| e.key() == key) {
None => {
return false;
}
Some(o) => {
self.list_index.set(o);
}
}
true
}
pub fn key(&self) -> &str {
match self.list_key.get(self.list_index.get()) {
None => {
panic!("Key list index not set");
}
Some(o) => o.key(),
}
}
pub fn value(&self) -> usize {
match self.list_key.get(self.list_index.get()) {
None => {
panic!("Key list index not set");
}
Some(o) => o.value(),
}
}
pub fn value_ext(&self) -> usize {
match self.list_key.get(self.list_index.get()) {
None => {
panic!("Key list index not set");
}
Some(o) => o.value_ext(),
}
}
pub fn get_element_by_key(&self, key: &str) -> bool {
for (index, elem) in self.list_key.iter().enumerate() {
let tokens: Vec<_> = elem.key().split('(').collect();
if key == tokens[0].trim() {
self.set_index(index);
return true;
}
}
false
}
pub fn get_element_by_value(&self, value: usize) -> bool {
for (index, elem) in self.list_key.iter().enumerate() {
if elem.value() == value {
self.set_index(index);
return true;
}
}
false
}
pub fn get_value_ext_by_index(&self, index_param: usize) -> usize {
match self.list_key.get(index_param) {
None => 0,
Some(o) => o.value_ext(),
}
}
}