mirror of
https://github.com/emirpasic/gods
synced 2024-11-18 09:25:50 +00:00
commit
e86802a747
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package containers provides core interfaces and functions for data structures.
|
// Package containers provides core interfaces and functions for data structures.
|
||||||
//
|
//
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// All data structures must implement the container structure
|
// All data structures must implement the container structure
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package containers
|
package containers
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package containers
|
package containers
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package examples
|
package examples
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package arraylist implements the array list.
|
// Package arraylist implements the array list.
|
||||||
//
|
//
|
||||||
@ -33,16 +11,13 @@ package arraylist
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/lists"
|
"github.com/emirpasic/gods/lists"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertListImplementation() {
|
||||||
var _ lists.List = (*List)(nil)
|
var _ lists.List = (*List)(nil)
|
||||||
var _ containers.EnumerableWithIndex = (*List)(nil)
|
|
||||||
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// List holds the elements in a slice
|
// List holds the elements in a slice
|
||||||
@ -180,146 +155,6 @@ func (list *List) Insert(index int, values ...interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator holding the iterator's state
|
|
||||||
type Iterator struct {
|
|
||||||
list *List
|
|
||||||
index int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
func (list *List) Iterator() Iterator {
|
|
||||||
return Iterator{list: list, index: -1}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.list.size {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
return iterator.list.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
if iterator.index >= 0 {
|
|
||||||
iterator.index--
|
|
||||||
}
|
|
||||||
return iterator.list.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
return iterator.list.elements[iterator.index]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.index = iterator.list.size
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
iterator.End()
|
|
||||||
return iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each calls the given function once for each element, passing that element's index and value.
|
|
||||||
func (list *List) Each(f func(index int, value interface{})) {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
f(iterator.Index(), iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map invokes the given function once for each element and returns a
|
|
||||||
// container containing the values returned by the given function.
|
|
||||||
func (list *List) Map(f func(index int, value interface{}) interface{}) *List {
|
|
||||||
newList := &List{}
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
newList.Add(f(iterator.Index(), iterator.Value()))
|
|
||||||
}
|
|
||||||
return newList
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select returns a new container containing all elements for which the given function returns a true value.
|
|
||||||
func (list *List) Select(f func(index int, value interface{}) bool) *List {
|
|
||||||
newList := &List{}
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
newList.Add(iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newList
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any passes each element of the collection to the given function and
|
|
||||||
// returns true if the function ever returns true for any element.
|
|
||||||
func (list *List) Any(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// All passes each element of the collection to the given function and
|
|
||||||
// returns true if the function returns true for all elements.
|
|
||||||
func (list *List) All(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if !f(iterator.Index(), iterator.Value()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find passes each element of the container to the given function and returns
|
|
||||||
// the first (index,value) for which the function is true or -1,nil otherwise
|
|
||||||
// if no element matches the criteria.
|
|
||||||
func (list *List) Find(f func(index int, value interface{}) bool) (int, interface{}) {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return iterator.Index(), iterator.Value()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (list *List) String() string {
|
func (list *List) String() string {
|
||||||
str := "ArrayList\n"
|
str := "ArrayList\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package arraylist
|
package arraylist
|
||||||
|
|
||||||
|
79
lists/arraylist/enumerable.go
Normal file
79
lists/arraylist/enumerable.go
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package arraylist
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertEnumerableImplementation() {
|
||||||
|
var _ containers.EnumerableWithIndex = (*List)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each calls the given function once for each element, passing that element's index and value.
|
||||||
|
func (list *List) Each(f func(index int, value interface{})) {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
f(iterator.Index(), iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map invokes the given function once for each element and returns a
|
||||||
|
// container containing the values returned by the given function.
|
||||||
|
func (list *List) Map(f func(index int, value interface{}) interface{}) *List {
|
||||||
|
newList := &List{}
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
newList.Add(f(iterator.Index(), iterator.Value()))
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select returns a new container containing all elements for which the given function returns a true value.
|
||||||
|
func (list *List) Select(f func(index int, value interface{}) bool) *List {
|
||||||
|
newList := &List{}
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
newList.Add(iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any passes each element of the collection to the given function and
|
||||||
|
// returns true if the function ever returns true for any element.
|
||||||
|
func (list *List) Any(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// All passes each element of the collection to the given function and
|
||||||
|
// returns true if the function returns true for all elements.
|
||||||
|
func (list *List) All(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if !f(iterator.Index(), iterator.Value()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find passes each element of the container to the given function and returns
|
||||||
|
// the first (index,value) for which the function is true or -1,nil otherwise
|
||||||
|
// if no element matches the criteria.
|
||||||
|
func (list *List) Find(f func(index int, value interface{}) bool) (int, interface{}) {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return iterator.Index(), iterator.Value()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
83
lists/arraylist/iterator.go
Normal file
83
lists/arraylist/iterator.go
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package arraylist
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator holding the iterator's state
|
||||||
|
type Iterator struct {
|
||||||
|
list *List
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
func (list *List) Iterator() Iterator {
|
||||||
|
return Iterator{list: list, index: -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.list.size {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
return iterator.list.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
if iterator.index >= 0 {
|
||||||
|
iterator.index--
|
||||||
|
}
|
||||||
|
return iterator.list.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
return iterator.list.elements[iterator.index]
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.index = iterator.list.size
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
iterator.End()
|
||||||
|
return iterator.Prev()
|
||||||
|
}
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package doublylinkedlist implements the doubly-linked list.
|
// Package doublylinkedlist implements the doubly-linked list.
|
||||||
//
|
//
|
||||||
@ -33,16 +11,13 @@ package doublylinkedlist
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/lists"
|
"github.com/emirpasic/gods/lists"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertListImplementation() {
|
||||||
var _ lists.List = (*List)(nil)
|
var _ lists.List = (*List)(nil)
|
||||||
var _ containers.EnumerableWithIndex = (*List)(nil)
|
|
||||||
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// List holds the elements, where each element points to the next and previous element
|
// List holds the elements, where each element points to the next and previous element
|
||||||
@ -300,167 +275,6 @@ func (list *List) Insert(index int, values ...interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator holding the iterator's state
|
|
||||||
type Iterator struct {
|
|
||||||
list *List
|
|
||||||
index int
|
|
||||||
element *element
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
func (list *List) Iterator() Iterator {
|
|
||||||
return Iterator{list: list, index: -1, element: nil}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.list.size {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
if !iterator.list.withinRange(iterator.index) {
|
|
||||||
iterator.element = nil
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if iterator.index != 0 {
|
|
||||||
iterator.element = iterator.element.next
|
|
||||||
} else {
|
|
||||||
iterator.element = iterator.list.first
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
if iterator.index >= 0 {
|
|
||||||
iterator.index--
|
|
||||||
}
|
|
||||||
if !iterator.list.withinRange(iterator.index) {
|
|
||||||
iterator.element = nil
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if iterator.index == iterator.list.size-1 {
|
|
||||||
iterator.element = iterator.list.last
|
|
||||||
} else {
|
|
||||||
iterator.element = iterator.element.prev
|
|
||||||
}
|
|
||||||
return iterator.list.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
return iterator.element.value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
iterator.element = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.index = iterator.list.size
|
|
||||||
iterator.element = iterator.list.last
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
iterator.End()
|
|
||||||
return iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each calls the given function once for each element, passing that element's index and value.
|
|
||||||
func (list *List) Each(f func(index int, value interface{})) {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
f(iterator.Index(), iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map invokes the given function once for each element and returns a
|
|
||||||
// container containing the values returned by the given function.
|
|
||||||
func (list *List) Map(f func(index int, value interface{}) interface{}) *List {
|
|
||||||
newList := &List{}
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
newList.Add(f(iterator.Index(), iterator.Value()))
|
|
||||||
}
|
|
||||||
return newList
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select returns a new container containing all elements for which the given function returns a true value.
|
|
||||||
func (list *List) Select(f func(index int, value interface{}) bool) *List {
|
|
||||||
newList := &List{}
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
newList.Add(iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newList
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any passes each element of the container to the given function and
|
|
||||||
// returns true if the function ever returns true for any element.
|
|
||||||
func (list *List) Any(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// All passes each element of the container to the given function and
|
|
||||||
// returns true if the function returns true for all elements.
|
|
||||||
func (list *List) All(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if !f(iterator.Index(), iterator.Value()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find passes each element of the container to the given function and returns
|
|
||||||
// the first (index,value) for which the function is true or -1,nil otherwise
|
|
||||||
// if no element matches the criteria.
|
|
||||||
func (list *List) Find(f func(index int, value interface{}) bool) (index int, value interface{}) {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return iterator.Index(), iterator.Value()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (list *List) String() string {
|
func (list *List) String() string {
|
||||||
str := "DoublyLinkedList\n"
|
str := "DoublyLinkedList\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package doublylinkedlist
|
package doublylinkedlist
|
||||||
|
|
||||||
|
79
lists/doublylinkedlist/enumerable.go
Normal file
79
lists/doublylinkedlist/enumerable.go
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package doublylinkedlist
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertEnumerableImplementation() {
|
||||||
|
var _ containers.EnumerableWithIndex = (*List)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each calls the given function once for each element, passing that element's index and value.
|
||||||
|
func (list *List) Each(f func(index int, value interface{})) {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
f(iterator.Index(), iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map invokes the given function once for each element and returns a
|
||||||
|
// container containing the values returned by the given function.
|
||||||
|
func (list *List) Map(f func(index int, value interface{}) interface{}) *List {
|
||||||
|
newList := &List{}
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
newList.Add(f(iterator.Index(), iterator.Value()))
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select returns a new container containing all elements for which the given function returns a true value.
|
||||||
|
func (list *List) Select(f func(index int, value interface{}) bool) *List {
|
||||||
|
newList := &List{}
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
newList.Add(iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any passes each element of the container to the given function and
|
||||||
|
// returns true if the function ever returns true for any element.
|
||||||
|
func (list *List) Any(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// All passes each element of the container to the given function and
|
||||||
|
// returns true if the function returns true for all elements.
|
||||||
|
func (list *List) All(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if !f(iterator.Index(), iterator.Value()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find passes each element of the container to the given function and returns
|
||||||
|
// the first (index,value) for which the function is true or -1,nil otherwise
|
||||||
|
// if no element matches the criteria.
|
||||||
|
func (list *List) Find(f func(index int, value interface{}) bool) (index int, value interface{}) {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return iterator.Index(), iterator.Value()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
104
lists/doublylinkedlist/iterator.go
Normal file
104
lists/doublylinkedlist/iterator.go
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package doublylinkedlist
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator holding the iterator's state
|
||||||
|
type Iterator struct {
|
||||||
|
list *List
|
||||||
|
index int
|
||||||
|
element *element
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
func (list *List) Iterator() Iterator {
|
||||||
|
return Iterator{list: list, index: -1, element: nil}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.list.size {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
if !iterator.list.withinRange(iterator.index) {
|
||||||
|
iterator.element = nil
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if iterator.index != 0 {
|
||||||
|
iterator.element = iterator.element.next
|
||||||
|
} else {
|
||||||
|
iterator.element = iterator.list.first
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
if iterator.index >= 0 {
|
||||||
|
iterator.index--
|
||||||
|
}
|
||||||
|
if !iterator.list.withinRange(iterator.index) {
|
||||||
|
iterator.element = nil
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if iterator.index == iterator.list.size-1 {
|
||||||
|
iterator.element = iterator.list.last
|
||||||
|
} else {
|
||||||
|
iterator.element = iterator.element.prev
|
||||||
|
}
|
||||||
|
return iterator.list.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
return iterator.element.value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
iterator.element = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.index = iterator.list.size
|
||||||
|
iterator.element = iterator.list.last
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
iterator.End()
|
||||||
|
return iterator.Prev()
|
||||||
|
}
|
@ -1,20 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) Emir Pasic, All rights reserved.
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3.0 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library. See the file LICENSE included
|
|
||||||
with this distribution for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package lists provides an abstract List interface.
|
// Package lists provides an abstract List interface.
|
||||||
//
|
//
|
||||||
|
79
lists/singlylinkedlist/enumerable.go
Normal file
79
lists/singlylinkedlist/enumerable.go
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package singlylinkedlist
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertEnumerableImplementation() {
|
||||||
|
var _ containers.EnumerableWithIndex = (*List)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each calls the given function once for each element, passing that element's index and value.
|
||||||
|
func (list *List) Each(f func(index int, value interface{})) {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
f(iterator.Index(), iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map invokes the given function once for each element and returns a
|
||||||
|
// container containing the values returned by the given function.
|
||||||
|
func (list *List) Map(f func(index int, value interface{}) interface{}) *List {
|
||||||
|
newList := &List{}
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
newList.Add(f(iterator.Index(), iterator.Value()))
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select returns a new container containing all elements for which the given function returns a true value.
|
||||||
|
func (list *List) Select(f func(index int, value interface{}) bool) *List {
|
||||||
|
newList := &List{}
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
newList.Add(iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newList
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any passes each element of the container to the given function and
|
||||||
|
// returns true if the function ever returns true for any element.
|
||||||
|
func (list *List) Any(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// All passes each element of the container to the given function and
|
||||||
|
// returns true if the function returns true for all elements.
|
||||||
|
func (list *List) All(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if !f(iterator.Index(), iterator.Value()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find passes each element of the container to the given function and returns
|
||||||
|
// the first (index,value) for which the function is true or -1,nil otherwise
|
||||||
|
// if no element matches the criteria.
|
||||||
|
func (list *List) Find(f func(index int, value interface{}) bool) (index int, value interface{}) {
|
||||||
|
iterator := list.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return iterator.Index(), iterator.Value()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
70
lists/singlylinkedlist/iterator.go
Normal file
70
lists/singlylinkedlist/iterator.go
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package singlylinkedlist
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.IteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator holding the iterator's state
|
||||||
|
type Iterator struct {
|
||||||
|
list *List
|
||||||
|
index int
|
||||||
|
element *element
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
func (list *List) Iterator() Iterator {
|
||||||
|
return Iterator{list: list, index: -1, element: nil}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.list.size {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
if !iterator.list.withinRange(iterator.index) {
|
||||||
|
iterator.element = nil
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if iterator.index == 0 {
|
||||||
|
iterator.element = iterator.list.first
|
||||||
|
} else {
|
||||||
|
iterator.element = iterator.element.next
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
return iterator.element.value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
iterator.element = nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package singlylinkedlist implements the singly-linked list.
|
// Package singlylinkedlist implements the singly-linked list.
|
||||||
//
|
//
|
||||||
@ -33,16 +11,13 @@ package singlylinkedlist
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/lists"
|
"github.com/emirpasic/gods/lists"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertListImplementation() {
|
||||||
var _ lists.List = (*List)(nil)
|
var _ lists.List = (*List)(nil)
|
||||||
var _ containers.EnumerableWithIndex = (*List)(nil)
|
|
||||||
var _ containers.IteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// List holds the elements, where each element points to the next element
|
// List holds the elements, where each element points to the next element
|
||||||
@ -272,133 +247,6 @@ func (list *List) Insert(index int, values ...interface{}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator holding the iterator's state
|
|
||||||
type Iterator struct {
|
|
||||||
list *List
|
|
||||||
index int
|
|
||||||
element *element
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
func (list *List) Iterator() Iterator {
|
|
||||||
return Iterator{list: list, index: -1, element: nil}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.list.size {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
if !iterator.list.withinRange(iterator.index) {
|
|
||||||
iterator.element = nil
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
if iterator.index == 0 {
|
|
||||||
iterator.element = iterator.list.first
|
|
||||||
} else {
|
|
||||||
iterator.element = iterator.element.next
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
return iterator.element.value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
iterator.element = nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each calls the given function once for each element, passing that element's index and value.
|
|
||||||
func (list *List) Each(f func(index int, value interface{})) {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
f(iterator.Index(), iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map invokes the given function once for each element and returns a
|
|
||||||
// container containing the values returned by the given function.
|
|
||||||
func (list *List) Map(f func(index int, value interface{}) interface{}) *List {
|
|
||||||
newList := &List{}
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
newList.Add(f(iterator.Index(), iterator.Value()))
|
|
||||||
}
|
|
||||||
return newList
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select returns a new container containing all elements for which the given function returns a true value.
|
|
||||||
func (list *List) Select(f func(index int, value interface{}) bool) *List {
|
|
||||||
newList := &List{}
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
newList.Add(iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newList
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any passes each element of the container to the given function and
|
|
||||||
// returns true if the function ever returns true for any element.
|
|
||||||
func (list *List) Any(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// All passes each element of the container to the given function and
|
|
||||||
// returns true if the function returns true for all elements.
|
|
||||||
func (list *List) All(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if !f(iterator.Index(), iterator.Value()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find passes each element of the container to the given function and returns
|
|
||||||
// the first (index,value) for which the function is true or -1,nil otherwise
|
|
||||||
// if no element matches the criteria.
|
|
||||||
func (list *List) Find(f func(index int, value interface{}) bool) (index int, value interface{}) {
|
|
||||||
iterator := list.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return iterator.Index(), iterator.Value()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (list *List) String() string {
|
func (list *List) String() string {
|
||||||
str := "SinglyLinkedList\n"
|
str := "SinglyLinkedList\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package singlylinkedlist
|
package singlylinkedlist
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package hashmap implements a map backed by a hash table.
|
// Package hashmap implements a map backed by a hash table.
|
||||||
//
|
//
|
||||||
@ -38,7 +16,7 @@ import (
|
|||||||
"github.com/emirpasic/gods/maps"
|
"github.com/emirpasic/gods/maps"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertMapImplementation() {
|
||||||
var _ maps.Map = (*Map)(nil)
|
var _ maps.Map = (*Map)(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package hashmap
|
package hashmap
|
||||||
|
|
||||||
|
28
maps/maps.go
28
maps/maps.go
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package maps provides an abstract Map interface.
|
// Package maps provides an abstract Map interface.
|
||||||
//
|
//
|
||||||
|
83
maps/treemap/enumerable.go
Normal file
83
maps/treemap/enumerable.go
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package treemap
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertEnumerableImplementation() {
|
||||||
|
var _ containers.EnumerableWithKey = (*Map)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each calls the given function once for each element, passing that element's key and value.
|
||||||
|
func (m *Map) Each(f func(key interface{}, value interface{})) {
|
||||||
|
iterator := m.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
f(iterator.Key(), iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map invokes the given function once for each element and returns a container
|
||||||
|
// containing the values returned by the given function as key/value pairs.
|
||||||
|
func (m *Map) Map(f func(key1 interface{}, value1 interface{}) (interface{}, interface{})) *Map {
|
||||||
|
newMap := &Map{tree: rbt.NewWith(m.tree.Comparator)}
|
||||||
|
iterator := m.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
key2, value2 := f(iterator.Key(), iterator.Value())
|
||||||
|
newMap.Put(key2, value2)
|
||||||
|
}
|
||||||
|
return newMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select returns a new container containing all elements for which the given function returns a true value.
|
||||||
|
func (m *Map) Select(f func(key interface{}, value interface{}) bool) *Map {
|
||||||
|
newMap := &Map{tree: rbt.NewWith(m.tree.Comparator)}
|
||||||
|
iterator := m.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Key(), iterator.Value()) {
|
||||||
|
newMap.Put(iterator.Key(), iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any passes each element of the container to the given function and
|
||||||
|
// returns true if the function ever returns true for any element.
|
||||||
|
func (m *Map) Any(f func(key interface{}, value interface{}) bool) bool {
|
||||||
|
iterator := m.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Key(), iterator.Value()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// All passes each element of the container to the given function and
|
||||||
|
// returns true if the function returns true for all elements.
|
||||||
|
func (m *Map) All(f func(key interface{}, value interface{}) bool) bool {
|
||||||
|
iterator := m.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if !f(iterator.Key(), iterator.Value()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find passes each element of the container to the given function and returns
|
||||||
|
// the first (key,value) for which the function is true or nil,nil otherwise if no element
|
||||||
|
// matches the criteria.
|
||||||
|
func (m *Map) Find(f func(key interface{}, value interface{}) bool) (interface{}, interface{}) {
|
||||||
|
iterator := m.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Key(), iterator.Value()) {
|
||||||
|
return iterator.Key(), iterator.Value()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, nil
|
||||||
|
}
|
77
maps/treemap/iterator.go
Normal file
77
maps/treemap/iterator.go
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package treemap
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithKey = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator holding the iterator's state
|
||||||
|
type Iterator struct {
|
||||||
|
iterator rbt.Iterator
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose elements are key/value pairs.
|
||||||
|
func (m *Map) Iterator() Iterator {
|
||||||
|
return Iterator{iterator: m.tree.Iterator()}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's key and value can be retrieved by Key() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
return iterator.iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's key and value can be retrieved by Key() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
return iterator.iterator.Prev()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
return iterator.iterator.Value()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key returns the current element's key.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Key() interface{} {
|
||||||
|
return iterator.iterator.Key()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.iterator.Begin()
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.iterator.End()
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's key and value can be retrieved by Key() and Value().
|
||||||
|
// Modifies the state of the iterator
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
return iterator.iterator.First()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's key and value can be retrieved by Key() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
return iterator.iterator.Last()
|
||||||
|
}
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package treemap implements a map backed by red-black tree.
|
// Package treemap implements a map backed by red-black tree.
|
||||||
//
|
//
|
||||||
@ -34,16 +12,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|||||||
package treemap
|
package treemap
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/maps"
|
"github.com/emirpasic/gods/maps"
|
||||||
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertMapImplementation() {
|
||||||
var _ maps.Map = (*Map)(nil)
|
var _ maps.Map = (*Map)(nil)
|
||||||
var _ containers.EnumerableWithKey = (*Map)(nil)
|
|
||||||
var _ containers.ReverseIteratorWithKey = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Map holds the elements in a red-black tree
|
// Map holds the elements in a red-black tree
|
||||||
@ -128,138 +103,6 @@ func (m *Map) Max() (key interface{}, value interface{}) {
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator holding the iterator's state
|
|
||||||
type Iterator struct {
|
|
||||||
iterator rbt.Iterator
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose elements are key/value pairs.
|
|
||||||
func (m *Map) Iterator() Iterator {
|
|
||||||
return Iterator{iterator: m.tree.Iterator()}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's key and value can be retrieved by Key() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
return iterator.iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's key and value can be retrieved by Key() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
return iterator.iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
return iterator.iterator.Value()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Key returns the current element's key.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Key() interface{} {
|
|
||||||
return iterator.iterator.Key()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.iterator.Begin()
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.iterator.End()
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's key and value can be retrieved by Key() and Value().
|
|
||||||
// Modifies the state of the iterator
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
return iterator.iterator.First()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's key and value can be retrieved by Key() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
return iterator.iterator.Last()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each calls the given function once for each element, passing that element's key and value.
|
|
||||||
func (m *Map) Each(f func(key interface{}, value interface{})) {
|
|
||||||
iterator := m.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
f(iterator.Key(), iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map invokes the given function once for each element and returns a container
|
|
||||||
// containing the values returned by the given function as key/value pairs.
|
|
||||||
func (m *Map) Map(f func(key1 interface{}, value1 interface{}) (interface{}, interface{})) *Map {
|
|
||||||
newMap := &Map{tree: rbt.NewWith(m.tree.Comparator)}
|
|
||||||
iterator := m.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
key2, value2 := f(iterator.Key(), iterator.Value())
|
|
||||||
newMap.Put(key2, value2)
|
|
||||||
}
|
|
||||||
return newMap
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select returns a new container containing all elements for which the given function returns a true value.
|
|
||||||
func (m *Map) Select(f func(key interface{}, value interface{}) bool) *Map {
|
|
||||||
newMap := &Map{tree: rbt.NewWith(m.tree.Comparator)}
|
|
||||||
iterator := m.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Key(), iterator.Value()) {
|
|
||||||
newMap.Put(iterator.Key(), iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newMap
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any passes each element of the container to the given function and
|
|
||||||
// returns true if the function ever returns true for any element.
|
|
||||||
func (m *Map) Any(f func(key interface{}, value interface{}) bool) bool {
|
|
||||||
iterator := m.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Key(), iterator.Value()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// All passes each element of the container to the given function and
|
|
||||||
// returns true if the function returns true for all elements.
|
|
||||||
func (m *Map) All(f func(key interface{}, value interface{}) bool) bool {
|
|
||||||
iterator := m.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if !f(iterator.Key(), iterator.Value()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find passes each element of the container to the given function and returns
|
|
||||||
// the first (key,value) for which the function is true or nil,nil otherwise if no element
|
|
||||||
// matches the criteria.
|
|
||||||
func (m *Map) Find(f func(key interface{}, value interface{}) bool) (interface{}, interface{}) {
|
|
||||||
iterator := m.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Key(), iterator.Value()) {
|
|
||||||
return iterator.Key(), iterator.Value()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (m *Map) String() string {
|
func (m *Map) String() string {
|
||||||
str := "TreeMap\n"
|
str := "TreeMap\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package treemap
|
package treemap
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package hashset implements a set backed by a hash table.
|
// Package hashset implements a set backed by a hash table.
|
||||||
//
|
//
|
||||||
@ -37,7 +15,7 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertSetImplementation() {
|
||||||
var _ sets.Set = (*Set)(nil)
|
var _ sets.Set = (*Set)(nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package hashset
|
package hashset
|
||||||
|
|
||||||
|
20
sets/sets.go
20
sets/sets.go
@ -1,20 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) Emir Pasic, All rights reserved.
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3.0 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library. See the file LICENSE included
|
|
||||||
with this distribution for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package sets provides an abstract Set interface.
|
// Package sets provides an abstract Set interface.
|
||||||
//
|
//
|
||||||
|
82
sets/treeset/enumerable.go
Normal file
82
sets/treeset/enumerable.go
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package treeset
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertEnumerableImplementation() {
|
||||||
|
var _ containers.EnumerableWithIndex = (*Set)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Each calls the given function once for each element, passing that element's index and value.
|
||||||
|
func (set *Set) Each(f func(index int, value interface{})) {
|
||||||
|
iterator := set.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
f(iterator.Index(), iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Map invokes the given function once for each element and returns a
|
||||||
|
// container containing the values returned by the given function.
|
||||||
|
func (set *Set) Map(f func(index int, value interface{}) interface{}) *Set {
|
||||||
|
newSet := &Set{tree: rbt.NewWith(set.tree.Comparator)}
|
||||||
|
iterator := set.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
newSet.Add(f(iterator.Index(), iterator.Value()))
|
||||||
|
}
|
||||||
|
return newSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// Select returns a new container containing all elements for which the given function returns a true value.
|
||||||
|
func (set *Set) Select(f func(index int, value interface{}) bool) *Set {
|
||||||
|
newSet := &Set{tree: rbt.NewWith(set.tree.Comparator)}
|
||||||
|
iterator := set.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
newSet.Add(iterator.Value())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return newSet
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any passes each element of the container to the given function and
|
||||||
|
// returns true if the function ever returns true for any element.
|
||||||
|
func (set *Set) Any(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := set.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// All passes each element of the container to the given function and
|
||||||
|
// returns true if the function returns true for all elements.
|
||||||
|
func (set *Set) All(f func(index int, value interface{}) bool) bool {
|
||||||
|
iterator := set.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if !f(iterator.Index(), iterator.Value()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Find passes each element of the container to the given function and returns
|
||||||
|
// the first (index,value) for which the function is true or -1,nil otherwise
|
||||||
|
// if no element matches the criteria.
|
||||||
|
func (set *Set) Find(f func(index int, value interface{}) bool) (int, interface{}) {
|
||||||
|
iterator := set.Iterator()
|
||||||
|
for iterator.Next() {
|
||||||
|
if f(iterator.Index(), iterator.Value()) {
|
||||||
|
return iterator.Index(), iterator.Value()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, nil
|
||||||
|
}
|
89
sets/treeset/iterator.go
Normal file
89
sets/treeset/iterator.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package treeset
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/emirpasic/gods/containers"
|
||||||
|
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
type Iterator struct {
|
||||||
|
index int
|
||||||
|
iterator rbt.Iterator
|
||||||
|
tree *rbt.Tree
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator holding the iterator's state
|
||||||
|
func (set *Set) Iterator() Iterator {
|
||||||
|
return Iterator{index: -1, iterator: set.tree.Iterator(), tree: set.tree}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.tree.Size() {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
return iterator.iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
if iterator.index >= 0 {
|
||||||
|
iterator.index--
|
||||||
|
}
|
||||||
|
return iterator.iterator.Prev()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
return iterator.iterator.Key()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
iterator.iterator.Begin()
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.index = iterator.tree.Size()
|
||||||
|
iterator.iterator.End()
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
iterator.End()
|
||||||
|
return iterator.iterator.Last()
|
||||||
|
}
|
@ -1,20 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) Emir Pasic, All rights reserved.
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3.0 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library. See the file LICENSE included
|
|
||||||
with this distribution for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package treeset implements a tree backed by a red-black tree.
|
// Package treeset implements a tree backed by a red-black tree.
|
||||||
//
|
//
|
||||||
@ -25,17 +11,14 @@ package treeset
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/sets"
|
"github.com/emirpasic/gods/sets"
|
||||||
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
rbt "github.com/emirpasic/gods/trees/redblacktree"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertSetImplementation() {
|
||||||
var _ sets.Set = (*Set)(nil)
|
var _ sets.Set = (*Set)(nil)
|
||||||
var _ containers.EnumerableWithIndex = (*Set)(nil)
|
|
||||||
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set holds elements in a red-black tree
|
// Set holds elements in a red-black tree
|
||||||
@ -106,149 +89,6 @@ func (set *Set) Values() []interface{} {
|
|||||||
return set.tree.Keys()
|
return set.tree.Keys()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
type Iterator struct {
|
|
||||||
index int
|
|
||||||
iterator rbt.Iterator
|
|
||||||
tree *rbt.Tree
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator holding the iterator's state
|
|
||||||
func (set *Set) Iterator() Iterator {
|
|
||||||
return Iterator{index: -1, iterator: set.tree.Iterator(), tree: set.tree}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.tree.Size() {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
return iterator.iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
if iterator.index >= 0 {
|
|
||||||
iterator.index--
|
|
||||||
}
|
|
||||||
return iterator.iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
return iterator.iterator.Key()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
iterator.iterator.Begin()
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.index = iterator.tree.Size()
|
|
||||||
iterator.iterator.End()
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
iterator.End()
|
|
||||||
return iterator.iterator.Last()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Each calls the given function once for each element, passing that element's index and value.
|
|
||||||
func (set *Set) Each(f func(index int, value interface{})) {
|
|
||||||
iterator := set.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
f(iterator.Index(), iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Map invokes the given function once for each element and returns a
|
|
||||||
// container containing the values returned by the given function.
|
|
||||||
func (set *Set) Map(f func(index int, value interface{}) interface{}) *Set {
|
|
||||||
newSet := &Set{tree: rbt.NewWith(set.tree.Comparator)}
|
|
||||||
iterator := set.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
newSet.Add(f(iterator.Index(), iterator.Value()))
|
|
||||||
}
|
|
||||||
return newSet
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select returns a new container containing all elements for which the given function returns a true value.
|
|
||||||
func (set *Set) Select(f func(index int, value interface{}) bool) *Set {
|
|
||||||
newSet := &Set{tree: rbt.NewWith(set.tree.Comparator)}
|
|
||||||
iterator := set.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
newSet.Add(iterator.Value())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return newSet
|
|
||||||
}
|
|
||||||
|
|
||||||
// Any passes each element of the container to the given function and
|
|
||||||
// returns true if the function ever returns true for any element.
|
|
||||||
func (set *Set) Any(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := set.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// All passes each element of the container to the given function and
|
|
||||||
// returns true if the function returns true for all elements.
|
|
||||||
func (set *Set) All(f func(index int, value interface{}) bool) bool {
|
|
||||||
iterator := set.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if !f(iterator.Index(), iterator.Value()) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find passes each element of the container to the given function and returns
|
|
||||||
// the first (index,value) for which the function is true or -1,nil otherwise
|
|
||||||
// if no element matches the criteria.
|
|
||||||
func (set *Set) Find(f func(index int, value interface{}) bool) (int, interface{}) {
|
|
||||||
iterator := set.Iterator()
|
|
||||||
for iterator.Next() {
|
|
||||||
if f(iterator.Index(), iterator.Value()) {
|
|
||||||
return iterator.Index(), iterator.Value()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (set *Set) String() string {
|
func (set *Set) String() string {
|
||||||
str := "TreeSet\n"
|
str := "TreeSet\n"
|
||||||
|
@ -1,20 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) Emir Pasic, All rights reserved.
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
This library is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU Lesser General Public
|
|
||||||
License as published by the Free Software Foundation; either
|
|
||||||
version 3.0 of the License, or (at your option) any later version.
|
|
||||||
|
|
||||||
This library is distributed in the hope that it will be useful,
|
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
||||||
Lesser General Public License for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU Lesser General Public
|
|
||||||
License along with this library. See the file LICENSE included
|
|
||||||
with this distribution for more information.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package treeset
|
package treeset
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package arraystack implements a stack backed by array list.
|
// Package arraystack implements a stack backed by array list.
|
||||||
//
|
//
|
||||||
@ -33,15 +11,13 @@ package arraystack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/lists/arraylist"
|
"github.com/emirpasic/gods/lists/arraylist"
|
||||||
"github.com/emirpasic/gods/stacks"
|
"github.com/emirpasic/gods/stacks"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertStackImplementation() {
|
||||||
var _ stacks.Stack = (*Stack)(nil)
|
var _ stacks.Stack = (*Stack)(nil)
|
||||||
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stack holds elements in an array-list
|
// Stack holds elements in an array-list
|
||||||
@ -98,79 +74,6 @@ func (stack *Stack) Values() []interface{} {
|
|||||||
return elements
|
return elements
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
type Iterator struct {
|
|
||||||
stack *Stack
|
|
||||||
index int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
func (stack *Stack) Iterator() Iterator {
|
|
||||||
return Iterator{stack: stack, index: -1}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.stack.Size() {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
return iterator.stack.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
if iterator.index >= 0 {
|
|
||||||
iterator.index--
|
|
||||||
}
|
|
||||||
return iterator.stack.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
value, _ := iterator.stack.list.Get(iterator.stack.list.Size() - iterator.index - 1) // in reverse (LIFO)
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.index = iterator.stack.Size()
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
iterator.End()
|
|
||||||
return iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (stack *Stack) String() string {
|
func (stack *Stack) String() string {
|
||||||
str := "ArrayStack\n"
|
str := "ArrayStack\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package arraystack
|
package arraystack
|
||||||
|
|
||||||
|
84
stacks/arraystack/iterator.go
Normal file
84
stacks/arraystack/iterator.go
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package arraystack
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
type Iterator struct {
|
||||||
|
stack *Stack
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
func (stack *Stack) Iterator() Iterator {
|
||||||
|
return Iterator{stack: stack, index: -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.stack.Size() {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
return iterator.stack.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
if iterator.index >= 0 {
|
||||||
|
iterator.index--
|
||||||
|
}
|
||||||
|
return iterator.stack.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
value, _ := iterator.stack.list.Get(iterator.stack.list.Size() - iterator.index - 1) // in reverse (LIFO)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.index = iterator.stack.Size()
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
iterator.End()
|
||||||
|
return iterator.Prev()
|
||||||
|
}
|
60
stacks/linkedliststack/iterator.go
Normal file
60
stacks/linkedliststack/iterator.go
Normal file
@ -0,0 +1,60 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package linkedliststack
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.IteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
type Iterator struct {
|
||||||
|
stack *Stack
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
func (stack *Stack) Iterator() Iterator {
|
||||||
|
return Iterator{stack: stack, index: -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.stack.Size() {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
return iterator.stack.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
value, _ := iterator.stack.list.Get(iterator.index) // in reverse (LIFO)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package linkedliststack implements a stack backed by a singly-linked list.
|
// Package linkedliststack implements a stack backed by a singly-linked list.
|
||||||
//
|
//
|
||||||
@ -33,15 +11,13 @@ package linkedliststack
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/lists/singlylinkedlist"
|
"github.com/emirpasic/gods/lists/singlylinkedlist"
|
||||||
"github.com/emirpasic/gods/stacks"
|
"github.com/emirpasic/gods/stacks"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertStackImplementation() {
|
||||||
var _ stacks.Stack = (*Stack)(nil)
|
var _ stacks.Stack = (*Stack)(nil)
|
||||||
var _ containers.IteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Stack holds elements in a singly-linked-list
|
// Stack holds elements in a singly-linked-list
|
||||||
@ -93,55 +69,6 @@ func (stack *Stack) Values() []interface{} {
|
|||||||
return stack.list.Values()
|
return stack.list.Values()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
type Iterator struct {
|
|
||||||
stack *Stack
|
|
||||||
index int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
func (stack *Stack) Iterator() Iterator {
|
|
||||||
return Iterator{stack: stack, index: -1}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.stack.Size() {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
return iterator.stack.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
value, _ := iterator.stack.list.Get(iterator.index) // in reverse (LIFO)
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (stack *Stack) String() string {
|
func (stack *Stack) String() string {
|
||||||
str := "LinkedListStack\n"
|
str := "LinkedListStack\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package linkedliststack
|
package linkedliststack
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package stacks provides an abstract Stack interface.
|
// Package stacks provides an abstract Stack interface.
|
||||||
//
|
//
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package binaryheap implements a binary heap backed by array list.
|
// Package binaryheap implements a binary heap backed by array list.
|
||||||
//
|
//
|
||||||
@ -35,16 +13,14 @@ package binaryheap
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/lists/arraylist"
|
"github.com/emirpasic/gods/lists/arraylist"
|
||||||
"github.com/emirpasic/gods/trees"
|
"github.com/emirpasic/gods/trees"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertTreeImplementation() {
|
||||||
var _ trees.Tree = (*Heap)(nil)
|
var _ trees.Tree = (*Heap)(nil)
|
||||||
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Heap holds elements in an array-list
|
// Heap holds elements in an array-list
|
||||||
@ -114,79 +90,6 @@ func (heap *Heap) Values() []interface{} {
|
|||||||
return heap.list.Values()
|
return heap.list.Values()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
type Iterator struct {
|
|
||||||
heap *Heap
|
|
||||||
index int
|
|
||||||
}
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
|
||||||
func (heap *Heap) Iterator() Iterator {
|
|
||||||
return Iterator{heap: heap, index: -1}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.index < iterator.heap.Size() {
|
|
||||||
iterator.index++
|
|
||||||
}
|
|
||||||
return iterator.heap.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
if iterator.index >= 0 {
|
|
||||||
iterator.index--
|
|
||||||
}
|
|
||||||
return iterator.heap.withinRange(iterator.index)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
value, _ := iterator.heap.list.Get(iterator.index)
|
|
||||||
return value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Index returns the current element's index.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Index() int {
|
|
||||||
return iterator.index
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.index = -1
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.index = iterator.heap.Size()
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
iterator.End()
|
|
||||||
return iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (heap *Heap) String() string {
|
func (heap *Heap) String() string {
|
||||||
str := "BinaryHeap\n"
|
str := "BinaryHeap\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package binaryheap
|
package binaryheap
|
||||||
|
|
||||||
|
84
trees/binaryheap/iterator.go
Normal file
84
trees/binaryheap/iterator.go
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package binaryheap
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithIndex = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
type Iterator struct {
|
||||||
|
heap *Heap
|
||||||
|
index int
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose values can be fetched by an index.
|
||||||
|
func (heap *Heap) Iterator() Iterator {
|
||||||
|
return Iterator{heap: heap, index: -1}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's index and value can be retrieved by Index() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.index < iterator.heap.Size() {
|
||||||
|
iterator.index++
|
||||||
|
}
|
||||||
|
return iterator.heap.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
if iterator.index >= 0 {
|
||||||
|
iterator.index--
|
||||||
|
}
|
||||||
|
return iterator.heap.withinRange(iterator.index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
value, _ := iterator.heap.list.Get(iterator.index)
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Index returns the current element's index.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Index() int {
|
||||||
|
return iterator.index
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.index = -1
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.index = iterator.heap.Size()
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's index and value can be retrieved by Index() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
iterator.End()
|
||||||
|
return iterator.Prev()
|
||||||
|
}
|
156
trees/redblacktree/iterator.go
Normal file
156
trees/redblacktree/iterator.go
Normal file
@ -0,0 +1,156 @@
|
|||||||
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
|
// Use of this source code is governed by a BSD-style
|
||||||
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
|
package redblacktree
|
||||||
|
|
||||||
|
import "github.com/emirpasic/gods/containers"
|
||||||
|
|
||||||
|
func assertIteratorImplementation() {
|
||||||
|
var _ containers.ReverseIteratorWithKey = (*Iterator)(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Iterator holding the iterator's state
|
||||||
|
type Iterator struct {
|
||||||
|
tree *Tree
|
||||||
|
node *Node
|
||||||
|
position position
|
||||||
|
}
|
||||||
|
|
||||||
|
type position byte
|
||||||
|
|
||||||
|
const (
|
||||||
|
begin, between, end position = 0, 1, 2
|
||||||
|
)
|
||||||
|
|
||||||
|
// Iterator returns a stateful iterator whose elements are key/value pairs.
|
||||||
|
func (tree *Tree) Iterator() Iterator {
|
||||||
|
return Iterator{tree: tree, node: nil, position: begin}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
||||||
|
// If Next() returns true, then next element's key and value can be retrieved by Key() and Value().
|
||||||
|
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Next() bool {
|
||||||
|
if iterator.position == end {
|
||||||
|
goto end
|
||||||
|
}
|
||||||
|
if iterator.position == begin {
|
||||||
|
left := iterator.tree.Left()
|
||||||
|
if left == nil {
|
||||||
|
goto end
|
||||||
|
}
|
||||||
|
iterator.node = left
|
||||||
|
goto between
|
||||||
|
}
|
||||||
|
if iterator.node.Right != nil {
|
||||||
|
iterator.node = iterator.node.Right
|
||||||
|
for iterator.node.Left != nil {
|
||||||
|
iterator.node = iterator.node.Left
|
||||||
|
}
|
||||||
|
goto between
|
||||||
|
}
|
||||||
|
if iterator.node.Parent != nil {
|
||||||
|
node := iterator.node
|
||||||
|
for iterator.node.Parent != nil {
|
||||||
|
iterator.node = iterator.node.Parent
|
||||||
|
if iterator.tree.Comparator(node.Key, iterator.node.Key) <= 0 {
|
||||||
|
goto between
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
end:
|
||||||
|
iterator.node = nil
|
||||||
|
iterator.position = end
|
||||||
|
return false
|
||||||
|
|
||||||
|
between:
|
||||||
|
iterator.position = between
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
||||||
|
// If Prev() returns true, then previous element's key and value can be retrieved by Key() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Prev() bool {
|
||||||
|
if iterator.position == begin {
|
||||||
|
goto begin
|
||||||
|
}
|
||||||
|
if iterator.position == end {
|
||||||
|
right := iterator.tree.Right()
|
||||||
|
if right == nil {
|
||||||
|
goto begin
|
||||||
|
}
|
||||||
|
iterator.node = right
|
||||||
|
goto between
|
||||||
|
}
|
||||||
|
if iterator.node.Left != nil {
|
||||||
|
iterator.node = iterator.node.Left
|
||||||
|
for iterator.node.Right != nil {
|
||||||
|
iterator.node = iterator.node.Right
|
||||||
|
}
|
||||||
|
goto between
|
||||||
|
}
|
||||||
|
if iterator.node.Parent != nil {
|
||||||
|
node := iterator.node
|
||||||
|
for iterator.node.Parent != nil {
|
||||||
|
iterator.node = iterator.node.Parent
|
||||||
|
if iterator.tree.Comparator(node.Key, iterator.node.Key) >= 0 {
|
||||||
|
goto between
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
begin:
|
||||||
|
iterator.node = nil
|
||||||
|
iterator.position = begin
|
||||||
|
return false
|
||||||
|
|
||||||
|
between:
|
||||||
|
iterator.position = between
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value returns the current element's value.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Value() interface{} {
|
||||||
|
return iterator.node.Value
|
||||||
|
}
|
||||||
|
|
||||||
|
// Key returns the current element's key.
|
||||||
|
// Does not modify the state of the iterator.
|
||||||
|
func (iterator *Iterator) Key() interface{} {
|
||||||
|
return iterator.node.Key
|
||||||
|
}
|
||||||
|
|
||||||
|
// Begin resets the iterator to its initial state (one-before-first)
|
||||||
|
// Call Next() to fetch the first element if any.
|
||||||
|
func (iterator *Iterator) Begin() {
|
||||||
|
iterator.node = nil
|
||||||
|
iterator.position = begin
|
||||||
|
}
|
||||||
|
|
||||||
|
// End moves the iterator past the last element (one-past-the-end).
|
||||||
|
// Call Prev() to fetch the last element if any.
|
||||||
|
func (iterator *Iterator) End() {
|
||||||
|
iterator.node = nil
|
||||||
|
iterator.position = end
|
||||||
|
}
|
||||||
|
|
||||||
|
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
||||||
|
// If First() returns true, then first element's key and value can be retrieved by Key() and Value().
|
||||||
|
// Modifies the state of the iterator
|
||||||
|
func (iterator *Iterator) First() bool {
|
||||||
|
iterator.Begin()
|
||||||
|
return iterator.Next()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
||||||
|
// If Last() returns true, then last element's key and value can be retrieved by Key() and Value().
|
||||||
|
// Modifies the state of the iterator.
|
||||||
|
func (iterator *Iterator) Last() bool {
|
||||||
|
iterator.End()
|
||||||
|
return iterator.Prev()
|
||||||
|
}
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package redblacktree implements a red-black tree.
|
// Package redblacktree implements a red-black tree.
|
||||||
//
|
//
|
||||||
@ -35,15 +13,13 @@ package redblacktree
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/emirpasic/gods/containers"
|
|
||||||
"github.com/emirpasic/gods/stacks/linkedliststack"
|
"github.com/emirpasic/gods/stacks/linkedliststack"
|
||||||
"github.com/emirpasic/gods/trees"
|
"github.com/emirpasic/gods/trees"
|
||||||
"github.com/emirpasic/gods/utils"
|
"github.com/emirpasic/gods/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
func assertInterfaceImplementation() {
|
func assertTreeImplementation() {
|
||||||
var _ trees.Tree = (*Tree)(nil)
|
var _ trees.Tree = (*Tree)(nil)
|
||||||
var _ containers.ReverseIteratorWithKey = (*Iterator)(nil)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type color bool
|
type color bool
|
||||||
@ -278,151 +254,6 @@ func (tree *Tree) Clear() {
|
|||||||
tree.size = 0
|
tree.size = 0
|
||||||
}
|
}
|
||||||
|
|
||||||
// Iterator holding the iterator's state
|
|
||||||
type Iterator struct {
|
|
||||||
tree *Tree
|
|
||||||
node *Node
|
|
||||||
position position
|
|
||||||
}
|
|
||||||
|
|
||||||
type position byte
|
|
||||||
|
|
||||||
const (
|
|
||||||
begin, between, end position = 0, 1, 2
|
|
||||||
)
|
|
||||||
|
|
||||||
// Iterator returns a stateful iterator whose elements are key/value pairs.
|
|
||||||
func (tree *Tree) Iterator() Iterator {
|
|
||||||
return Iterator{tree: tree, node: nil, position: begin}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Next moves the iterator to the next element and returns true if there was a next element in the container.
|
|
||||||
// If Next() returns true, then next element's key and value can be retrieved by Key() and Value().
|
|
||||||
// If Next() was called for the first time, then it will point the iterator to the first element if it exists.
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Next() bool {
|
|
||||||
if iterator.position == end {
|
|
||||||
goto end
|
|
||||||
}
|
|
||||||
if iterator.position == begin {
|
|
||||||
left := iterator.tree.Left()
|
|
||||||
if left == nil {
|
|
||||||
goto end
|
|
||||||
}
|
|
||||||
iterator.node = left
|
|
||||||
goto between
|
|
||||||
}
|
|
||||||
if iterator.node.Right != nil {
|
|
||||||
iterator.node = iterator.node.Right
|
|
||||||
for iterator.node.Left != nil {
|
|
||||||
iterator.node = iterator.node.Left
|
|
||||||
}
|
|
||||||
goto between
|
|
||||||
}
|
|
||||||
if iterator.node.Parent != nil {
|
|
||||||
node := iterator.node
|
|
||||||
for iterator.node.Parent != nil {
|
|
||||||
iterator.node = iterator.node.Parent
|
|
||||||
if iterator.tree.Comparator(node.Key, iterator.node.Key) <= 0 {
|
|
||||||
goto between
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
end:
|
|
||||||
iterator.node = nil
|
|
||||||
iterator.position = end
|
|
||||||
return false
|
|
||||||
|
|
||||||
between:
|
|
||||||
iterator.position = between
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Prev moves the iterator to the previous element and returns true if there was a previous element in the container.
|
|
||||||
// If Prev() returns true, then previous element's key and value can be retrieved by Key() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Prev() bool {
|
|
||||||
if iterator.position == begin {
|
|
||||||
goto begin
|
|
||||||
}
|
|
||||||
if iterator.position == end {
|
|
||||||
right := iterator.tree.Right()
|
|
||||||
if right == nil {
|
|
||||||
goto begin
|
|
||||||
}
|
|
||||||
iterator.node = right
|
|
||||||
goto between
|
|
||||||
}
|
|
||||||
if iterator.node.Left != nil {
|
|
||||||
iterator.node = iterator.node.Left
|
|
||||||
for iterator.node.Right != nil {
|
|
||||||
iterator.node = iterator.node.Right
|
|
||||||
}
|
|
||||||
goto between
|
|
||||||
}
|
|
||||||
if iterator.node.Parent != nil {
|
|
||||||
node := iterator.node
|
|
||||||
for iterator.node.Parent != nil {
|
|
||||||
iterator.node = iterator.node.Parent
|
|
||||||
if iterator.tree.Comparator(node.Key, iterator.node.Key) >= 0 {
|
|
||||||
goto between
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
begin:
|
|
||||||
iterator.node = nil
|
|
||||||
iterator.position = begin
|
|
||||||
return false
|
|
||||||
|
|
||||||
between:
|
|
||||||
iterator.position = between
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Value returns the current element's value.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Value() interface{} {
|
|
||||||
return iterator.node.Value
|
|
||||||
}
|
|
||||||
|
|
||||||
// Key returns the current element's key.
|
|
||||||
// Does not modify the state of the iterator.
|
|
||||||
func (iterator *Iterator) Key() interface{} {
|
|
||||||
return iterator.node.Key
|
|
||||||
}
|
|
||||||
|
|
||||||
// Begin resets the iterator to its initial state (one-before-first)
|
|
||||||
// Call Next() to fetch the first element if any.
|
|
||||||
func (iterator *Iterator) Begin() {
|
|
||||||
iterator.node = nil
|
|
||||||
iterator.position = begin
|
|
||||||
}
|
|
||||||
|
|
||||||
// End moves the iterator past the last element (one-past-the-end).
|
|
||||||
// Call Prev() to fetch the last element if any.
|
|
||||||
func (iterator *Iterator) End() {
|
|
||||||
iterator.node = nil
|
|
||||||
iterator.position = end
|
|
||||||
}
|
|
||||||
|
|
||||||
// First moves the iterator to the first element and returns true if there was a first element in the container.
|
|
||||||
// If First() returns true, then first element's key and value can be retrieved by Key() and Value().
|
|
||||||
// Modifies the state of the iterator
|
|
||||||
func (iterator *Iterator) First() bool {
|
|
||||||
iterator.Begin()
|
|
||||||
return iterator.Next()
|
|
||||||
}
|
|
||||||
|
|
||||||
// Last moves the iterator to the last element and returns true if there was a last element in the container.
|
|
||||||
// If Last() returns true, then last element's key and value can be retrieved by Key() and Value().
|
|
||||||
// Modifies the state of the iterator.
|
|
||||||
func (iterator *Iterator) Last() bool {
|
|
||||||
iterator.End()
|
|
||||||
return iterator.Prev()
|
|
||||||
}
|
|
||||||
|
|
||||||
// String returns a string representation of container
|
// String returns a string representation of container
|
||||||
func (tree *Tree) String() string {
|
func (tree *Tree) String() string {
|
||||||
str := "RedBlackTree\n"
|
str := "RedBlackTree\n"
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package redblacktree
|
package redblacktree
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package trees provides an abstract Tree interface.
|
// Package trees provides an abstract Tree interface.
|
||||||
//
|
//
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package utils
|
package utils
|
||||||
|
|
||||||
|
@ -1,28 +1,6 @@
|
|||||||
/*
|
// Copyright (c) 2015, Emir Pasic. All rights reserved.
|
||||||
Copyright (c) 2015, Emir Pasic
|
// Use of this source code is governed by a BSD-style
|
||||||
All rights reserved.
|
// license that can be found in the LICENSE file.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer.
|
|
||||||
|
|
||||||
* Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
this list of conditions and the following disclaimer in the documentation
|
|
||||||
and/or other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
||||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
||||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
||||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
||||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
||||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
||||||
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
||||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Package utils provides common utility functions.
|
// Package utils provides common utility functions.
|
||||||
//
|
//
|
||||||
|
Loading…
Reference in New Issue
Block a user