/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ use std::cmp::Ordering; use std::collections::HashSet; use crate::bindgen::ir::{ItemContainer, Path}; /// A dependency list is used for gathering what order to output the types. #[derive(Default)] pub struct Dependencies { pub order: Vec, pub items: HashSet, } impl Dependencies { pub fn new() -> Dependencies { Dependencies { order: Vec::new(), items: HashSet::new(), } } pub fn sort(&mut self) { // Sort untagged enums and opaque structs into their own layers because they don't // depend on each other or anything else. let ordering = |a: &ItemContainer, b: &ItemContainer| match (a, b) { (ItemContainer::Enum(x), ItemContainer::Enum(y)) if x.tag.is_none() && y.tag.is_none() => { x.path.cmp(&y.path) } (ItemContainer::Enum(x), _) if x.tag.is_none() => Ordering::Less, (_, ItemContainer::Enum(x)) if x.tag.is_none() => Ordering::Greater, (ItemContainer::OpaqueItem(x), ItemContainer::OpaqueItem(y)) => x.path.cmp(&y.path), (&ItemContainer::OpaqueItem(_), _) => Ordering::Less, (_, &ItemContainer::OpaqueItem(_)) => Ordering::Greater, _ => Ordering::Equal, }; self.order.sort_by(ordering); } }