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

WRITTEN BY
Jen6
jen6의 개발, 보안 블로그 까끔가다 쓸대 있는걸 올리려고 노력중

트랙백  0 , 댓글  0개가 달렸습니다.
secret