1 // Copyright 2013 The Rust Project Developers. See the COPYRIGHT
2 // file at the top-level directory of this distribution and at
3 // http://rust-lang.org/COPYRIGHT.
5 // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8 // option. This file may not be copied, modified, or distributed
9 // except according to those terms.
12 use llvm
::BasicBlockRef
;
13 use trans
::value
::{Users, Value}
;
14 use std
::iter
::{Filter, Map}
;
16 #[derive(Copy, Clone)]
17 pub struct BasicBlock(pub BasicBlockRef
);
19 pub type Preds
= Map
<Filter
<Users
, fn(&Value
) -> bool
>, fn(Value
) -> BasicBlock
>;
21 /// Wrapper for LLVM BasicBlockRef
23 pub fn get(&self) -> BasicBlockRef
{
24 let BasicBlock(v
) = *self; v
27 pub fn as_value(self) -> Value
{
29 Value(llvm
::LLVMBasicBlockAsValue(self.get()))
33 pub fn pred_iter(self) -> Preds
{
34 fn is_a_terminator_inst(user
: &Value
) -> bool { user.is_a_terminator_inst() }
35 let is_a_terminator_inst
: fn(&Value
) -> bool
= is_a_terminator_inst
;
37 fn get_parent(user
: Value
) -> BasicBlock { user.get_parent().unwrap() }
38 let get_parent
: fn(Value
) -> BasicBlock
= get_parent
;
40 self.as_value().user_iter()
41 .filter(is_a_terminator_inst
)
45 pub fn get_single_predecessor(self) -> Option
<BasicBlock
> {
46 let mut iter
= self.pred_iter();
47 match (iter
.next(), iter
.next()) {
48 (Some(first
), None
) => Some(first
),