рд╕реАред рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ! рд╢реБрджреНрдз C. рдореЗрдВ рдирд╣реАрдВ C ++

рдХреНрдпреЛрдВ?


рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдореЗрдВ рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдХреЗрд╡рд▓ рдПрдХ-рджреВрд╕рд░реЗ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреЗ рд╣реИрдВ (рдФрд░, рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдХрд╛рд░ рдирд╛рдо рд╣реИ)ред рдЦреИрд░, рдпрд╣рд╛рдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд░рдгрд┐рдпреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреА рд░рд╛рд╢рд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ (рд╕рд░рд▓реАрдХрд░рдг рдХреА рдЦрд╛рддрд┐рд░, рдЕрд╕рдорд╛рдирддрд╛ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЪреЗрдХ рдХреЛ рд╢реВрдиреНрдп / * рдкрд░ рдЫреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓реАрдХрд░рдг рдХреЛ рднреА рдирд╣реАрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рд▓рдЧрднрдЧред

void sum_float(int n, float *a, float *b) { /* computes a:=a+b where a and b are two arrays of length n */ int i; for(i=0;i<n;i++) a[i]+=b[i]; } void sum_double(int n, double *a, double *b) { /* computes a:=a+b where a and b are two arrays of length n */ int i; for(i=0;i<n;i++) a[i]+=b[i]; } void sum_int(int n, int *a, int *b) { /* computes a:=a+b where a and b are two arrays of length n */ int i; for(i=0;i<n;i++) a[i]+=b[i]; } 

рдареАрдХ рд╣реИ, рд╕рд╣рдордд рд╣реИрдВ, рдПрдХ рдмрд╛рд░ рдПрдХ "рдкреИрд░рд╛рдореАрдЯрд░" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд (рдФрд░ рд▓реМрдЯрдиреЗ) рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП рдПрдХ рдмрд╛рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛, рдФрд░ рдлрд┐рд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛? рдФрд░ рдпреЗ рдХрд╛рд░реНрдп рдЕрднреА рднреА рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╡реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдереЗ, рдФрд░ рдЙрдирдХрд╛ рд╕реЗрдЯ - рдЕрдзрд┐рдХред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП C ++ рдореЗрдВ рдПрдХ рдХреАрд╡рд░реНрдб рдЯреЗрдореНрдкреНрд▓реЗрдЯ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдлрд╕реЛрд╕, рд╢реБрджреНрдз рд╕реА рдореЗрдВ рдирд╣реАрдВред

рдЕрдм рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрднреА-рдХрднреА рдЗрд╕ рдХреАрд╡рд░реНрдб рдХреЛ C рдХреЗ рдкреБрд░рд╛рдиреЗ рдкреБрд░рд╛рдиреЗ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрдХрд░рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕реА рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯред


рд╣рдореЗрдВ рдХреБрдЫ рдЕрд╡рдпрд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

1: рдмрд┐рд▓реНрдЯ

рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╡реЗ рдПрдХ рдЕрд▓рдЧ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реЛрдВрдЧреЗ, рдФрд░ рд╣рдореЗрдВ рдЕрднреА рднреА рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдЕрд▓рдЧ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ "рдЯреЗрдореНрдкрд▓реЗрдЯреНрд╕.рдПрдЪ" рдХрд╣рддреЗ рд╣реИрдВред

templates.h
 #ifndef TEMPLATES_H_ #define TEMPLATES_H_ #define CAT(X,Y) X##_##Y #define TEMPLATE(X,Y) CAT(X,Y) #endif 

рд╣рдореЗрдВ X_Y рдХреЗ рд░реВрдк рдореЗрдВ X рдФрд░ Y рдХреА рдореИрдХреНрд░реЛ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЯреЗрдореНрдкрд▓реЗрдЯ рдореИрдХреНрд░реЛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рддрд╛рдХрд┐ TEMPLATE (рдлрд╝рдВрдХреНрд╢рди, рдкреНрд░рдХрд╛рд░) рд▓рд┐рдЦрдХрд░ рд╣рдореЗрдВ рдЗрд╕ рд╕реНрдерд╛рди рдкрд░ function_type рдкреНрд░рд╛рдкреНрдд рд╣реЛред

рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рд╕реА рдореЗрдВ, рдирд┐рд░реНрджреЗрд╢ ## рдЖрдкрдХреЛ рджреЛ рдЯреЛрдХрди рдХреЛ рдПрдХ рдореЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ #define TEMPLATE (X, Y) X ## Y рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдпрд╣рд╛рдВ рджреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ X, рдмрджрд▓реЗ рдореЗрдВ, рдПрдХ рд╕реНрдереВрд▓ рдкрд░рд┐рднрд╛рд╖рд╛ рднреА рд╣реЛрдЧрд╛ ... рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдкреНрд░рд╢реНрди рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╣реИред

2: рдЦрд╛рдирд╛ рдмрдирд╛рдирд╛

рдХрд┐рд╕реА рднреА рд╕рд╛рдорд╛рдиреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХреНрд╕рдЯреЗрдВрд╢рди .c рдХреЗ рд╕рд╛рде рдлрд╛рдЗрд▓ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХреЛ .h рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣реИ рдирд╛? рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЙрдиреНрд╣реЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд┐рдЦреЗрдВред рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рдХрд╛рд░, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╣реИ, рдХреЗ рдЕрдиреБрд░реВрдк рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд┐рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдкрд╛рд░рдВрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ "T" рдЕрдХреНрд╖рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЖрдк рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ #define рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рдорд┐рд▓реЗрдВрдЧреЗред

sum_as_template.h
 #ifdef T #include "templates.h" void TEMPLATE(sum,T)(int n, T *a, T *b); #endif 

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЖрдк рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦ рдЪреБрдХреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ #ifndef HEADER_H #define HEADER_H ... #endif рдХреЗ рдмрд╛рд░-рдмрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбрд┐рдЬрд╝рд╛рдЗрди рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрд╣ рдХреЛрдИ рджреБрд░реНрдШрдЯрдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЗрд╕ рдХреНрд╖рдг рдореЗрдВ рд▓реМрдЯ рдЖрдПрдВрдЧреЗред рджреВрд╕рд░реА рдУрд░ #Ifdef T рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рд╣реЗрдбрд░ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдФрд░ рдкреНрд░рдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЕрдиреНрдпрдерд╛, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдмрд╣реБрдд рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдм рд╕реА

sum_as_template.c
 #ifdef T #include "templates.h" void TEMPLATE(sum,T) (int n, T *a, T *b) { /* computes a:=a+b where a and b are two arrays of length n */ int i; for(i=0;i<n;i++) a[i]+=b[i]; } #endif 


3. рд╣рдо рд╕реЗрд╡рд╛ рдХрд░рддреЗ рд╣реИрдВред

рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдХрд┐рддрдиреА рд▓рд╛рдЗрдиреЗрдВ рд▓рд┐рдЦреА рдереАрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рд░рд╛рдВрд╢ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ 3. рдпрд╛ 4 рд╕реЗ рдЧреБрдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

all_possible_sums.c
 #include "templates.h" #include "all_possible_sums.h" #ifdef T #undef T #endif #define T float #include "sum_as_template.c" #ifdef T #undef T #endif #define T double #include "sum_as_template.c" #ifdef T #undef T #endif #define T int #include "sum_as_template.c" 


рдЬреАрд╡рди рдореЗрдВ рдЫреЛрдЯреА рдЪреАрдЬреЗрдВ: GCC 3 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд▓рд┐рдП #ifdef T #undef T #endif рдХреЛ рдПрдХ #undef T рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдВ рд╡рд┐рдЬрд╝реБрдЕрд▓ C ++ (рдХрдо рд╕реЗ рдХрдо рд╕рдВрд╕реНрдХрд░рдг 7 рд╕рдорд╛рд╡реЗрд╢реА рддрдХ, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдХреА рд╕реНрд╡рддрдВрддреНрд░рддрд╛ рдХреЛ рдмрд░реНрджрд╛рд╢реНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ)

рдЦреИрд░, рдФрд░ Hiiiiiiiiid!

all_possible_sums.h
 #ifndef ALL_POSSIBLE_SUMS_H_ #define ALL_POSSIBLE_SUMS_H_ #include "templates.h" #ifdef T #undef T #endif #define T float #include "sum_as_template.h" #ifdef T #undef T #endif #define T double #include "sum_as_template.h" #ifdef T #undef T #endif #define T int #include "sum_as_template.h" #endif 


рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╣рдордиреЗ рдХрд┐рддрдиреЗ рдпреЛрдЧреЛрдВ рд╕реЗ sum_as_template.h рдХреА рд░рдХреНрд╖рд╛ рдирд╣реАрдВ рдХреА: рд╣рдо рдЗрд╕реЗ рдПрдХ рдмрд╛рд░ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред

4. рдкрд░реЛрд╕реЗрдВ

рдЦреИрд░, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╕рдм рд╣реИред рдЖрдк рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

main.c
 #include "all_possible_sums.h" int main(int argc, char **argv) { int ai[3] = {1,2,3}; int bi[3] = {4,5,6}; float af[3] = {1.0,2.0,3.0}; float bf[3] = {1.5,2.5,3.5}; TEMPLATE(sum,int)(3,ai,bi); TEMPLATE(sum,float)(3,af,bf); return 0; } 



рдФрд░ рдПрдХ рдмрд╛рддред

рдПрдХ рдЬрд┐рдЬреНрдЮрд╛рд╕реБ рдкрд╛рдардХ рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ рдкреВрдЫреЗрдЧрд╛, рдЕрдЧрд░ рдореБрдЭреЗ "рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреЗ рд╕рдордп" рдкреНрд░рдХрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдлрд╝рдВрдХреНрд╢рди "рд╢реВрдиреНрдп рд░рд╛рд╢рд┐_ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рд▓рдВрдмреЗ ()" рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдЕрдиреБрд╡рд╛рджрдХ рдХреЗ рд▓рд┐рдП, рд▓реЗрдЦрдХ рдиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рднреА рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ред рдЯрдВрдХрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 typedef unsigned long long uint64; TEMPLATE(sum,uint64) 


рдХреЗ рдмрдЬрд╛рдп
 TEMPLATE(sum,unsigned long long) 



(рдпрд╣ рдХрд╛рдлреА рдореБрдлреНрдд рдЕрдиреБрд╡рд╛рдж рд╣реИ ред рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрд▓рд╕реА рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ Google рдХреЛ рд╕рд╛рджреЗ рд╕реА рдкреНрд░рд╢реНрди рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрддреНрддрд░ рдкрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЙрд╕ рд▓реЗрдЦ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЙрддреНрддрд░ рд╣рдм рдкрд░ рдФрд░ рд░реВрд╕реА-рднрд╛рд╖реА рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рдЧрд╛рдпрдм, рдкреЛрд╕реНрдЯрдорд╛рд░реНрдЯрдо рдкреНрд░рдХрд╛рд╢рд┐рдд)

- 8 <- [рдореВрд▓ рдкреЛрд╕реНрдЯ рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдИ] -

UPD: рдореИрдВ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рддреЗ рд╕рдордп, рдЖрдВрдЦ рд╕реЗ рдХрдо рд╕реЗ рдХрдо 4 рдкрд╣рдЪрд╛рди рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП GRAFIN99 habrayuzer рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рдзрдиреНрдпрд╡рд╛рдж рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

Source: https://habr.com/ru/post/In154811/


All Articles