Skip to content
Snippets Groups Projects
Unverified Commit e08f56a2 authored by Jeremy Soller's avatar Jeremy Soller Committed by GitHub
Browse files

Merge pull request #69 from NilSet/check_namespace

Check if current namespace exists
parents 7bfe1739 04e10340
No related branches found
No related tags found
No related merge requests found
...@@ -77,6 +77,18 @@ pub const ATOMIC_SCHEMEID_INIT: AtomicSchemeId = AtomicSchemeId::default(); ...@@ -77,6 +77,18 @@ pub const ATOMIC_SCHEMEID_INIT: AtomicSchemeId = AtomicSchemeId::default();
/// Unique identifier for a file descriptor. /// Unique identifier for a file descriptor.
int_like!(FileHandle, AtomicFileHandle, usize, AtomicUsize); int_like!(FileHandle, AtomicFileHandle, usize, AtomicUsize);
pub struct SchemeIter<'a> {
inner: Option<::alloc::btree_map::Iter<'a, Box<[u8]>, SchemeId>>
}
impl<'a> Iterator for SchemeIter<'a> {
type Item = (&'a Box<[u8]>, &'a SchemeId);
fn next(&mut self) -> Option<Self::Item> {
self.inner.as_mut().and_then(|iter| iter.next())
}
}
/// Scheme list type /// Scheme list type
pub struct SchemeList { pub struct SchemeList {
map: BTreeMap<SchemeId, Arc<Box<Scheme + Send + Sync>>>, map: BTreeMap<SchemeId, Arc<Box<Scheme + Send + Sync>>>,
...@@ -168,8 +180,10 @@ impl SchemeList { ...@@ -168,8 +180,10 @@ impl SchemeList {
self.map.iter() self.map.iter()
} }
pub fn iter_name(&self, ns: SchemeNamespace) -> ::alloc::btree_map::Iter<Box<[u8]>, SchemeId> { pub fn iter_name(&self, ns: SchemeNamespace) -> SchemeIter {
self.names[&ns].iter() SchemeIter {
inner: self.names.get(&ns).map(|names| names.iter())
}
} }
/// Get the nth scheme. /// Get the nth scheme.
...@@ -178,19 +192,22 @@ impl SchemeList { ...@@ -178,19 +192,22 @@ impl SchemeList {
} }
pub fn get_name(&self, ns: SchemeNamespace, name: &[u8]) -> Option<(SchemeId, &Arc<Box<Scheme + Send + Sync>>)> { pub fn get_name(&self, ns: SchemeNamespace, name: &[u8]) -> Option<(SchemeId, &Arc<Box<Scheme + Send + Sync>>)> {
if let Some(&id) = self.names[&ns].get(name) { if let Some(names) = self.names.get(&ns) {
self.get(id).map(|scheme| (id, scheme)) if let Some(&id) = names.get(name) {
} else { return self.get(id).map(|scheme| (id, scheme));
None }
} }
return None;
} }
/// Create a new scheme. /// Create a new scheme.
pub fn insert<F>(&mut self, ns: SchemeNamespace, name: Box<[u8]>, scheme_fn: F) -> Result<SchemeId> pub fn insert<F>(&mut self, ns: SchemeNamespace, name: Box<[u8]>, scheme_fn: F) -> Result<SchemeId>
where F: Fn(SchemeId) -> Arc<Box<Scheme + Send + Sync>> where F: Fn(SchemeId) -> Arc<Box<Scheme + Send + Sync>>
{ {
if self.names[&ns].contains_key(&name) { if let Some(names) = self.names.get(&ns) {
return Err(Error::new(EEXIST)); if names.contains_key(&name) {
return Err(Error::new(EEXIST));
}
} }
if self.next_id >= SCHEME_MAX_SCHEMES { if self.next_id >= SCHEME_MAX_SCHEMES {
...@@ -216,7 +233,8 @@ impl SchemeList { ...@@ -216,7 +233,8 @@ impl SchemeList {
if let Some(ref mut names) = self.names.get_mut(&ns) { if let Some(ref mut names) = self.names.get_mut(&ns) {
assert!(names.insert(name, id).is_none()); assert!(names.insert(name, id).is_none());
} else { } else {
panic!("scheme namespace not found"); // Nonexistent namespace, posssibly null namespace
return Err(Error::new(ENODEV));
} }
Ok(id) Ok(id)
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment