Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C/C++ 팁&트릭
[34] [Boost]array 컨테이너(2): array.hpp 구현 코드 전부입니다.
김백일 [cedar] 7641 읽음    2002-07-29 12:35
array.hpp 5.7KB Boost 라이브러리 전체를 설치하실 필요없이 이것만 인클루드해도 됩니다.
array.hpp


boost::array 클래스는 단순히 C 배열에
STL 컨테이너로서의 인터페이스만 추가한 것입니다.

그래서 구현 코드인 array.hpp도 상당히 간단합니다.
주석 포함해서 162라인이군요.

전체 코드를 다 올립니다.
사용자 정의 STL 컨테이너를 만들고 싶으신 분은 이 코드를 참고하시면
많은 도움이 되실 겁니다.
또한 array의 기능만 필요하고, Boost 라이브러리 전체를 설치하지 않으실 분은
이 파일을 적당히 수정하신 후, 인클루드하시면 됩니다.

array.hpp

/* The following code declares class array,
 
* an STL container (as wrapper) for arrays of constant size.
 
*
 
* See
 
*      http://www.josuttis.com/cppcode
 
* for details and the latest version.
 
*
 
* (C) Copyright Nicolai M. Josuttis 2001.
 
* Permission to copy, use, modify, sell and distribute this software
 
* is granted provided this copyright notice appears in all copies.
 
* This software is provided "as is" without express or implied
 
* warranty, and with no claim as to its suitability for any purpose.
 
*
 
* Aug 05, 2001
 
*/
#ifndef BOOST_ARRAY_HPP
#define BOOST_ARRAY_HPP

#include < cstddef >
#include < stdexcept >
#include < iterator >
#include < algorithm >

// FIXES for broken compilers
#include < boost/config.hpp >

namespace boost {

    template < class T, std::size_t N >
    class array {
      public:
        T elems[N];    
// fixed-size array of elements of type T

      public:
        
// type definitions
        typedef T              value_type;
        typedef T*             iterator;
        typedef const T*       const_iterator;
        typedef T&             reference;
        typedef const T&       const_reference;
        typedef std::size_t    size_type;
        typedef std::ptrdiff_t difference_type;
    
        
// iterator support
        iterator begin() { return elems; }
        const_iterator begin() const { return elems; }
        iterator end() { return elems+N; }
        const_iterator end() const { return elems+N; }

        
// reverse iterator support
#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !defined(BOOST_MSVC_STD_ITERATOR)
        typedef std::reverse_iterator reverse_iterator;
        typedef std::reverse_iterator const_reverse_iterator;
#else
        
// workaround for broken reverse_iterator implementations
        typedef std::reverse_iterator reverse_iterator;
        typedef std::reverse_iterator const_reverse_iterator;
#endif

        reverse_iterator rbegin() { return reverse_iterator(end()); }
        const_reverse_iterator rbegin() const {
            return const_reverse_iterator(end());
        }
        reverse_iterator rend() { return reverse_iterator(begin()); }
        const_reverse_iterator rend() const {
            return const_reverse_iterator(begin());
        }

        
// operator[]
        reference operator[](size_type i) { return elems[i]; }
        const_reference operator[](size_type i) const { return elems[i]; }

        
// at() with range check
        reference at(size_type i) { rangecheck(i); return elems[i]; }
        const_reference at(size_type i) const { rangecheck(i); return elems[i]; }
    
        
// front() and back()
        reference front() { return elems[0]; }
        const_reference front() const { return elems[0]; }
        reference back() { return elems[N-1]; }
        const_reference back() const { return elems[N-1]; }

        
// size is constant
        static size_type size() { return N; }
        static bool empty() { return false; }
        static size_type max_size() { return N; }
        enum { static_size = N };

        
// swap (note: linear complexity)
        void swap (array< T, N >& y) {
            std::swap_ranges(begin(),end(),y.begin());
        }

        
// direct access to data
        const T* data() const { return elems; }

        
// assignment with type conversion
        template < typename T2 >
        array< T, N >& operator= (const array< T2, N >& rhs) {
            std::copy(rhs.begin(), rhs.end(), begin());
            return *this;
        }

        
// assign one value to all elements
        void assign (const T& value)
        {
            std::fill_n(begin(), size(), value);
        }

#ifndef BOOST_NO_PRIVATE_IN_AGGREGATE
      private:
#endif
        
// check range (may be private because it is static)
        static void rangecheck (size_type i) {
            if (i >= size()) { throw std::range_error("array"); }
        }

    };

    
// comparisons
    template < class T, std::size_t N >
    bool operator== (const array& x, const array& y) {
        return std::equal(x.begin(), x.end(), y.begin());
    }
    template < class T, std::size_t N >
    bool operator< (const array& x, const array& y) {
        return std::lexicographical_compare(x.begin(), x.end(), y.begin(), y.end());
    }
    template < class T, std::size_t N >
    bool operator!= (const array& x, const array& y) {
        return !(x == y);
    }
template < class T, std::size_t N >
    bool operator> (const array& x, const array& y) {
        return y < x;
    }
template < class T, std::size_t N >
    bool operator<= (const array& x, const array& y) {
        return !(y < x);
    }
template < class T, std::size_t N >
    bool operator>= (const array& x, const array& y) {
        return !(x < y);
    }

    
// global swap()
template < class T, std::size_t N >
    inline void swap (array& x, array& y) {
        x.swap(y);
    }

/* namespace boost */

#endif 
/*BOOST_ARRAY_HPP*/

김백일.cedar [cedar]   2002-07-29 22:33 X
html로 코드를 입력하다보니, '<'과 '>'입력 문제가 있더군요.
김백일.cedar [cedar]   2002-07-29 22:35 X
할 수 없이 '<'과 '>' 사이에 공백을 두었습니다.

+ -

관련 글 리스트
34 [Boost]array 컨테이너(2): array.hpp 구현 코드 전부입니다. 김백일 7641 2002/07/29
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.