ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Crow 분석
    공부/오픈소스 분석 2015. 4. 8. 23:20

    crow

    현재 수정 진행중인 문서입니다!

    목차

    • routing
      • Compile time
      • Run time
    • Middleware
    • 서버구조
    • black_magic

    https://www.youtube.com/watch?v=MixS9c3mE6U 참고 자료


    Routing

    Sample Code about rout

    int main()
    {
        CROW_ROUTE(app, "/");
        //이런식으로 폴더를 지정
        //python의 플라스크에 영향을 받음, 컴파일 시간에 핸들러 타입 체크
    }
    
    • crow_route구조
      app.route<get_parameter_tag(url)>(url);
      
      핸들러 형태 체크 -> 컴파일 타임 -> 템플릿 인자
      실행 중에 url체크 -> 런타임 -> 함수 인자
    • Url->Routing Rule
      get_parameter_tag("/<int>/<int>") //인자를 받고
      -> arguments<11>                  //인자 타입에 맞는 6진수로 변환
      -> S<int, int>                    //6진수에서 다시 타입으로 변환
      -> TaggedRule<int, int>           //S에서 TaggedRule로 rebind
      
    • get_parameter_tag
      URL 스트링을 받아 인자 정보를 가지는 6진수로 표현
      0 : <>(empty), 1 : int, 3 : double, 4 : string , 5 : string(path)
      E.g.
        13 -> <double, int>
        4  -> <string>
        5  -> <string>
      

    black_magic

    black_maginc::S<T..>
    tuple자료형을 쓸 수도 있었지만 variadic templates으로 타입 리스트 구현
    S<int, double, string> 같은 자료형이 가능하다
    S<a, b>::push(c) === S&<c, a, b> 자료형에 새로운 타입 추가,
    S<a>::push_back<b> === S<a,b> push_back을 이용해 맨 뒤에 타입추가,
    S<a, b, c>::rebind<Rule> === Rule<a,b,c> S를 이용해 Rule을 리바인드 시켜줌
    다음과 같은 구현이 가능함
    crow_all.h in line 5515

    • push 구현
      S<a, b>::push(c) === S<c, a, b>와 같은 상황 일 때
        template<typename ... T> //여러개의 인자를 받는 T(여기서는 a, b)
        struct S{
            template<typename U>
            using push = S<U, T...>;    
            //variadic tempalte인자 T...앞에 U를 넣음
        }
      
    • rebind 구현
      S<a, b, c>::rebind<Rule> == Rule<a,b,c>와 같은 상황 일 때

        template
        <template <typename ...> class U> //
        using rebind = U<T...>;
      
        //S<...>같은 템플릿을 U<...>으로 바꾸고 싶을 때
        //variaic template인 class U는 typename ...을 받고
        //S의 T...을 U<T...>으로 바인드 시킨다
      

    black_magic::argument<uint64_t>

    • argument 구현

      template<uint64_t Tag> struct arguments {
      using subarg = typename arguments<Tag/6>::type;
      using type = 
      typename subargs::template push<typename single_tag_to_type<Tag%6>::type>;
      };
      //들어오는 인자에 대해
      
    • single_tag_to_type 구현

      template<int N>
      struct single_tag_to_type{};
      template<>
      struct single_tag_to_type<1>{
        using type = int64_t;
      };
      //type이 1로 들어올 때에 대한 특수화
      template<>
      struct argument<0> {
        using type = s<>;
      }
      //type이 0으로 들어올 때에 대한 특수화
      //not c++11 but usefull
      

      Partial template specialization
      해석하면 부분적 템플릿 특수화 정도? 특정한 경우(template인자로 특정 값이 들어올 경우) 특수화를 별도로 시켜줌


    사용된 C++11

    • Const expr example

      constexpr int fact(int n)
      {
        return (n < =1)            
        ? 1 : fact(n-1)*n;
      }
      //c++11 new feature constexpr 컴파일 타임에 계산할 수 있는걸 계산함
      int main()
      {
        char arr[fact(5)];
        //5! 개의 배열이 만들어진다.
        //컴파일 타임에 알 수 있음
      }
      
    • using이 많이 나와서 EMC++ 참조

      //in c++98 use typedef
      typedef
      std::unique_ptr<std::unordered_map<std::string, std::string>>
      UPtrMapSS;
      //alias declarations in EMC++ item9
      //in c++11 use using
      using UPtrMapSS =
      std::unique_ptr<std::unordered_map<std::string, std::string>>;
      //거의 같은거라고 보면 되지만 typedef는 templatization을 지원을 안한다
      //하지만 alias declatation을 이용할 경우 templatization은 지원한다
      


    '공부 > 오픈소스 분석' 카테고리의 다른 글

    마이크로소프트의 ChakraCore과 node js  (1) 2016.01.19
    Crow 분석  (0) 2015.04.08

    댓글 0

Designed by Tistory.