purebasic.info

PureBasic forum
Текущее время: Чт май 24, 2018 10:44 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ 1 сообщение ] 
Автор Сообщение
СообщениеДобавлено: Чт мар 10, 2016 5:32 am 
Не в сети
профессор

Зарегистрирован: Чт сен 22, 2011 6:21 pm
Сообщений: 229
Благодарил (а): 31 раз.
Поблагодарили: 22 раз.
Пункты репутации: 0
По мотивам: http://forum.purebasic.com/english/view ... 12&t=64954
Подключение процедур по требованию, из библиотеки процедур (в .pbi файле),
неиспользуемые процедуры не компилируются и не увеличивают размера выходного файла.
В качестве дополнительной фичи: можно переназначать "родные" PB команды (на свои процедуры).
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
;*********************************
; FileName: IncludeOnDemandCope.pbi
; Author:   void
; Compiler: PB542
; Ver:      001
;
; По мотивам: http://forum.purebasic.com/english/viewtopic.php?f=12&t=64954
; Подключение процедур по требованию, из библиотеки процедур в .pbi файле
; (неиспользуемые процедуры не компилируются и не увеличивают размера выходного файла)
; Фичи:
; 1) Корректно работает со всеми типами параметнров, в том числе опциональными.
; 2) Позволяет переназначать нативные PB команды.
; Ограничения:
; 1) Невозможно использовать для модуля, только для свободных процедур.
; (продекларировав процедуру в DeclareModule, ее нельзя вырезать в самом модуле - ошибка компиляции)
; 2) Вызываемая процедура должна быть последней в строке, связано с макросом подмены.
; Debug 1 + ProcName(1,2) ;так будет работать
; Debug ProcName(1,2) + 1 ;а так будет ошибка
;*********************************
;- Docs
;{ Docs
; Шаблон файла библиотек процедур (MyLib.pbi)
;*********************************
;XIncludeFile "IncludeOnDemandCore.pbi"
;;{ подключается при первом включении
;CompilerIf IsFirstStep(ModuleName)
; ;декларации:
; Declaration ProcName(a1,a2=0)
; ;макросы подмен (параметры должны называться именно так: p1,p2...)
; Override2(Prefix,ProcName,p1,p2=0)
;CompilerEndIf
;;}
;;{ подключается при втором включении
;CompilerIf IsSecondStep(ModuleName)
;  ;тела процедур
;  CompilerIf IsUse(PrefixProcName)
;    Procedure PrefixProcName(a1,a2=0)
;      ...
;    EndProcedure  
;  CompilerEndIf
;  
;CompilerEndIf
;;}
;EndOfInclude(ModuleName)
;
;*********************************
;;шаблон файла в котором используется библиотека процедур (Main.pb)
;*********************************
;;первая вставка в самом начале файла (именно "IncludeFile", не "XIncludeFile")
;;будут вставлены только декларации и макросы подмен
;IncludeFile "MyLib.pbi"
;
; ;вызываем процедуру
; Debug ProcName(1,2)
;
;
;;второе включение в самом конце файла
;;будут вставлены только тела процедур
;;(только тех, что были использованы в основном теле)
;IncludeFile "MyLib.pbi"
;*********************************
;}
 
;- Macroses
;{ Macroses
 
Macro MacroColon
  :
EndMacro
 
;макросы подмен, под разное число параметров
Macro Override0(Prefix,ProcName,Blank=)
  Blank#Macro ProcName ()
  Prefix#ProcName ()
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override1(Prefix,ProcName,p1,Blank=)
  Blank#Macro ProcName (p1)
  Prefix#ProcName (p#Blank#1)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override2(Prefix,ProcName,p1,p2,Blank=)
  Blank#Macro ProcName (p1,p2)
  Prefix#ProcName (p#Blank#1,p#Blank#2)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override3(Prefix,ProcName,p1,p2,p3,Blank=)
  Blank#Macro ProcName (p1,p2,p3)
  Prefix#ProcName (p#Blank#1,p#Blank#2,p#Blank#3)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override4(Prefix,ProcName,p1,p2,p3,p4,Blank=)
  Blank#Macro ProcName (p1,p2,p3,p4)
  Prefix#ProcName (p#Blank#1,p#Blank#2,p#Blank#3,p#Blank#4)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override5(Prefix,ProcName,p1,p2,p3,p4,p5,Blank=)
  Blank#Macro ProcName (p1,p2,p3,p4,p5)
  Prefix#ProcName (p#Blank#1,p#Blank#2,p#Blank#3,p#Blank#4,p#Blank#5)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override6(Prefix,ProcName,p1,p2,p3,p4,p5,p6,Blank=)
  Blank#Macro ProcName (p1,p2,p3,p4,p5,p6)
  Prefix#ProcName (p#Blank#1,p#Blank#2,p#Blank#3,p#Blank#4,p#Blank#5,p#Blank#6)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override7(Prefix,ProcName,p1,p2,p3,p4,p5,p6,p7,Blank=)
  Blank#Macro ProcName (p1,p2,p3,p4,p5,p6,p7)
  Prefix#ProcName (p#Blank#1,p#Blank#2,p#Blank#3,p#Blank#4,p#Blank#5,p#Blank#6,p#Blank#7)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
Macro Override8(Prefix,ProcName,p1,p2,p3,p4,p5,p6,p7,p8,Blank=)
  Blank#Macro ProcName (p1,p2,p3,p4,p5,p6,p7,p8)
  Prefix#ProcName (p#Blank#1,p#Blank#2,p#Blank#3,p#Blank#4,p#Blank#5,p#Blank#6,p#Blank#7,p#Blank#8)
  #IncludeUsed_#Prefix#ProcName = #True
  MacroColon Blank#EndMacro MacroColon
EndMacro
 
;макрос отмены макроса подмены
Macro UnOverride(_Name1, _Name2, _Blank=)
  _Blank#UndefineMacro _Blank#_Name1#_Name2 MacroColon
EndMacro
 
Macro IsUse(ProcName)
  Defined(IncludeUsed_#ProcName,#PB_Constant)
EndMacro
 
Macro IsFirstStep(ModuleName)
  Not Defined(IncludeUsed_#ModuleName, #PB_Constant) Or #PB_Compiler_IsMainFile
EndMacro
 
Macro IsSecondStep(ModuleName)
  Defined(IncludeUsed_#ModuleName, #PB_Constant) Or #PB_Compiler_IsMainFile
EndMacro
 
Macro EndOfInclude(ModuleName)
  #IncludeUsed_#ModuleName = #True
EndMacro
 
;}
 
 
;- Test
;{ Test
CompilerIf #PB_Compiler_IsMainFile
 
  Declare _Min(Val1, Val2=0)
  Override2(_,Min,p1,p2=0)
 
  Debug Min(15, 20)
  Debug Min(-15)
 
  UnOverride(M,in)  ;отменяем макрос Min
  ;Debug Min(-15)   ;будет ошибка, процедура не найдена
 
  CompilerIf IsUse(_Min)
    Procedure _Min (Val1, Val2=0)
      If Val1 < Val2
        ProcedureReturn Val1
      EndIf
      ProcedureReturn Val2
    EndProcedure
  CompilerEndIf
 
CompilerEndIf
;}



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ 1 сообщение ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB