From cd79e1d1b20a2c289dd15bc2766f97c789d975aa Mon Sep 17 00:00:00 2001
From: Patrick Walton <pcwalton@mimiga.net>
Date: Wed, 26 Sep 2012 17:47:29 -0700
Subject: [PATCH] libcore: De-export ptr, send_map, and task::local_data

---
 src/libcore/ptr.rs             | 69 ++++++++++++----------------------
 src/libcore/send_map.rs        | 32 +++++++---------
 src/libcore/task/local_data.rs | 32 +++++++---------
 3 files changed, 51 insertions(+), 82 deletions(-)

diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs
index 7a31f42d8c4..72fa2cda1a7 100644
--- a/src/libcore/ptr.rs
+++ b/src/libcore/ptr.rs
@@ -1,26 +1,5 @@
 //! Unsafe pointer utility functions
 
-export addr_of;
-export to_unsafe_ptr;
-export to_const_unsafe_ptr;
-export to_mut_unsafe_ptr;
-export mut_addr_of;
-export offset;
-export const_offset;
-export mut_offset;
-export null;
-export mut_null;
-export is_null;
-export is_not_null;
-export memcpy;
-export memmove;
-export memset;
-export to_uint;
-export ref_eq;
-export buf_len;
-export position;
-export Ptr;
-
 use cmp::{Eq, Ord};
 use libc::{c_void, size_t};
 
@@ -49,11 +28,11 @@ extern mod rusti {
 
 /// Get an unsafe pointer to a value
 #[inline(always)]
-pure fn addr_of<T>(val: T) -> *T { unsafe { rusti::addr_of(val) } }
+pub pure fn addr_of<T>(val: T) -> *T { unsafe { rusti::addr_of(val) } }
 
 /// Get an unsafe mut pointer to a value
 #[inline(always)]
-pure fn mut_addr_of<T>(val: T) -> *mut T {
+pub pure fn mut_addr_of<T>(val: T) -> *mut T {
     unsafe {
         cast::reinterpret_cast(&rusti::addr_of(val))
     }
@@ -61,7 +40,7 @@ pure fn mut_addr_of<T>(val: T) -> *mut T {
 
 /// Calculate the offset from a pointer
 #[inline(always)]
-fn offset<T>(ptr: *T, count: uint) -> *T {
+pub fn offset<T>(ptr: *T, count: uint) -> *T {
     unsafe {
         (ptr as uint + count * sys::size_of::<T>()) as *T
     }
@@ -69,7 +48,7 @@ fn offset<T>(ptr: *T, count: uint) -> *T {
 
 /// Calculate the offset from a const pointer
 #[inline(always)]
-fn const_offset<T>(ptr: *const T, count: uint) -> *const T {
+pub fn const_offset<T>(ptr: *const T, count: uint) -> *const T {
     unsafe {
         (ptr as uint + count * sys::size_of::<T>()) as *T
     }
@@ -77,19 +56,19 @@ fn const_offset<T>(ptr: *const T, count: uint) -> *const T {
 
 /// Calculate the offset from a mut pointer
 #[inline(always)]
-fn mut_offset<T>(ptr: *mut T, count: uint) -> *mut T {
+pub fn mut_offset<T>(ptr: *mut T, count: uint) -> *mut T {
     (ptr as uint + count * sys::size_of::<T>()) as *mut T
 }
 
 /// Return the offset of the first null pointer in `buf`.
 #[inline(always)]
-unsafe fn buf_len<T>(buf: **T) -> uint {
+pub unsafe fn buf_len<T>(buf: **T) -> uint {
     position(buf, |i| i == null())
 }
 
 /// Return the first offset `i` such that `f(buf[i]) == true`.
 #[inline(always)]
-unsafe fn position<T>(buf: *T, f: fn(T) -> bool) -> uint {
+pub unsafe fn position<T>(buf: *T, f: fn(T) -> bool) -> uint {
     let mut i = 0u;
     loop {
         if f(*offset(buf, i)) { return i; }
@@ -99,17 +78,17 @@ unsafe fn position<T>(buf: *T, f: fn(T) -> bool) -> uint {
 
 /// Create an unsafe null pointer
 #[inline(always)]
-pure fn null<T>() -> *T { unsafe { cast::reinterpret_cast(&0u) } }
+pub pure fn null<T>() -> *T { unsafe { cast::reinterpret_cast(&0u) } }
 
 /// Create an unsafe mutable null pointer
 #[inline(always)]
-pure fn mut_null<T>() -> *mut T { unsafe { cast::reinterpret_cast(&0u) } }
+pub pure fn mut_null<T>() -> *mut T { unsafe { cast::reinterpret_cast(&0u) } }
 
 /// Returns true if the pointer is equal to the null pointer.
-pure fn is_null<T>(ptr: *const T) -> bool { ptr == null() }
+pub pure fn is_null<T>(ptr: *const T) -> bool { ptr == null() }
 
 /// Returns true if the pointer is not equal to the null pointer.
-pure fn is_not_null<T>(ptr: *const T) -> bool { !is_null(ptr) }
+pub pure fn is_not_null<T>(ptr: *const T) -> bool { !is_null(ptr) }
 
 /**
  * Copies data from one location to another
@@ -118,7 +97,7 @@ pure fn is_not_null<T>(ptr: *const T) -> bool { !is_null(ptr) }
  * and destination may not overlap.
  */
 #[inline(always)]
-unsafe fn memcpy<T>(dst: *mut T, src: *const T, count: uint) {
+pub unsafe fn memcpy<T>(dst: *mut T, src: *const T, count: uint) {
     let n = count * sys::size_of::<T>();
     libc_::memcpy(dst as *mut c_void, src as *c_void, n as size_t);
 }
@@ -130,13 +109,13 @@ unsafe fn memcpy<T>(dst: *mut T, src: *const T, count: uint) {
  * and destination may overlap.
  */
 #[inline(always)]
-unsafe fn memmove<T>(dst: *mut T, src: *const T, count: uint)  {
+pub unsafe fn memmove<T>(dst: *mut T, src: *const T, count: uint) {
     let n = count * sys::size_of::<T>();
     libc_::memmove(dst as *mut c_void, src as *c_void, n as size_t);
 }
 
 #[inline(always)]
-unsafe fn memset<T>(dst: *mut T, c: int, count: uint)  {
+pub unsafe fn memset<T>(dst: *mut T, c: int, count: uint) {
     let n = count * sys::size_of::<T>();
     libc_::memset(dst as *mut c_void, c as libc::c_int, n as size_t);
 }
@@ -148,7 +127,7 @@ unsafe fn memset<T>(dst: *mut T, c: int, count: uint)  {
   reinterpret_cast.
 */
 #[inline(always)]
-fn to_unsafe_ptr<T>(thing: &T) -> *T {
+pub fn to_unsafe_ptr<T>(thing: &T) -> *T {
     unsafe { cast::reinterpret_cast(&thing) }
 }
 
@@ -158,7 +137,7 @@ fn to_unsafe_ptr<T>(thing: &T) -> *T {
   reinterpret_cast.
 */
 #[inline(always)]
-fn to_const_unsafe_ptr<T>(thing: &const T) -> *const T {
+pub fn to_const_unsafe_ptr<T>(thing: &const T) -> *const T {
     unsafe { cast::reinterpret_cast(&thing) }
 }
 
@@ -168,7 +147,7 @@ fn to_const_unsafe_ptr<T>(thing: &const T) -> *const T {
   reinterpret_cast.
 */
 #[inline(always)]
-fn to_mut_unsafe_ptr<T>(thing: &mut T) -> *mut T {
+pub fn to_mut_unsafe_ptr<T>(thing: &mut T) -> *mut T {
     unsafe { cast::reinterpret_cast(&thing) }
 }
 
@@ -180,17 +159,17 @@ fn to_mut_unsafe_ptr<T>(thing: &mut T) -> *mut T {
   (I couldn't think of a cutesy name for this one.)
 */
 #[inline(always)]
-fn to_uint<T>(thing: &T) -> uint unsafe {
+pub fn to_uint<T>(thing: &T) -> uint unsafe {
     cast::reinterpret_cast(&thing)
 }
 
 /// Determine if two borrowed pointers point to the same thing.
 #[inline(always)]
-fn ref_eq<T>(thing: &a/T, other: &b/T) -> bool {
+pub fn ref_eq<T>(thing: &a/T, other: &b/T) -> bool {
     to_uint(thing) == to_uint(other)
 }
 
-trait Ptr {
+pub trait Ptr {
     pure fn is_null() -> bool;
     pure fn is_not_null() -> bool;
 }
@@ -253,7 +232,7 @@ impl<T:Ord> &const T : Ord {
 }
 
 #[test]
-fn test() {
+pub fn test() {
     unsafe {
         type Pair = {mut fst: int, mut snd: int};
         let p = {mut fst: 10, mut snd: 20};
@@ -285,7 +264,7 @@ fn test() {
 }
 
 #[test]
-fn test_position() {
+pub fn test_position() {
     use str::as_c_str;
     use libc::c_char;
 
@@ -298,7 +277,7 @@ fn test_position() {
 }
 
 #[test]
-fn test_buf_len() {
+pub fn test_buf_len() {
     let s0 = ~"hello";
     let s1 = ~"there";
     let s2 = ~"thing";
@@ -316,7 +295,7 @@ fn test_buf_len() {
 }
 
 #[test]
-fn test_is_null() {
+pub fn test_is_null() {
    let p: *int = ptr::null();
    assert p.is_null();
    assert !p.is_not_null();
diff --git a/src/libcore/send_map.rs b/src/libcore/send_map.rs
index 53dcff2e315..ac9a012c373 100644
--- a/src/libcore/send_map.rs
+++ b/src/libcore/send_map.rs
@@ -12,7 +12,7 @@ use cmp::Eq;
 use hash::Hash;
 use to_bytes::IterBytes;
 
-trait SendMap<K:Eq Hash, V: Copy> {
+pub trait SendMap<K:Eq Hash, V: Copy> {
     // FIXME(#3148)  ^^^^ once find_ref() works, we can drop V:copy
 
     fn insert(&mut self, +k: K, +v: V) -> bool;
@@ -31,17 +31,15 @@ trait SendMap<K:Eq Hash, V: Copy> {
 }
 
 /// Open addressing with linear probing.
-mod linear {
-    #[legacy_exports];
-    export LinearMap, linear_map, linear_map_with_capacity, public_methods;
-
+pub mod linear {
     const initial_capacity: uint = 32u; // 2^5
+
     struct Bucket<K:Eq Hash,V> {
         hash: uint,
         key: K,
         value: V,
     }
-    struct LinearMap<K:Eq Hash,V> {
+    pub struct LinearMap<K:Eq Hash,V> {
         k0: u64,
         k1: u64,
         resize_at: uint,
@@ -60,11 +58,11 @@ mod linear {
         ((capacity as float) * 3. / 4.) as uint
     }
 
-    fn LinearMap<K:Eq Hash,V>() -> LinearMap<K,V> {
+    pub fn LinearMap<K:Eq Hash,V>() -> LinearMap<K,V> {
         linear_map_with_capacity(32)
     }
 
-    fn linear_map_with_capacity<K:Eq Hash,V>(
+    pub fn linear_map_with_capacity<K:Eq Hash,V>(
         initial_capacity: uint) -> LinearMap<K,V> {
         let r = rand::Rng();
         linear_map_with_capacity_and_keys(r.gen_u64(), r.gen_u64(),
@@ -366,13 +364,11 @@ mod linear {
 }
 
 #[test]
-mod test {
-    #[legacy_exports];
-
+pub mod test {
     use linear::LinearMap;
 
     #[test]
-    fn inserts() {
+    pub fn inserts() {
         let mut m = ~LinearMap();
         assert m.insert(1, 2);
         assert m.insert(2, 4);
@@ -381,7 +377,7 @@ mod test {
     }
 
     #[test]
-    fn overwrite() {
+    pub fn overwrite() {
         let mut m = ~LinearMap();
         assert m.insert(1, 2);
         assert m.get(&1) == 2;
@@ -390,7 +386,7 @@ mod test {
     }
 
     #[test]
-    fn conflicts() {
+    pub fn conflicts() {
         let mut m = linear::linear_map_with_capacity(4);
         assert m.insert(1, 2);
         assert m.insert(5, 3);
@@ -401,7 +397,7 @@ mod test {
     }
 
     #[test]
-    fn conflict_remove() {
+    pub fn conflict_remove() {
         let mut m = linear::linear_map_with_capacity(4);
         assert m.insert(1, 2);
         assert m.insert(5, 3);
@@ -412,7 +408,7 @@ mod test {
     }
 
     #[test]
-    fn empty() {
+    pub fn empty() {
         let mut m = linear::linear_map_with_capacity(4);
         assert m.insert(1, 2);
         assert !m.is_empty();
@@ -421,7 +417,7 @@ mod test {
     }
 
     #[test]
-    fn iterate() {
+    pub fn iterate() {
         let mut m = linear::linear_map_with_capacity(4);
         for uint::range(0, 32) |i| {
             assert m.insert(i, i*2);
@@ -435,7 +431,7 @@ mod test {
     }
 
     #[test]
-    fn find_ref() {
+    pub fn find_ref() {
         let mut m = ~LinearMap();
         assert m.find_ref(&1).is_none();
         m.insert(1, 2);
diff --git a/src/libcore/task/local_data.rs b/src/libcore/task/local_data.rs
index d91783284c0..313ad16fa0f 100644
--- a/src/libcore/task/local_data.rs
+++ b/src/libcore/task/local_data.rs
@@ -16,12 +16,6 @@ magic.
 
 */
 
-export LocalDataKey;
-export local_data_pop;
-export local_data_get;
-export local_data_set;
-export local_data_modify;
-
 use local_data_priv::{
     local_pop,
     local_get,
@@ -43,13 +37,13 @@ use local_data_priv::{
  *
  * These two cases aside, the interface is safe.
  */
-type LocalDataKey<T: Owned> = &fn(+v: @T);
+pub type LocalDataKey<T: Owned> = &fn(+v: @T);
 
 /**
  * Remove a task-local data value from the table, returning the
  * reference that was originally created to insert it.
  */
-unsafe fn local_data_pop<T: Owned>(
+pub unsafe fn local_data_pop<T: Owned>(
     key: LocalDataKey<T>) -> Option<@T> {
 
     local_pop(rt::rust_get_task(), key)
@@ -58,7 +52,7 @@ unsafe fn local_data_pop<T: Owned>(
  * Retrieve a task-local data value. It will also be kept alive in the
  * table until explicitly removed.
  */
-unsafe fn local_data_get<T: Owned>(
+pub unsafe fn local_data_get<T: Owned>(
     key: LocalDataKey<T>) -> Option<@T> {
 
     local_get(rt::rust_get_task(), key)
@@ -67,7 +61,7 @@ unsafe fn local_data_get<T: Owned>(
  * Store a value in task-local data. If this key already has a value,
  * that value is overwritten (and its destructor is run).
  */
-unsafe fn local_data_set<T: Owned>(
+pub unsafe fn local_data_set<T: Owned>(
     key: LocalDataKey<T>, +data: @T) {
 
     local_set(rt::rust_get_task(), key, data)
@@ -76,7 +70,7 @@ unsafe fn local_data_set<T: Owned>(
  * Modify a task-local data value. If the function returns 'None', the
  * data is removed (and its reference dropped).
  */
-unsafe fn local_data_modify<T: Owned>(
+pub unsafe fn local_data_modify<T: Owned>(
     key: LocalDataKey<T>,
     modify_fn: fn(Option<@T>) -> Option<@T>) {
 
@@ -84,7 +78,7 @@ unsafe fn local_data_modify<T: Owned>(
 }
 
 #[test]
-fn test_tls_multitask() unsafe {
+pub fn test_tls_multitask() unsafe {
     fn my_key(+_x: @~str) { }
     local_data_set(my_key, @~"parent data");
     do task::spawn unsafe {
@@ -100,7 +94,7 @@ fn test_tls_multitask() unsafe {
 }
 
 #[test]
-fn test_tls_overwrite() unsafe {
+pub fn test_tls_overwrite() unsafe {
     fn my_key(+_x: @~str) { }
     local_data_set(my_key, @~"first data");
     local_data_set(my_key, @~"next data"); // Shouldn't leak.
@@ -108,7 +102,7 @@ fn test_tls_overwrite() unsafe {
 }
 
 #[test]
-fn test_tls_pop() unsafe {
+pub fn test_tls_pop() unsafe {
     fn my_key(+_x: @~str) { }
     local_data_set(my_key, @~"weasel");
     assert *(local_data_pop(my_key).get()) == ~"weasel";
@@ -117,7 +111,7 @@ fn test_tls_pop() unsafe {
 }
 
 #[test]
-fn test_tls_modify() unsafe {
+pub fn test_tls_modify() unsafe {
     fn my_key(+_x: @~str) { }
     local_data_modify(my_key, |data| {
         match data {
@@ -136,7 +130,7 @@ fn test_tls_modify() unsafe {
 }
 
 #[test]
-fn test_tls_crust_automorestack_memorial_bug() unsafe {
+pub fn test_tls_crust_automorestack_memorial_bug() unsafe {
     // This might result in a stack-canary clobber if the runtime fails to set
     // sp_limit to 0 when calling the cleanup extern - it might automatically
     // jump over to the rust stack, which causes next_c_sp to get recorded as
@@ -149,7 +143,7 @@ fn test_tls_crust_automorestack_memorial_bug() unsafe {
 }
 
 #[test]
-fn test_tls_multiple_types() unsafe {
+pub fn test_tls_multiple_types() unsafe {
     fn str_key(+_x: @~str) { }
     fn box_key(+_x: @@()) { }
     fn int_key(+_x: @int) { }
@@ -161,7 +155,7 @@ fn test_tls_multiple_types() unsafe {
 }
 
 #[test]
-fn test_tls_overwrite_multiple_types() {
+pub fn test_tls_overwrite_multiple_types() {
     fn str_key(+_x: @~str) { }
     fn box_key(+_x: @@()) { }
     fn int_key(+_x: @int) { }
@@ -177,7 +171,7 @@ fn test_tls_overwrite_multiple_types() {
 #[test]
 #[should_fail]
 #[ignore(cfg(windows))]
-fn test_tls_cleanup_on_failure() unsafe {
+pub fn test_tls_cleanup_on_failure() unsafe {
     fn str_key(+_x: @~str) { }
     fn box_key(+_x: @@()) { }
     fn int_key(+_x: @int) { }